MapObejcts组件应用设计(投影与地图数据坐标系)

时间:2022-02-08 02:15:16

2.7.1 投影与地图数据坐标系对象

MapObjects定义的投影模型特殊,使用的术语特殊,本节讲述的内容只适用于MapObjects组件程序设计。

将地物的地理坐标(经纬度)转换成平面直角坐标称为投影。地图数据用平面直角坐标表示,称为IsProjected(已经投影),地图数据用地理坐标表示称为 Not IsProjected(未经投影)

Map.CoordinateSystem属性

MapLayer.CoordinateSystem属性

ProjCoordSys实例

GeoCoordSys实例

Projection属性

GeoCoordSys属性

SetParameter方法

Datum属性

2-7-1 地图数据坐标系对象结构

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Map1定义投影可以按上图进行。创建一个ProjCoordSys实例,设置实例属性ProjectionGeoCoordSys中的参数,用实例的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

指定了使用1940Krasovsky椭球体参数,完整地定义了地理坐标系。

枚举常量名

注释

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.0335232986925914Datum.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.TypeGeoCoordSys.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度,双标准纬线2547度,地理经纬度坐标系采用国际标准。输出投影定义文件(样例见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可以引用ProjCoordSysGeoCoordSys实例。当引用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 中省略了的细节,将GeoCoordSysProjCoordSysDatumSpheroidProjection的属性和方法添加到图中。查阅帮助,概要了解怎样使用这些属性和方法。

2 编写程序实现例题12的功能。用Windows的写字版查看例题1输出的文件中的内容,猜测文件中各个数据的含义,将文件中的数据分为3组:投影参数组、Projection参数组、GeoCoordSys参数组。

2.7.2 构建坐标系对象实例

MapObjects2有两个坐标系对象:GeoCoordSysProjCoordSys。前者用于地理坐标系,后者用于投影坐标系。

1 MapObjects2.Strings 对象

MapObjects2预定了大量投影,为每个预定义投影编一个号码,通过号码引用预定投影。为编程方便,将预定义投影的说明文字及其编号组合成一个字符串。在MapObjects2.Strings中设计了专门的方法拣取这些字符串。MapObjects2将地图的坐标系统分为两类:投影坐标系和经纬度坐标系,分别用两个类描述:ProjCoordSysGeoCoordSys。与此对应,在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格式投影元数据构建坐标系对象实例

ArcViewMapObjects投影元数据保存在独立的文件中,文件扩展名是.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.adfMapObjects2.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对象的成员函数:PopulateWithParametersPopulateWithProjectionsPopulateWithSpheroids,尝试使用这4个函数。

2.7.3 投影变换

1 图层投影变换

对于定义了投影的图层,转换成另一投影的图层,称为图层投影变换。没有定义投影的图层,即没有投影元数据的图层不能进行投影变换。图层投影变换将原图层中的地图坐标数据变换成了新投影下的坐标数据,同时输出新的投影元数据文件。

图层的.Records属性是RecordSet对象的实例。图层投影变换由RecordSet的成员函数

Function Export(OutName As String, [OutCoordSys]) As GeoDataset

完成。这个函数输出经过投影变换后的图层数据文件,并形成新的GeoDataset对象返回。原投影由图层的投影定义元文件提供,不需提供参数,[OutCoordSys]参数指定变换后的投影。原投影和变换后投影类型都可以是ProjCoordSysGeoCoordSys。因此,这个函数可以完成四种变换类型,如下表所示。

原投影类型

变换后投影类型

说明

GeoCoordSys

GeoCoordSys

地理坐标系之间的变换

GeoCoordSys

ProjCoordSys

地理坐标到投影坐标变换,等价于测量学中的地图投影

ProjCoordSys

GeoCoordSys

投影坐标到地理坐标变换,投影的逆变换

ProjCoordSys

ProjCoordSys

两种投影坐标之间的坐标变换

四种投影变换类型

 

1Map1中的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 为图层补充投影元数据

对于ArcViewShapeFile图层,如果缺失投影元数据,可用MapObjects2投影变换得到投影元数据文件补充,将投影元数据文件(.prj)复制到图层所在的目录并将文件的主名改成图层文件名即可。这一方法也可以应用于MapObjects2形成的图层。

5 输出投影元数据文件

ProjCoordSysGeoCoordSys对象的方法

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