我们知道,一个GIS开发包或者GIS平台,和一般的图形系统的差别就在于其管理的对象都是有空间参考(或者叫地理参考)的,简而言之,空间参考就是坐标系,但坐标系不是简单的笛卡尔坐标系,因为地球是圆的。有关的文献可以参考一般的地图学教材。
对
于GIS系统,坐标系是和每个对象对应的,也就是说,任何一个空间对象(Feature)都必须有一个空间参考,但在实现中,一般是一个图层对应一个空间
参考,也就是坐标系。而整个地图也有一个空间参考,并且有的系统,这个参考还分为实际内部数据的和显示的(例如MapX)。
MapX的空
间参考可以通过CoordSys
object来设置。设置的类型包括平面坐标(笛卡尔坐标,Non-Earth),经纬度以及各类投影坐标系统。然后这个CoordSys对象可以和图
层、Map对象关联,或者说,每个Layer对象和Map对象都有自己的空间参考。
在MapX中,图层的空间参考可以通过Layer.CoordSys属性来获取或者设置。
MapX
的Map对象的空间参考则可以通过Map.DisplayCoordSys和Map.NumericCoordSys属性来设置,前者是显示的坐标,后者
是实际的坐标。如果你把前者设置为经纬度,后者设置为投影坐标,那么通过Map的工具量测得到就是前者的坐标单位,而通过FeatureFactory对
象添加属性,使用的坐标就是后者。
那么对应层和Map对象空间参考不一致的情况,显示的时候就要实时(onfly)变换。
在我们使用FeatureFactory添加坐标的时候,一定要清楚当前地图的NumericCoordSys属性的设置。
而创建一个Point的对象的时候,使用的也是NumericCoordSys这个坐标体系。
对于一个没有添加任何数据的MapX控件,其Map的NumericCoordSys属性为平面坐标,如果使用Layers.Add添加图层,这个属性就自动变为添加的第一个图层的空间参考。
如果加载GeoSet,则坐标体系通过GeoSet创建。
通过MapX的Layers.Add方法新建图层,一般不需要指定图层的空间参考,也无法在LayerInfo对象中指定文件图层对象的空间参考,这时,创建的图层的空间参考为MapX的空间参考(NumericCoordSys)。
另外,使用平面坐标(Non-Earth)时,需要指定其范围,缺省好像是-100到100,太小,但也不能太大,不确定的情况下,使用int.max就合适,太大数据溢出,就等于很小了。
坐标是GIS开发一个比较头疼的问题,遇到类似的问题的朋友,希望这篇东西会有益处。