20240108期:如何开发二维地图页面,以supermap地图页面开发为例

在开发二维地图页面之前,首先需要配置开发环境并安装必要的工具,如Node.js和npm。使用SuperMapiClientforJavaScript作为开发工具,可以方便地在网页中嵌入地图。创建一个新的项目目录,并通过npm安装所需的依赖包。接着,编写HTML文件作为地图展示的基础模板,并创建main.js文件用于初始化地图和添加图层。通过简单的代码示例,可以设置地图视图、添加底图和标记,并进一步扩展功能,如添加矢量图层和绘制图形。SuperMapiClientforJavaScript提供了丰富的API,支持更多高级功能的开发。文章还提供了一个完整版的二维地图页面开发示例,包括地图的初始化、图层的添加和控件的设置。通过这些步骤,开发者可以快速构建功能丰富的二维地图页面。


在开发二维地图页面之前,需要确保开发环境已经配置好。SuperMap iClient for JavaScript 是一个常用的开发工具,支持在网页中嵌入地图。确保已经安装了Node.js和npm,并创建一个新的项目目录。

mkdir supermap-demo
cd supermap-demo
npm init -y

在项目目录中安装SuperMap iClient for JavaScript的依赖包。可以通过npm安装。

npm install @supermap/iclient-leaflet

在项目目录中创建一个HTML文件,用于展示地图。可以使用以下代码作为基础模板。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>SuperMap 2D Map</title>
    <link rel="stylesheet" href="https://unpkg.com/leaflet/dist/leaflet.css" />
    <style>
        #map {
            height: 100vh;
            width: 100%;
        }
    </style>
</head>
<body>
    <div id="map"></div>
    <script src="https://unpkg.com/leaflet/dist/leaflet.js"></script>
    <script src="https://unpkg.com/@supermap/iclient-leaflet"></script>
    <script src="main.js"></script>
</body>
</html>

在项目目录中创建一个main.js文件,用于初始化地图并添加图层。以下是一个简单的示例代码。

// 初始化地图
var map = L.map('map').setView([30.25, 120.16], 10);

// 添加底图
L.supermap.tiledMapLayer("https://iserver.supermap.io/iserver/services/map-china400/rest/maps/China").addTo(map);

// 添加标记
var marker = L.marker([30.25, 120.16]).addTo(map);
marker.bindPopup("Hello, SuperMap!").openPopup();

SuperMap iClient for JavaScript 提供了丰富的API,可以进一步扩展地图功能。例如,添加矢量图层、绘制图形、查询地图数据等。可以参考官方文档进行更多功能的开发。

// 添加矢量图层
var vectorLayer = L.supermap.featureLayer("https://iserver.supermap.io/iserver/services/data-china400/rest/data/featureResults/1.json").addTo(map);

// 绘制图形
var circle = L.circle([30.25, 120.16], {
    color: 'red',
    fillColor: '#f03',
    fillOpacity: 0.5,
    radius: 500
}).addTo(map);

以下是supermap地图页面开发完整版,二维地图部分。

<template>
    <div class="plane-layout">
        <div class="plane-layout-bottom">
            <div class="plane-layout-bottom-left">
            </div>
            <div class="plane-layout-bottom-right">
                <div id="map" style="width: 100%; height: 750px;">
                </div>
            </div>
        </div>
    </div>
</template>
<script setup lang="ts">
import * as L from 'leaflet'
import '@supermap/iclient-leaflet/dist/iclient-leaflet.css'
import 'leaflet/dist/leaflet.css'
import '@supermap/iclient-leaflet'
import { reactive,nextTick } from 'vue'


