要素类在不同坐标系间转换的问题
这两天接到一个关于要素类在不同坐标系之间转换的任务。由于许多城市的基础测绘都是使用本地坐标系,而并非一定使用54,80或84座标,因此往往需要进行座标转换。这种转换也不能象在ArcMap中改变投影那么简单,往往是一个座标系中的某个点通过某种转换,得到在另一个坐标系的点座标。
其实这种转换方式说穿了非常简单,既然可以一个点一个点转换,那么对于点要素类,可以直接计算出新点后保存到新的要素类;多义线和多边形则使用IPointCollection接口逐个取出点计算,然后再组成一个要素保存到新要素类中。源要素类与新要素类的字段结构是一致的。但是,问题就出在这里,我们知道,这样改变以后,新要素类的空间范围spatial extent与源要素类的空间范围完全不一致,因此我遇到的第一个问题就是,如何在知道新的空间范围的情况下,新建一个与源要素类结构相同的新要素类。
有没有可能改变一个要素类的spatial extent呢,EDN讨论的结果是完全没有可能。那解决这个问题的方法只能是这样,新建一个Fields对象,除了Geometry字段自己手动设计外,其它字段都从源要素类中copy,这样就可以新建一个字段结构一致但空间范围不一样的要素类。在这个字段集的设计中,还要注意,如果是点要素类,则需要设置Z M值可用,如果是多义线或多边形,Z和M值就设置为false。
Dim pFieldsEdit As IFieldsEdit
Set pFieldsEdit = New Fields
'产生geometry字段
Dim pGeomDef As IGeometryDef
Set pGeomDef = New GeometryDef
Dim pGeomDefEdit As IGeometryDefEdit
Set pGeomDefEdit = pGeomDef
Dim pSR As ISpatialReference
Set pSR = New UnknownCoordinateSystem
'设置新的spatial domain
pSR.SetDomain pEnvs.XMin, pEnvs.XMax, pEnvs.YMin, pEnvs.YMax
With pGeomDefEdit
.GeometryType = geomType
.GridCount = 1
.GridSize(0) = 10
.AvgNumPoints = 2
Set .SpatialReference = pSR
End With
'如果是点,则设置M和Z值
Select Case geomType
Case esriGeometryPoint
pGeomDefEdit.HasM = True
pGeomDefEdit.HasZ = True
Case Else
pGeomDefEdit.HasM = False
pGeomDefEdit.HasZ = False
End Select
Dim pField As IField
Dim pFieldEdit As IFieldEdit
Set pField = New Field
Set pFieldEdit = pField
pFieldEdit.Name = "SHAPE"
pFieldEdit.AliasName = "Geometry"
pFieldEdit.Type = esriFieldTypeGeometry
Set pFieldEdit.GeometryDef = pGeomDef
pFieldsEdit.AddField pField
在座标转换中,需要特别注意标注要素类的转换,Annotation要素类本身有一个SHAPE,它还关联一个TextElement对象,而TextElement也有SHAPE,因此在转换的时候,必须将两个SHAPE都进行转换,否则要素根本添加不进要素类中,因为不在空间范围之内。但问题也出在这里,我在转换中发现,靠近边缘的某些Annotation要素的TextElement转换后,其位置落在了转换后的空间范围之外,这点需要特别注意。
Related Items
Or, take a look at Archives and Categories
怎样在arcgis中的一个涂层里面的点要素 转变为另一个shp文件(点元素)中的点元素呢? 请教啊!