基于 gma 的 GIS 空间参考系统探索

0 了解空间参考

为了能够正确地描述要素的位置和形状,需要引入一个用于定义位置的框架,也就是空间参考。空间参考用于存储各类要素坐标属性的坐标系系统,借此描述一个要素的真实位置。主要包括两大部分:坐标系统坐标域

坐标系统
坐标系统是一个二维或者三维的参照系,用于定位坐标点,通过坐标系统可以确定要素在地球上的真实位置。常用的坐标系主要是以下两种:大地坐标系和投影坐标系。

坐标域
坐标域是一个要素中坐标的允许取值范围。

1 了解 gma (1.1.5)中的空间参考功能

1.1 gma 空间参考功能在库中的位置

gma 中空间参考功能位于 gma.algorithm.core.spat用以初始化各种坐标系/投影,以方便检索和使用参数和查询相关信息,这是基础的空间参考;基于此构建的扩展(增强)空间参考功能整合在地图工具 gma.map.rcsSpatRef 类中 。gma 库(1.1.5)及其空间参考功能分布如下:

1.2 SpatRef 类支持初始化的坐标系格式

格式示例 (以 WGS 84 为例)
EPSG4326 (或 'EPSG:4326' )
MICoordSys'Earth Projection 1, 104'
PCI['LONG/LAT D000', 'DEGREE', (0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0)]
PROJJSON'{\n "$schema": "https://proj.org/schemas/v0.4/projjson.schema.json",\n "type": "GeographicCRS",\n "name": "WGS 84",\n "datum": {\n "type": "GeodeticReferenceFrame",\n "name": "World Geodetic System 1984",\n "ellipsoid": {\n "name": "WGS 84",\n "semi_major_axis": 6378137,\n "inverse_flattening": 298.257223563\n }\n },\n "coordinate_system": {\n "subtype": "ellipsoidal",\n "axis": [\n {\n "name": "Geodetic latitude",\n "abbreviation": "Lat",\n "direction": "north",\n "unit": "degree"\n },\n {\n "name": "Geodetic longitude",\n "abbreviation": "Lon",\n "direction": "east",\n "unit": "degree"\n }\n ]\n },\n "id": {\n "authority": "EPSG",\n "code": 4326\n }\n}'
PrettyWkt'GEOGCS["WGS 84",\n DATUM["WGS_1984",\n SPHEROID["WGS 84",6378137,298.257223563,\n AUTHORITY["EPSG","7030"]],\n AUTHORITY["EPSG","6326"]],\n PRIMEM["Greenwich",0,\n AUTHORITY["EPSG","8901"]],\n UNIT["degree",0.0174532925199433,\n AUTHORITY["EPSG","9122"]],\n AXIS["Latitude",NORTH],\n AXIS["Longitude",EAST],\n AUTHORITY["EPSG","4326"]]'
Proj4'+proj=longlat +datum=WGS84 +no_defs'
USGS[0, 0, (0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0), 12]
Wkt'GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AXIS["Latitude",NORTH],AXIS["Longitude",EAST],AUTHORITY["EPSG","4326"]]'
XML'<gml:GeographicCRS gml:id="ogrcrs1">\n <gml:srsName>WGS 84</gml:srsName>\n <gml:srsID>\n <gml:name codeSpace="urn:ogc:def:crs:EPSG::">4326</gml:name>\n </gml:srsID>\n <gml:usesEllipsoidalCS>\n <gml:EllipsoidalCS gml:id="ogrcrs2">\n <gml:csName>ellipsoidal</gml:csName>\n <gml:csID>\n <gml:name codeSpace="urn:ogc:def:cs:EPSG::">6402</gml:name>\n </gml:csID>\n <gml:usesAxis>\n <gml:CoordinateSystemAxis gml:id="ogrcrs3" gml:uom="urn:ogc:def:uom:EPSG::9102">\n <gml:name>Geodetic latitude</gml:name>\n <gml:axisID>\n <gml:name codeSpace="urn:ogc:def:axis:EPSG::">9901</gml:name>\n </gml:axisID>\n <gml:axisAbbrev>Lat</gml:axisAbbrev>\n <gml:axisDirection>north</gml:axisDirection>\n </gml:CoordinateSystemAxis>\n </gml:usesAxis>\n <gml:usesAxis>\n <gml:CoordinateSystemAxis gml:id="ogrcrs4" gml:uom="urn:ogc:def:uom:EPSG::9102">\n <gml:name>Geodetic longitude</gml:name>\n <gml:axisID>\n <gml:name codeSpace="urn:ogc:def:axis:EPSG::">9902</gml:name>\n </gml:axisID>\n <gml:axisAbbrev>Lon</gml:axisAbbrev>\n <gml:axisDirection>east</gml:axisDirection>\n </gml:CoordinateSystemAxis>\n </gml:usesAxis>\n </gml:EllipsoidalCS>\n </gml:usesEllipsoidalCS>\n <gml:usesGeodeticDatum>\n <gml:GeodeticDatum gml:id="ogrcrs5">\n <gml:datumName>WGS_1984</gml:datumName>\n <gml:datumID>\n <gml:name codeSpace="urn:ogc:def:datum:EPSG::">6326</gml:name>\n </gml:datumID>\n <gml:usesPrimeMeridian>\n <gml:PrimeMeridian gml:id="ogrcrs6">\n <gml:meridianName>Greenwich</gml:meridianName>\n <gml:meridianID>\n <gml:name codeSpace="urn:ogc:def:meridian:EPSG::">8901</gml:name>\n </gml:meridianID>\n <gml:greenwichLongitude>\n <gml:angle uom="urn:ogc:def:uom:EPSG::9102">0</gml:angle>\n </gml:greenwichLongitude>\n </gml:PrimeMeridian>\n </gml:usesPrimeMeridian>\n <gml:usesEllipsoid>\n <gml:Ellipsoid gml:id="ogrcrs7">\n <gml:ellipsoidName>WGS 84</gml:ellipsoidName>\n <gml:ellipsoidID>\n <gml:name codeSpace="urn:ogc:def:ellipsoid:EPSG::">7030</gml:name>\n </gml:ellipsoidID>\n <gml:semiMajorAxis uom="urn:ogc:def:uom:EPSG::9001">6378137</gml:semiMajorAxis>\n <gml:secondDefiningParameter>\n <gml:inverseFlattening uom="urn:ogc:def:uom:EPSG::9201">298.257223563</gml:inverseFlattening>\n </gml:secondDefiningParameter>\n </gml:Ellipsoid>\n </gml:usesEllipsoid>\n </gml:GeodeticDatum>\n </gml:usesGeodeticDatum>\n</gml:GeographicCRS>\n'
部分主要坐标系名称WGS84

