2.7.1 投影与地图数据坐标系对象
MapObjects定义的投影模型特殊,使用的术语特殊,本节讲述的内容只适用于MapObjects组件程序设计。
将地物的地理坐标(经纬度)转换成平面直角坐标称为投影。地图数据用平面直角坐标表示,称为IsProjected(已经投影),地图数据用地理坐标表示称为 Not IsProjected(未经投影)。
Map.CoordinateSystem属性 MapLayer.CoordinateSystem属性 |
ProjCoordSys实例 |
GeoCoordSys实例 |
Projection属性 GeoCoordSys属性 SetParameter方法 |
Datum属性 |
图2-7-1 地图数据坐标系对象结构 |
为Map1定义投影可以按上图进行。创建一个ProjCoordSys实例,设置实例属性Projection及GeoCoordSys中的参数,用实例的SetParameter方法设置其余参数,将实例赋给Map1.CoordinateSystem属性,这样Map1中的地图显示是经过投影了的。若将GeoCoordsys实例赋给Map1.CoordinateSytem则地图显示采用地理坐标(经纬度),是未经投影的。用同样的步骤可为图层定义投影及地图数据坐标系
1 地理坐标系对象GeoCoordSys
GeoCoordSys对象定义地理坐标系。地理坐标系以经度为X 坐标,以纬度为Y坐标。GeoCoordSys还定义地球椭球体参数,规定经纬度起算点在国际标准地理坐标系中的位置,我国使用的是国际标准地理坐标系,经度的起算点是过格林威治天文台的本初子午线。纬度起算点是赤道。使用国际标准地理坐标系不必设置经纬度的起算点。GeoCoordSys 的几个重要属性如下:
(1)Type 属性
Type As GeographicCoordSysConstants
GeoCoordSys.Type属性的值是一个枚举常量,作为预定义的一组参数的标识号。指定了GeoCoordSys.Type的值就指定了一组预定义参数,这组预定义参数完整地定义了地理坐标系。如语句
Dim theGc As New MapObjects2.GeoCoordSys
theGc.Type = moGeoCS_Krasovsky1940
指定了使用1940年Krasovsky椭球体参数,完整地定义了地理坐标系。
枚举常量名 |
值 |
注释 |
moGeoCS_WGS1984 |
4326 |
WGS 1984 |
moGeoCS_International1967 |
4023 |
International 1967 |
moGeoCS_International1927 |
4022 |
International 1927 |
moGeoCS_Krasovsky1940 |
4024 |
Krasovsky 1940 |
我国常用的几个GeoCoordSys.Type 常量
(2) PrimeMeridian 属性
PrimeMeridian As PrimeMeridian
PrimeMeridian参数指定地理坐标系的经度起算点在国际标准地理坐标系中的经度。我国使用的国际标准地理坐标系,PrimeMeridian(本初子午线)在这个坐标系中的经度是0,使用缺省值(PrimeMeridian.Longitude=0)即可,不必考虑这个参数。
(3) Datum 属性
Datum As Datum
Datum 定义地理坐标系使用的大地水准面,语句
Datum.Type = moDatum_Krasovksy1940
指定了中国国家标准地形图使用的地球椭球体参数:地球半长轴=6378245米,椭球体扁率=0.0335232986925914。Datum.Type不仅指定了大地高程系,而且指定了椭球体参数。Datum.Type的预定义参数表请查阅帮助中的DatumConstants枚举值表。
2 投影坐标系对象ProjCoordSys
ProjCoodSys (Projection Coordinate System的缩略语)是MapObjects描述地图投影及坐标系的最高层对象,包含了地图投影的完整表达及投影变换的全部计算方法。投影定义及投影变换在此对象上进行。
(1) Projection属性
类型:Projection As Projection。
ProjCoordSys.Projection属性是一个Projection对象实例。定义了投影的类型,每种类型对应一个唯一的地图投影计算公式,用一个常数标识,储存于 Projection.Type 属性中。投影公式的计算机程序由MapObjects组件提供,因此,设定了Projection.Type的值也就指定了投影的计算公式。如语句
Dim thePrj As New MapObjects2.ProjCoordSys
thePrj.Projection.Type = moProjection_GaussKruger
指定了高斯克吕格投影坐标计算公式。
Projection.Type 属性是枚举常量,指定投影类型,我国常用的投影类型如表所示。
枚举常量名 |
值 |
注释 |
moProjection_EquidistantCylindrical |
43001 |
等距圆柱投影 |
moProjection_Mercator |
43004 |
麦卡托等角投影 |
moProjection_GaussKruger |
43005 |
高斯克吕格投影 |
moProjection_Albers |
43007 |
等角圆锥投影 |
Projection_LambertConformalConic |
43020 |
等面积圆锥投影 |
我国常用的几个Projection.Type 常量
Projection.Type的其它值请在帮助中查阅ProjectionConstants 枚举表
(2) GeoCoordSys属性
类型:GeoCoordSys As GeoCoordSys。
ProjCoordSys.GeoCoordSys属性是GeoCoordSys(Geographic Coordinate System)对象实例,定义计算投影坐标使用的地球椭球体参数及使用的大地水准面,GeoCoordSys的其它属性值在此无效。
(3) SetParameter方法
方法:Sub SetParameter(ParameterType As ParameterTypeConstants, ParameterValue As Double)
SetParamete方法设置投影参数,ParameterType指定设置的参数,ParameterValue指定参数的值。如语句
Dim theGc As New MapObjects2.GeoCoordSys
theGc.Setparameter(moParm_CentralMeridian, 110)
设置投影的*经线是110度。
枚举常量名 |
值 |
注释 |
moParm_StandardParallel1 |
3078 |
Standard Parallel 1, Phi1 |
moParm_StandardParallel2 |
3079 |
Standard Parallel 2, Phi2 |
moParm_OriginLongitude |
3080 |
Longitude of Origin, Lambda0 |
moParm_OriginLatitude |
3081 |
Latitude of Origin, Phi0 |
moParm_FalseEasting |
3082 |
False Easting, X0 |
moParm_FalseNorthing |
3083 |
False Northing, Y0 |
moParm_CentralMeridian |
3088 |
Central Meridian, Lambda0 |
moParm_CentralParalle |
3089 |
Central Parallel, Phi0 |
moParm_ScaleFactor |
3093 |
Scale Factor, K0 |
常用的 ParameterTypeConstants 枚举常量
(4) Type属性
类型:Type As ProjectedCoordSysConstants
Projection.Type与GeoCoordSys.Type 属性分别指定了ProjCoordSys的两组参数,.Setparamete方法设置第三组参数。三组参数形成ProjCoordSys的参数三元组。为简化应用设计,ProjCoordSys.Type用一个常量标识预定义的一个参数三元组。每个三元组含有美国一种常用投影的全部参数。因此,设置ProjCoordSys.Type为一个预定义的值也就设置了全部参数,如语句
Dim thePrjC As New MapObjects2.ProjCoodSys
thePrjC.Type = moProjCS_WGS1984UTM_10S ‘使用预定义投影
指定了美国国家标准地形图第10投影带的投影类型及其投影参数。执行这两条语句不仅给thePrjC.Type赋值,而且为thePrjC的内部属性变量设置了由moProjCS_WGS1984UTM_10S标识的参数三元组提供的全部参数,因此,一条语句就完成了一个投影的完整定义。这些投影由MapObjects2.ProjCoodSys对象预先定义,称为预定义投影。使用预定义投影常量请查阅MapObjects2.ProjectedCoordSysConstants对象的属性列表
(5) 自定义投影
我国使用的投影大多数在MapObjects2中没有预先定义,需要客户自己定义,称为客户自定义投影。
例1:自定义一个投影:我国常用的小比例尺全国地图使用双标准纬线等角圆锥投影,*经线110度,双标准纬线25和47度,地理经纬度坐标系采用国际标准。输出投影定义文件(样例见DefProject目录中的工程)。
Private Sub Command1_Click() '定义客户投影
Dim thePrj As New MapObjects2.ProjCoordSys
thePrj.Projection.Type = moProjection_Albers '等角圆锥投影
thePrj.GeoCoordSys.Type = moGeoCS_Krasovsky1940 '椭球体及大地水准面
thePrj.SetParameter moParm_CentralMeridian, 110 '*经线经度
thePrj.SetParameter moParm_StandardParallel1, 25 '第一标准纬线纬度
thePrj.SetParameter moParm_StandardParallel2, 47 '第二标准纬线纬度
thePrj.SetParameter moParm_OriginLongitude, 110 'Y 坐标轴经度
thePrj.Export "d:/test/chp.prj" '输出投影定义文件(metaData)
End Sub
3图层及Map控件的CoordinateSystem 属性
类型: CoordinateSystem As Variant
Map控件和MapLayer对象都有CoordinateSystem 属性,在图层中,这个属性表示地图数据的投影,在Map控件中是显示地图时使用的投影。在MapObjects2中,Map1的全部图层数据必须具有相同的投影及坐标系,否则不能加入到同一个Map1中(在未来版本中可能取消这一限制)。可以在同一个Map1窗口中显示,显示时进行投影变换。
CoordinateSystem可以引用ProjCoordSys或GeoCoordSys实例。当引用ProjCoordSys时,地图数据是经过投影计算后的直角坐标(x,y),ProjCoordSys.IsProjected属性值为TRUE;当引用GeoCoordSys时,地图数据是经纬度地理坐标,GeoCoordSys.IsProjected属性值为假。由于两个对象具有相同的属性名称,无论CoordinateSystem引用哪种类型的对象,都可以用语句判断图形数据是否经过投影,例如:
Dim theMapLayer As MapObjects2.MapLayer
If theMapLayer.coordinateSystem.IsProjected Then
图层已经过投影,图层数据是直角坐标系下的坐标
Else
图层数据是经纬度地理坐标
End If
例2 显示图层的投影参数(参见DefProject样例目录中的工程):
Private Sub Command2_Click() '显示投影参数
Dim thePrj As MapObjects2.ProjCoordSys
Dim theGeo As MapObjects2.GeoCoordSys
Dim lyr As MapObjects2.MapLayer
Set lyr = Map1.Layers("Province")
If lyr.CoordinateSystem.IsProjected Then ‘图层已经投影
Set thePrj = lyr.CoordinateSystem
List2.AddItem "Provicne图层已经投影,参数是"
List2.AddItem "Name: " & thePrj.Name
List2.AddItem "Type: " & thePrj.Type
List2.AddItem "Parm_StandardParallel1 = " & thePrj.GetParameter(moParm_StandardParallel1)
List2.AddItem "Parm_StandardParallel2 = " & thePrj.GetParameter(moParm_StandardParallel2)
Set theGeo = thePrj.GeoCoordSys
Else ‘图层未经投影
List2.AddItem "数据未经投影,使用经纬度坐标系:"
Set theGeo = lyr.CoordinateSystem
End If
List2.AddItem "Datum.Type = " & theGeo.Datum.Type
List2.AddItem "Datum.Name = " & theGeo.Datum.Name
List2.AddItem "Axis = " & theGeo.Datum.Spheroid.Axis
List2.AddItem "Flattening =" & theGeo.Datum.Spheroid.Flattening
End Sub
4 投影元数据文件
描述投影定义的数据称为投影元数据(Metadata)。储存这些数据的文件随数据来源而不同,称为投影元数据文件。投影元数据文件不仅定义地图数据采用的投影,还定义了地图数据坐标系。
地理数据来源 |
投影元数据文件 |
操作能力 |
ShapeFile |
*.prj |
读写 |
ArcInfo Coverages |
prj.adf |
只读 |
ArcSDE |
图层的数据库表 |
只读 |
投影元数据文件与数据来源
习题
1 在VB中使用对象浏览器补充图2-7-1中省略了的细节,将GeoCoordSys、ProjCoordSys、Datum、Spheroid、Projection的属性和方法添加到图中。查阅帮助,概要了解怎样使用这些属性和方法。
2 编写程序实现例题1、2的功能。用Windows的写字版查看例题1输出的文件中的内容,猜测文件中各个数据的含义,将文件中的数据分为3组:投影参数组、Projection参数组、GeoCoordSys参数组。
2.7.2构建坐标系对象实例
MapObjects2有两个坐标系对象:GeoCoordSys和ProjCoordSys。前者用于地理坐标系,后者用于投影坐标系。
1 MapObjects2.Strings 对象
MapObjects2预定了大量投影,为每个预定义投影编一个号码,通过号码引用预定投影。为编程方便,将预定义投影的说明文字及其编号组合成一个字符串。在MapObjects2.Strings中设计了专门的方法拣取这些字符串。MapObjects2将地图的坐标系统分为两类:投影坐标系和经纬度坐标系,分别用两个类描述:ProjCoordSys、GeoCoordSys。与此对应,在Strings对象中可分别提取这两类坐标系的编号。每个编号对应一种预定义的坐标系,可用这个编号构建预定义坐标系。
(1)拣取ProjCoordSys类型预定义投影坐标系字符串
Strings.PopulateWithProjectedCoordSys 方法拣取ProjCoordSys类型全部预定义的投影坐标系字符串。
例1 PopulateWithProjectedCoordSys方法提取预定义投影坐标系字符串,用预定义坐标系设置Map1窗口的数据坐标系(完整程序参见样例目录:StringPopulate)。
Private Sub Command1_Click() '提取投影坐标系字符串
Dim aStrings As New MapObjects2.Strings
aStrings.PopulateWithProjectedCoordSys
For i = 0 To aStrings.Count - 1
List1.AddItem aStrings.Item(i)
Next i
End Sub
摘取List1中显示的一行如下:
Adindan_UTM_Zone_37N [20137]
20137是预定义投影的编号,可以用这个编号设置Map1的投影,代码如下:
Private Sub List1_DblClick()
Dim thePrj As New MapObjects2.ProjCoordSys
Dim PrjType As Long
‘提取字符串中的投影编号,例如20137
PrjType = GetProjectionNumber(List1.List(List1.ListIndex))
thePrj.Type = PrjType ‘构建预定义投影坐标系
Map1.CoordinateSystem = thePrj ‘设置Map1窗口为投影坐标系
End Sub
在List1中双击选择投影坐标系,可以看到Map1中的地图变换成了所选的投影。
(2)拣取GeoCoordSys类型预定义坐标系字符串
Strings.PopulateWithGeographicCoordSys 方法拣取GeoCoordSys类型全部预定义的投影字符串。用预定义地理坐标系设置Map1窗口的数据坐标系(完整程序参见样例目录:StringPopulate)。
例2 PopulateWithGeographicCoordSys 方法拣取GeoCoordSys类型全部预定义的投影字符串,用从字符串中的投影编号设置Map1窗口的地图投影。
Private Sub Command2_Click() '提取经纬度坐标系字符串
Dim aStrings As New MapObjects2.Strings
aStrings.PopulateWithGeographicCoordSys
For i = 0 To aStrings.Count - 1
List2.AddItem aStrings.Item(i)
Next i
End Sub
摘取List2中的一行如下:
GCS_Alaskan_Islands [37260]
[]中的数值37260是经纬度坐标系的编号。
在List2中设置Map1窗口为经纬度坐标系:
Private Sub List2_DblClick() ' 设置Map1窗口为经纬度坐标系
Dim thePrj As New MapObjects2.GeoCoordSys
Dim PrjType As Long
PrjType = GetProjectionNumber(List2.List(List2.ListIndex))
thePrj.Type = PrjType
Map1.CoordinateSystem = thePrj
End Sub
2构建预定义坐标系对象实例
(1)构建ProjCoordSys实例
ProjCoordSys是投影坐标系对象,下列语句构建预定义投影坐标系
Dim thePrj As New MapObjects2.ProjCoordSys
thePrj.Type = 20137 ‘直接用投影编号构建投影对象实例
thePrj.Type = moProjCS_AGD1966AMG_48 ‘也可用枚举常量构建投影对象实例
(2)构建GeoCoordSys实例
GeoCoordSys是地理坐标系对象,下列语句构建预定义地理坐标系
Dim thePrj As New MapObjects2.GeoCoordSys
thePrj.Type = 4203 ‘直接用坐标系编号构建坐标系对象实例
thePrj.Type = moGeoCS_AGD1984 ‘也可用枚举常量构建坐标系对象实例
3 用投影元数据构建坐标系对象实例
(1)从ShapeFile格式投影元数据构建坐标系对象实例
ArcView和MapObjects投影元数据保存在独立的文件中,文件扩展名是.prj。
MapObjects2.DataConnection对象的成员函数
Function FindCoordinateSystem(Name As String) As Object
读取ArcView格式投影文件,返回一个坐标系对象实例。
例3 读取ArcView格式数据库目录"d:/mobook/sample/data/china2"中的Province.prj文件,构建坐标系对象实例(样例参见ProjectionFromFile目录)。
Private Sub Command1_Click() '用ArcView投影文件构建坐标系对象
Dim DC As New MapObjects2.DataConnection
Dim thePrj As Object
Dim strDataPath As String
strDataPath = ReturnDataPath("china2") ' 数据库目录名
'DC.Database = "d:/mobook/sample/data/china2"
DC.Database = strDataPath
If DC.Connect Then
'用投影文件构建坐标系对象
Set thePrj = DC.FindCoordinateSystem("Province.prj")
If thePrj.IsProjected Then '判断投影对象的类型
Label1.Caption = "thePrj 的类型是 ProjCoordSys"
Else
Label1.Caption = "thePrj 的类型是 GeoCoordSys"
End If
Map1.CoordinateSystem = thePrj '设置地图窗口数据坐标系
End If
End Sub
(2) 用Arc/Info Coverage格式投影元数据文件构建坐标系对象实例
Arc/Info Coverage投影元数据保存在独立的文件中,文件扩展名是prj.adf。MapObjects2.DataConnection对象的成员函数
Function FindArcInfoCoordinateSystem(Name As String) As Object
读取Arc/Info格式投影文件,返回坐标系对象实例。
例4 读取Arc/Info Coverage目录"d:/mobook/sample/data/Coverages/USA"中的投影文件"PRJ.ADF",构建坐标系对象实例(样例参见ProjectionFromFile目录)。
Private Sub Command2_Click()
Dim DC As New MapObjects2.DataConnection
Dim thePrj As Object
Dim strDataPath As String
strDataPath = ReturnDataPath("Coverages") & "/USA" 'Coverage目录名
'dc.Database = "d:/mobook/sample/data/Coverages/USA"
DC.Database = strDataPath
If DC.Connect Then
'用投影文件构建坐标系对象
Set thePrj = DC.FindArcInfoCoordinateSystem("PRJ.ADF")
If thePrj.IsProjected Then '判断投影对象的类型
Label1.Caption = "thePrj 的类型是 ProjCoordSys"
Else
Label1.Caption = "thePrj 的类型是 GeoCoordSys"
End If
Map1.CoordinateSystem = thePrj '设置地图窗口数据坐标系
End If
End Sub
习题
1 编写程序实现例1、例2、例3、例4的功能。
2 在MapObjects2的帮助文档中熟悉Strings对象的成员函数:PopulateWithParameters、PopulateWithProjections、PopulateWithSpheroids,尝试使用这4个函数。
2.7.3 投影变换
1 图层投影变换
对于定义了投影的图层,转换成另一投影的图层,称为图层投影变换。没有定义投影的图层,即没有投影元数据的图层不能进行投影变换。图层投影变换将原图层中的地图坐标数据变换成了新投影下的坐标数据,同时输出新的投影元数据文件。
图层的.Records属性是RecordSet对象的实例。图层投影变换由RecordSet的成员函数
Function Export(OutName As String, [OutCoordSys]) As GeoDataset
完成。这个函数输出经过投影变换后的图层数据文件,并形成新的GeoDataset对象返回。原投影由图层的投影定义元文件提供,不需提供参数,[OutCoordSys]参数指定变换后的投影。原投影和变换后投影类型都可以是ProjCoordSys或GeoCoordSys。因此,这个函数可以完成四种变换类型,如下表所示。
原投影类型 |
变换后投影类型 |
说明 |
GeoCoordSys |
GeoCoordSys |
地理坐标系之间的变换 |
GeoCoordSys |
ProjCoordSys |
地理坐标到投影坐标变换,等价于测量学中的地图投影 |
ProjCoordSys |
GeoCoordSys |
投影坐标到地理坐标变换,投影的逆变换 |
ProjCoordSys |
ProjCoordSys |
两种投影坐标之间的坐标变换 |
四种投影变换类型
例1:Map1中的province图层已经定义投影,将其变换成一种GeoCoordSys预定义投影,输出变换后的图层数据文件到另一目录../DataOut/china2中(参见Project目录中的样例)。
Private Sub Command3_Click() '图层投影变换
Dim recs As MapObjects2.Recordset
Set recs = Map1.Layers("Province").Records
Dim theGC As New MapObjects2.GeoCoordSys
theGC.Type = moGeoCS_Krasovsky1940
Dim thePath As String
thePath = ReturnDataOutPath("china2") '保存输出文件的目录名称
recs.Export thePath & "/province", theGC '变换投影,输出图层数据文件
Map1.CoordinateSystem = theGC '设置地图窗口投影
End Sub
2 图元投影变换
MapObjects2.ProjCoordSys对象的方法
Function Transform(FromCoordSys As Object, FromShape As Object, [DensificationTolerance], [GeoTransformation]) As Object
实现图元的投影变换,返回变换后的图元。图元可以是点、线、面三类几何图形,转换结果的投影由ProjCoordSys实例定义。MapObjects2.GeoCoordSys也有接口及用法完全相同的成员函数Transform。
例2:将上例中的Provice图层中的第一个记录对应的图元进行投影变换,将变换结果在 Map1_AfterTrackingLayerDraw方法中用红色显示(参见Project目录中的样例)。
Dim transShape As MapObjects2.Polygon
Dim theShape As MapObjects2.Polygon
(1) 图元投影变换
Private Sub Command4_Click() '图元投影变换
Dim recs As MapObjects2.Recordset
Set recs = Map1.Layers("Province").Records
Dim thePrj As New MapObjects2.ProjCoordSys
thePrj.Type = moProjCS_Sphere_MillerCylindrical
Set theShape = recs.Fields.Item("shape").Value '欲变换的图元
Dim mapPrj As Object
Set mapPrj = Map1.Layers("Province").CoordinateSystem '引用图层的投影
Set transShape = thePrj.Transform(mapPrj, theShape) '图元投影变换
Map1.CoordinateSystem = thePrj '用新的投影设置地图显示窗口
Map1.CenterAt transShape.Centroid.X, transShape.Centroid.Y '平移窗口中的地图
End Sub
(2)显示变换结果图元
Private Sub Map1_AfterTrackingLayerDraw(ByVal hDC As stdole.OLE_HANDLE)
If Not transShape Is Nothing Then '显示转换投影后的图元
Dim newsym As New MapObjects2.Symbol
newsym.SymbolType = moFillSymbol
newsym.OutlineColor = moRed
newsym.Color = moRed
Map1.DrawShape transShape, newsym ‘绘制变换投影结果图元
Set transShape = Nothing
End If
End Sub
3 地图窗口实时投影变换(Projecting on the fly)
地图控件MapObjects2.Map窗口可以使用与图层不同的投影显示地图。显示过程中进行投影变换,变换结果仅用于显示,不更改图层数据库中的坐标数据,也不更改图层的投影。上例中的语句
Map1.CoordinateSystem = thePrj
实现了这一功能。运行附属盘中的程序,可观察变换后的中国政区图形状发生了变化。
Map1.CoordinateSystem的缺省值是Nothing,这时,Map1.Layers集合中的全部图层的CoordinateSystem值应该全部相同,这样,Map1窗口中显示图层时不进行投影变换,具有较高的显示速度。若在Map1窗口中希望用指定的投影显示地图应执行语句
Map1.CoordinateSystem = thePrj
指定Map1窗口使用的投影。
Mapobjects2.Layer集合中不能同时含有CoordinateSystem属性值有差异的图层。在后续版本中可能取消这一限制,从而实现不同投影的图层在同一窗口中叠置显示。
例 读取鼠标点位置的经纬度。从ProjectionOnFly样例中摘取的的代码如下:
'设置Map1窗口使用GeoCoordSys(地理)坐标系
Map1.CoordinateSystem = Map1.Layers.Item(0).CoordinateSystem.GeoCoordSys
Private Sub Map1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
Dim aPoint As MapObjects2.Point
Set aPoint = Map1.ToMapPoint(X, Y)
Me.Label1.Caption = "经度:" & aPoint.X & " 纬度:" & aPoint.Y
End Sub
从这个例子的运行结果可以看出,执行了语句
Map1.CoordinateSystem = Map1.Layers.Item(0).CoordinateSystem.GeoCoordSys
之后,Map1窗口显示地图时进行了实时投影变换,由投影坐标系转换成了地理坐标系。
4 为图层补充投影元数据
对于ArcView的ShapeFile图层,如果缺失投影元数据,可用MapObjects2投影变换得到投影元数据文件补充,将投影元数据文件(.prj)复制到图层所在的目录并将文件的主名改成图层文件名即可。这一方法也可以应用于MapObjects2形成的图层。
5 输出投影元数据文件
ProjCoordSys及GeoCoordSys对象的方法
Sub Export(OutName As String)
输出投影元数据文件。
例3:将Map1中的图层province投影元数据输出到Sample.prj文件中(参见Project目录中的样例)。
Private Sub Command5_Click() '输出投影元数据文件
Dim thePrj As Object
Dim thePath As String
thePath = ReturnDataOutPath("china2") '保存输出投影元文件的目录名称
Set thePrj = Map1.Layers("Province").CoordinateSystem '引用图层的投影属性
thePrj.Export thePath & "/Sample.prj" ‘输出投影元数据文件
End Sub
例4 计算Map1窗口中鼠标光标位置的经纬度(摘自Project目录中的样例)
Private Sub Map1_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
' 计算鼠标点的经纬度
Dim thePrj As MapObjects2.ProjCoordSys
Dim theGeo As MapObjects2.GeoCoordSys
Dim objPoint As New MapObjects2.Point
Dim retPoint As MapObjects2.Point
Set thePrj = Map1.CoordinateSystem 'Map1窗口显示地图用的投影
'鼠标点窗口坐标转换成地图数据坐标系下的坐标
Set objPoint = Map1.ToMapPoint(X, Y)
Set theGeo = thePrj.GeoCoordSys '投影使用的地理坐标系
Set retPoint = theGeo.Transform(thePrj, objPoint) '投影转换
Me.Label1.Caption = "经度: " & retPoint.X & " 纬度:" & retPoint.Y
End Sub