const state = reactive({
    options: [
        { label: '全部' }
    ],
    value1: '全部',
    value2: '',
    value3: '全部',
    value4: '全部',
    tableData: [
    ]
})
const createMap = () => {
    var url4326 = "https://iserver.supermap.io/iserver/services/map-world/rest/maps/World";

    var map = L.map('map', {
        crs: L.CRS.EPSG4326,
        center: [40.044716,111.489059],
        maxZoom: 18,
        zoom: 4
    });
    // 天地图底图
    var tdtmap = new L.supermap.TiandituTileLayer({
        layerType: 'img',
        key: '1d109683f4d84198e37a38c442d68311'
    }).addTo(map);
    // 图层设置
    var world = new L.supermap.TiledMapLayer(url4326,{noWrap:true});
    var 县域城市 = new L.supermap.TiledMapLayer('http://localhost:8090/iserver/services/map/rest/maps/县域城市0529', {noWrap:true});
    var baseMaps = { "天地图WMTS": tdtmap, "world": world };
    var overlayMaps = { "Cities": 县域城市};
      // 添加控件
    L.control.layers(baseMaps, overlayMaps).addTo(map);
    L.control.scale().addTo(map);
    L.control.minimap().addTo(map);
    L.control.sideBySide().addTo(map);
    
    // L.control.sideBySide(China, ChinaDark).addTo(map);
    new L.supermap.TiledMapLayer(url4326).addTo(map);
    var editableLayers = new L.FeatureGroup();
    map.addLayer(editableLayers);
    var options = {
        position: 'topleft',
        draw: {
            polyline: {},
            polygon: {},
            circle: {},
            rectangle: {},
            marker: {},
            remove: {}
        },
        edit: {
            featureGroup: editableLayers,
            remove: true
        }
    };
    var drawControl = new L.Control.Draw(options);
    map.addControl(drawControl);
    handleMapEvent(drawControl._container, map);
    map.on(L.Draw.Event.CREATED, function (e) {
        var type = e.layerType,
            layer = e.layer;
        if (type === 'marker') {
            layer.bindPopup('A popup!');
        }
        editableLayers.addLayer(layer);
    });

    function handleMapEvent(div, map) {
        if (!div || !map) {
            return;
        }
        div.addEventListener('mouseover', function () {
            map.scrollWheelZoom.disable();
            map.doubleClickZoom.disable();
        });
        div.addEventListener('mouseout', function () {
            map.scrollWheelZoom.enable();
            map.doubleClickZoom.enable();
        });
    }
}
nextTick(() => {
    createMap();
    });
</script>
<style lang="less">

</style>
<style lang="less" scoped>
.plane-layout {
    width: 100%;
    height: 100%;
    display: flex;
    flex-direction: column;
    padding: 0px;
    &-bottom {
        &-right {
            flex: 1;
            background: url(@/images/border.png) no-repeat;
            background-size: 100% 150%;
            padding: 1px;
        }
    }
    &-table {
        flex: 1;
        overflow: hidden;
    }
}
</style>

 官方源代码:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8" />
    <title data-i18n="resources.title_tiledMapLayer4326"></title>
    <script type="text/javascript" src="../js/include-web.js"></script>
  </head>
  <body style="margin: 0; overflow: hidden; background: #fff; width: 100%; height: 100%; position: absolute; top: 0">
    <div id="map" style="margin: 0 auto; width: 100%; height: 100%"></div>
    <script type="text/javascript" src="../../dist/leaflet/include-leaflet.js"></script>
    <script type="text/javascript">
      var host = window.isLocal ? window.server : 'https://iserver.supermap.io';
      var map,
        url = host + '/iserver/services/map-world/rest/maps/World';

      // 方式一:1.调用 L.supermap.initMap,根据 SuperMap iServer 地图服务的地图信息,创建地图和底图
      L.supermap.initMap(url);
      /*
        // 方式二:1.调用 L.supermap.MapService,获取 SuperMap iServer 地图服务的地图信息
        //         2.调用 L.supermap.crsFromMapJSON 创建 CRS
        //         3.调用 L.map 创建地图
        //         4.调用 L.supermap.TiledMapLayer 创建底图
        new L.supermap.MapService(url).getMapInfo().then((res) => {
            var crs = L.supermap.crsFromMapJSON(res.result);
            map = L.map('map', {
              crs: crs,
              center: [23.909946174843483, 17.607615853850504],
              maxZoom: 18,
              zoom: 0
            });
            new L.supermap.TiledMapLayer(url).addTo(map);
        });
      */
    </script>
  </body>
</html>


喜欢本篇文章请多多关注,您的鼓励是我最大的动力。欢迎大家互相分享交流。(aaanimals)


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

aaanimals

蟹蟹老板的鼓励~~~~~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值