arcgis-api-for-js-之空间参考系统

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/cj9551/article/details/79252507

1. 前言

需要了解的两个概念:

  • 地理坐标系统:GIS 描述显示世界中的对象是通过对象的空间位置、属性、时间来描述,而空间中的位置就是通过建立地理坐标系,也就是经纬网来进行描述,形成的坐标系统我们称为地理坐标系统。
  • 投影坐标系统:我们的地球是不规则的球体,初中地理上我们都学过“两极稍扁,赤道略鼓的不规则球体”来描述地球,所以是不能够将地球面上的内容展示在平面上,我们必须要进行坐标变换,需要找到一种合理的地图投影的方法来进行曲面转平面,建立一个从球面转平面的函数关系,使地球上任意一点都可以在平面上所对应,这类通过投影变换后的坐标系统称为投影坐标系统,比如我们经常听到的 墨卡托、高斯克里格投影等。

2. 空间参考系统类

ArcGIS API 中提供"esri/SpatialReference" 类来描述空间坐标系统,该类最简单的实例化方式是使用由欧洲石油调查组织定义的ID (又称为 WKID)作为参数,代码如下:

require([
  "esri/SpatialReference", ... 
], function(SpatialReference, ... ) {
  var sr = new SpatialReference(4326);
  ...
});

上面实例化了一个 SpatialReference 对象,作用就是定义了一个"GCS_WGS_1984" 地理坐标系统。其中4326 就是我们前面所说的 ID ,有关支持的空间参考的列表,可以参阅投影坐标系统地理坐标系统
这些空间参考通常用字符串格式定义各种参数,例如前面所说的"GCS_WGS_1984" 地理坐标系统,他的定义字符串如下:

地理坐标系的名称、大地基准面(DATUM)、椭球体(SPHEROID)、本初子午线(PRIMEM)、单位(UNIT)

GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137.0,298.257223563]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]]

投影坐标系统的字符串格式除了包含地理坐标系统要求的信息外,还包含了投影的参数信息。例如下面是ID 号为102113WGS_1984_Web_Mercator 的投影的字符串信息:

PROJCS["WGS_1984_Web_Mercator",
GEOGCS
["GCS_WGS_1984_Major_Auxiliary_Sphere",
DATUM["D_WGS_1984_Major_Auxiliary_Sphere",
SPHEROID["WGS_1984_Major_Auxiliary_Sphere",
6378137.0,0.0]],
PRIMEM["Greenwich",0.0],
UNIT["Degree",0.0174532925199433]
],
PROJECTION["Mercator"],
PARAMETER["False_Easting",0.0],
PARAMETER["False_Northing",0.0],
PARAMETER["Central_Meridian",0.0],
PARAMETER["Standard_Parallel_1",0.0],
UNIT["Meter",1.0]]

可以看到上面定义椭球体时,第二个参数为0,这也就是它与常规墨卡托投影的主要区别,把地球模拟为球体而非椭球体。这个只是为了计算方面简单,而它所造成的精度上的差别在0.33% 之内。当比例尺越大,他的误差可以忽略,它也是WebGIS 常用的坐标系统。
我们可以仿照上面的方式,自定义一种空间空间参考系统字符串,然后用该字符串作为参数来实例化一个自定义的空间参考系统。
如果在实例化地图类的对象时,指定了投影(通过extentspatialReference 属性),那么需要确保所有的图层能使用该投影进行绘制,对于切片图层,必须要求其投影与地图的投影一致,对于动态图层,则需要进行相应的投影转换,从而影响了服务器的响应效率。

3. 例子

下面的例子实现上面所说的切片图层,动态图层的投影,代码如下:

   <script>
        var map, topo, streetMap, usa, taxParcel;

        require(["dojo/parser", "dijit/registry", "esri/geometry/Extent",
            "esri/map", "esri/layers/ArcGISTiledMapServiceLayer", "esri/layers/ArcGISDynamicMapServiceLayer",
            "dijit/layout/BorderContainer", "dijit/layout/ContentPane",
            "dijit/form/Button",
            "dojo/domReady!"],
            function (parser, registry, Extent, Map, ArcGISTiledMapServiceLayer, ArcGISDynamicMapServiceLayer) {
                parser.parse();

                var initialExtent = new Extent({
                    "xmin": -9749695.83182828, "ymin": 4387485.423567985,
                    "xmax": -8230739.205745666, "ymax": 5374440.332785915,
                    "spatialReference": { "wkid": 102100 }
                });

                map = new esri.Map("mapDiv", { extent: initialExtent });

                registry.byId("addSameTiledLayer").on("click", addSameTiledLayer);
                registry.byId("addDifferentTiledLayer").on("click", addDifferentTiledLayer);
                registry.byId("addGeoDynamicLayer").on("click", addGeoDynamicLayer);
                registry.byId("addProjDynamicLayer").on("click", addProjDynamicLayer);

                map.on("layer-add", function (evt) {
                    var layer = evt.layer;
                    document.getElementById("spatialReference").innerHTML = "地图的空间参考系统为:" + map.spatialReference.wkid + ";<p>图层的空间参考系统为:" + layer.spatialReference.wkid + "</p>";
                });

                map.on("mouse-move", function (evt) {
                    document.getElementById("coords").innerHTML = "X: " + evt.mapPoint.x + " | Y: " + evt.mapPoint.y;
                });

                function addSameTiledLayer() {
                    map.removeAllLayers();
                    if (!topo) {
                        var topoUrl = "http://services.arcgisonline.com/ArcGIS/rest/services/World_Topo_Map/MapServer";
                        topo = new ArcGISTiledMapServiceLayer(topoUrl);
                    }

                    map.addLayer(topo);
                }

                function addDifferentTiledLayer() {
                    map.removeAllLayers();
                    if (!streetMap) {
                        var streetMapUrl = "http://server.arcgisonline.com/ArcGIS/rest/services/ESRI_StreetMap_World_2D/MapServer";
                        streetMap = new esri.layers.ArcGISTiledMapServiceLayer(streetMapUrl);
                    }

                    map.addLayer(streetMap);
                }

                function addGeoDynamicLayer() {
                    map.removeAllLayers();
                    if (!usa) {
                        var usaUrl = "http://sampleserver1.arcgisonline.com/ArcGIS/rest/services/Specialty/ESRI_StatesCitiesRivers_USA/MapServer";
                        usa = new esri.layers.ArcGISDynamicMapServiceLayer(usaUrl);
                    }

                    map.addLayer(usa);
                }

                function addProjDynamicLayer() {
                    map.removeAllLayers();
                    if (!taxParcel) {
                        var taxParcelUrl = "http://sampleserver1.arcgisonline.com/ArcGIS/rest/services/TaxParcel/TaxParcelQuery/MapServer";
                        taxParcel = new esri.layers.ArcGISDynamicMapServiceLayer(taxParcelUrl);
                    }

                    map.addLayer(taxParcel);
                }
        });

    </script>

对于使用地理坐标系统的地图,也同样要求切片图层的空间参考与地图的空间参考一致,对于动态图层则没有这个要求。

4. 实现效果

  • 效果展示:
    这里写图片描述

猜你喜欢

转载自blog.csdn.net/cj9551/article/details/79252507