2 探索空间参考(坐标系/投影)系统

from gma.map import rcs
SR = rcs.SpatRef('WGS84')
类型名称描述使用结果
属性AeraOfUse坐标系使用的经纬度范围。无法识别范围的坐标系则根据中央经线自动生成最大范围 (gma 对全球范围的坐标系进行了修改,其最东端与最西端永远相差0.02°SR.AeraOfUse[-179.99, -89.99, 179.99, 89.99]
属性AngularUnits角度单位值SR.AngularUnits0.017453292519943295
属性AngularUnitsName角度单位名称SR.AngularUnitsName‘degree’
属性EPSG坐标系 EPSG 编码。没有 EPSG 编码的坐标系则值为 0SR.EPSG4326
方法Export导出坐标系。支持 MICoordSys,PCI,PROJJSON,PrettyWkt,Proj4,USGS,Wkt,XML 格式SR.Export(Format = 'Proj4')‘+proj=longlat +datum=WGS84 +no_defs’
方法GetProjParms获取坐标系的投影参数SR.GetProjParms(){}
方法GetUseFeature获取坐标系的使用区域 FeatureSR.GetUseFeature()<gma.algorithm.core.dataio.Feature at 0x…>
方法GetUseFeatureInWGS84获取坐标系的使用区域 Feature(WGS84)SR.GetUseFeatureInWGS84()<gma.algorithm.core.dataio.Feature at 0x…>
属性InvFlattening椭球体反扁率SR.InvFlattening298.257223563
属性LinearUnits线形单位值SR.LinearUnits1.0
属性LinearUnitsName线形单位名称SR.LinearUnitsName‘Meter’
属性Name坐标系名称SR.Name‘WGS 84’
属性PRIMEM坐标系的本初子午线SR.PRIMEM{‘Greenwich’: 0.0}
属性ProjWKT 格式的坐标系SR.Proj ‘GEOGCS[“WGS 84”,DATUM[“WGS_1984”,SPHEROID[“WGS 84”,6378137,298.257223563,AUTHORITY[“EPSG”,“7030”]],AUTHORITY[“EPSG”,“6326”]],PRIMEM[“Greenwich”,0,AUTHORITY[“EPSG”,“8901”]],UNIT[“degree”,0.0174532925199433,AUTHORITY[“EPSG”,“9122”]],AXIS[“Latitude”,NORTH],AXIS[“Longitude”,EAST],AUTHORITY[“EPSG”,“4326”]]’
属性SemiMajor椭球体长半轴SR.SemiMajor6378137.0
属性SemiMinor椭球体短半轴SR.SemiMinor6356752.314245179
属性Type坐标系类型SR.Type‘Geographic’

3 在地图上查看坐标系的适用范围

结合 gma 绘图工具和 GetUseFeatureInWGS84 方法,可以很容易的查看某个坐标系使用区域在地图上的位置。本文以 :

  • EPSG:4326( WGS84)
  • EPSG:4490(China Geodetic Coordinate System 2000)
  • EPSG:2163(NAD27 / US National Atlas Equal Area)
  • EPSG:32650(WGS 84 / UTM zone 50N)

四个坐标系为例进行展示。

from gma.map import plot, rcs
WorldDS = plot.GetWorldDataSource()
WorldLayer = WorldDS.GetLayer(0)

3.1 全球性坐标系(WGS84)

MapF = plot.MapFrame()
MapL1 = MapF.AddLayer(WorldLayer, FaceColor = 'none', EdgeColor = 'black', LineWidth = 0.1, Zorder = 1)

# 绘制坐标系范围
Spat = rcs.SpatRef('WGS84')
UseFeature = Spat.GetUseFeatureInWGS84()
MapF.AddFeature(UseFeature)

3.2 地方坐标系(EPSG:4490 / China Geodetic Coordinate System 2000)

MapF = plot.MapFrame()
MapL1 = MapF.AddLayer(WorldLayer, FaceColor = 'none', EdgeColor = 'black', LineWidth = 0.1, Zorder = 1)

# 绘制坐标系范围
Spat = rcs.SpatRef(4490)
UseFeature = Spat.GetUseFeatureInWGS84()
MapF.AddFeature(UseFeature)

3.3 地方坐标系(EPSG:2163 / NAD27 / US National Atlas Equal Area)

MapF = plot.MapFrame()
MapL1 = MapF.AddLayer(WorldLayer, FaceColor = 'none', EdgeColor = 'black', LineWidth = 0.1, Zorder = 1)

# 绘制坐标系范围
Spat = rcs.SpatRef(2163)
UseFeature = Spat.GetUseFeatureInWGS84()
MapF.AddFeature(UseFeature)

3.4 地方坐标系(EPSG:32650 / WGS 84 / UTM zone 50N)

MapF = plot.MapFrame()
MapL1 = MapF.AddLayer(WorldLayer, FaceColor = 'none', EdgeColor = 'black', LineWidth = 0.1, Zorder = 1)

# 绘制坐标系范围
Spat = rcs.SpatRef(32650)
UseFeature = Spat.GetUseFeatureInWGS84()
MapF.AddFeature(UseFeature)

3.5 换一个视角(底图:EPSG:6931 / WGS 84 / NSIDC EASE-Grid 2.0 North)

MapF = plot.MapFrame(BaseMapProj = 6931)
MapL1 = MapF.AddLayer(WorldLayer, FaceColor = 'none', EdgeColor = 'black', LineWidth = 0.1, Zorder = 1)

# 绘制坐标系范围
Spat = rcs.SpatRef(32650)
UseFeature = Spat.GetUseFeatureInWGS84()
MapF.AddFeature(UseFeature)

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

洛的地理研学

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值