更新与2019年03月15日
一、概述
我们都知道点的意义在于坐标,没在不同的坐标系下我们的代表位置不同,坐标对于地图至关重要,缺少了坐标系地图毫无意义,我们都知道坐标一般分为地理坐标系和投影坐标系,地理坐标系用(lon, lat)表示,而投影坐标系用(x,y)表示,二者一个代表球面,一个代表平面,在arcgis中我们创建map容器时可以设置指定的坐标系,通过extent指定spatialReference.wkid,也可以不指定,当我们不指定的时候,map的空坐标系会根据第一个加载到地图容器的图层的坐标系,采用第一个图层加载到图层的坐标系,这也就是为什么加载我们一般先加载静态地图,无论layer的坐标系如何,我们都加在到map中,所以必须保证map的spatialReference和layer的spatialReference一致即可,有时候会需要我们进行转换,当然也不尽然完全可以转换。由于Web墨卡托投影的广泛使用spatialReference类专门有一个方法判断坐标系是否为Web墨卡托投影→isWebMercator,返回值是布尔类型。
二、关于坐标转换的问题
在"esri/geometry/webMercatorUtils"命名空间下有个webMercatorUtils类用于地理坐标系和墨卡托的转换
1、geographicToWebMercator(geometry)方法
用于地理坐标经纬度转换为Web墨卡托投影想x,y坐标
代码示例:
var paths = this.getPaths(obj.coords),
sr = this.map.spatialReference,
line, polyline;
//坐标为空直接返回
if (!paths) return;
//paths里面是一串用经纬度表示的点,属于地理坐标系
line = new Polyline({ paths: paths, spatialReference: sr });
//判断sr是否是为墨卡托投影
if (sr.isWebMercator()) return;
//表示当前map不是地理坐标系统,那我们就需要转换line了,告诉它line里面的114,30...这些点其实是 lon,lat而不是x,y,否则就飞到海里去了
line = webMercatorUtils.geographicToWebMercator(line);
polyline = new Graphic(line, symbolLine);
2、webMercatorToGeographic(geometry, isLinear?)方法
用于将投影坐标系转为地理坐标系。
代码示例:
var paths = this.getPaths(obj.coords),
sr = this.map.spatialReference,
line, polyline;
//坐标为空直接返回
if (!paths) return;
//paths里面是一串用X,Y表示的点,属于投影坐标系
line = new Polyline({ paths: paths, spatialReference: sr });
//判断sr是否是为墨卡托投影
if (!sr.isWebMercator()) return;
//表示当前坐标系不是墨卡托投影坐标系就返回
line = webMercatorUtils.webMercatorToGeographic(line);
polyline = new Graphic(line, symbolLine);
三、那些类会用到坐标系
1、map,通过extent设置坐标系
2、Geometry的子类
四、关于map容器和Layer的坐标系问题(动态投影)
我们在实例化地图类,如果指定投影,那么就要确保所有的图层都能使用该投影进行绘制,对于切片图层,必须要求其投影和地图投影一致;对于动态图层如果地图类指定的为投影坐标系分为以下两种情况:
1、动态图层为投影坐标系,map为投影坐标系(也可以为地理坐标系),此时动态图层需要进行转换。
2、动态图层为地理坐标系,map为投影坐标系(也可以为地理坐标系),此时动态图层不需要进行转换。