您的位置:首页 > Web前端 > JavaScript

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. 实现效果

效果展示:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: