arcgis-api-for-js-之空间参考系统
2018-02-04 14:25
316 查看
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号为
102113的
WGS_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常用的坐标系统。
我们可以仿照上面的方式,自定义一种空间空间参考系统字符串,然后用该字符串作为参数来实例化一个自定义的空间参考系统。
如果在实例化地图类的对象时,指定了投影(通过
extent的
spatialReference属性),那么需要确保所有的图层能使用该投影进行绘制,对于切片图层,必须要求其投影与地图的投影一致,对于动态图层,则需要进行相应的投影转换,从而影响了服务器的响应效率。
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. 实现效果
效果展示:相关文章推荐
- arcgis-api-for-js-之参考系统的转换
- ArcGIS API for JS 3.16在Windows系统上的离线部署方法
- ArcGIS api for javascript——设置自定义范围和空间参考
- ArcGIS for js API 3.9
- 南沙政府应急系统之GIS一张图(arcgis api for flex)讲解(五)地图切换以及图层显示模块
- arcgis api for js入门开发系列一arcgis api离线部署
- Arcgis for Js实现graphiclayer的空间查询(续)
- Arcgis for Js实现graphiclayer的空间查询
- arcgis-api-for-js-之创建图层和添加图层(1)
- arcgis api for js 开发
- arcgis api for js入门开发系列三地图工具栏
- arcgis api for js入门开发系列八聚合效果
- arcgis api for js入门开发系列七图层控制
- ArcGIS JS 版军事标绘图(燕尾箭头、钳击箭头、集结地)扇形等自定义图形, ArcGIS For JavaScript API Drawing Tool(绘图工具)————(十七)
- arcgis for js api离线部署
- arcgis api 4.x for js之图层管理篇
- arcgis api for js共享干货系列之一自写算法实现地图量算工具
- vue-cli&webpack&arcgis API For JS的天坑之路(二)
- 天津政府应急系统之GIS一张图(arcgis api for flex)解说(三)显示地图坐标系模块
- 南沙政府应急系统之GIS一张图(arcgis api for flex)讲解(六)地图搜索模块