譚清華,張明
(南寧市勘測院,廣西南寧 530000)
我國于上世紀50年代和80年代,分別建立了1954年北京坐標系和1980西安坐標系,為國民經濟建設和社會發展提供了基礎的測繪保障。隨著社會進步,經濟建設、國防建設、科學研究等對國家大地坐標系提出了新的要求,迫切需要采用原點位于地球質量中心的坐標系統(以下簡稱地心坐標系)作為國家大地坐標系。國務院批準自2008年7月1日啟用我國的地心坐標系—2000國家大地坐標系,英文名稱為China Geodetic Coordinate System 2000,英文縮寫為CGCS2000。
為了及時采用CGCS2000,各城市首要任務是建立一個與CGCS2000相聯系的、相對獨立和統一的、適宜本地區建設需要的城市或地方坐標系。為此,需要完成的工作之一是完成現有測繪成果的更新改造,保證過渡期內現有成果及CGCS2000成果的共存共用,為CGCS2000正式啟用奠定基礎。
我國的測繪成果多以CAD的DWG格式或DXF格式存儲,其中DWG格式是二進制文件,而DXF文件是文本文件,因此DWG文件占用的存儲空間較小,程序啟動的速度較快,絕大部分成果采用DWG文件存儲,而且DWG與DXF之間可以互相轉換,因此本文主要討論在CAD環境下DWG文件的坐標轉換。
由于AutoCAD并沒帶有坐標轉換模塊,因此要實現相應的功能,必須進行二次開發,AutoCAD提供的開發工具主要有 Visual AutoLISP、ObjectARX和 VBA、.NET API。本文采用的是 ObjectARX。ObjectARX是一個以C++語言為基礎的面向對象的開發環境和應用程序接口,ObjectARX并不是獨立的開發平臺,而是運行于Visual C++平臺之上。ObjectARX程序本質上是Windows動態鏈接庫(DLL)。
ObjectARX作為Visual C++動態鏈接庫與其他的動態鏈接庫有著很大的區別,ObjectARX程序在C++語言的基礎上規定了自己的語法,它是專門用來對AutoCAD進行二次開發的工具。因此可以說ObjectARX是Visual C++的一個子集。
為了充分利用已有測繪成果,必須將已有測繪成果轉換到CGCS2000坐標系,因此不同坐標系之間相互轉換是CGCS2000正式啟用后必須解決的技術問題。通常情況下,大范圍高精度坐標轉換任務采用空間七參數法來實現,而小范圍高斯平面坐標的轉換采用平面四參數法來實現。由于數字地形圖數據均采用分幅存儲,即每一幅圖的范圍有限,因此本文采用四參數法實現圖形的坐標轉換,坐標轉換程序流程圖如圖1所示。

圖1 坐標轉換程序流程圖
對圖形中點對象的轉換只需對坐標值進行轉換,其對應的ObjectARX類為AcDbPoint。通過該類的Position()函數可以獲取該點的坐標信息,然后根據第二節所述的方法得到轉換之后的坐標。調用setPosition()函數設定轉換之后的坐標即可。
直線對應的ObjectARX類為AcDbLine,直線由起點與終點連接而成,可以通過該類的startPoint()與endPoint()函數分別獲取起點和終點的坐標。之后根據第二節所述的方法得到轉換之后的坐標。然后分別調用該類的setStartPoint()與setEndPoint()函數設定坐標即可。
多段線對應的ObjectARX類為AcDbPolyline。多段線可以通過調用該類的numVerts()函數獲取總點數,然后通過調用該類的getPointAt()函數獲取每個頂點的坐標。然后根據第二節所述的方法得到轉換之后的坐標。通過調用該類的setPointAt()函數設置轉換之后的坐標。
二維多段線對應的 ObjectARX類為AcDb2dPolyline。通過調用該類的vertexIterator()函數獲取遍歷該類頂點的指針。該指針對應的類為AcD-bObjectIterator,以該指針為參數調用二維多段線的openVertex函數,可以獲取該指針對應的頂點。該頂點對應的類為AcDb2dVertex。,利用該頂點的position()函數,則可以獲取該頂點的坐標。然后根據第二節所述的方法得到轉換之后的坐標。調用該頂點的set-Position()函數,則完成了該頂點的轉換。繼續如此程序遍歷整條二維多段線即可以完成坐標轉換。
三維多段線對應的 ObjectARX類為AcDb3dPolyline。三維多段線的坐標轉換方法與二維多段線類似,只是遍歷過程中的頂點對應的類變為AcDb3dPolylineVertex,其他與(4)所述二維多段線坐標轉換程序相同。
圓弧對應的ObjectARX類為AcDbArc。調用該類的center()獲取該類的中心點坐標。,然后根據第二節所述的方法得到轉換之后的中心點坐標。調用該類的setCenter()函數即可以設置轉換之后的坐標。可以調用startAngle()與endAngle()函數獲取起始和終止角度,然后加上根據第二節所述的方法得到轉換之后旋轉的角度。調用setStartAngle()與setEndAngle()設置轉換之后的角度。由于坐標轉換通常尺度變化很小,因此對圓弧的半徑無需改變,至此即完成了圓弧的坐標轉換。
形所對應的ObjectARX類為AcDbShape,可以通過調用該類的position()函數獲取該類的坐標信息。然后根據第二節所述的方法得到轉換之后的坐標。調用該類的setPosition()函數實現坐標轉換。由于地形圖中形的指向始終指北,因此無需設置角度變化。
圓所對應的ObjectARX類為AcDbCircle。調用該類的center()獲取該類的中心點坐標,然后根據第二節所述的方法得到轉換之后的坐標。調用該類的set-Center()函數即可以設置轉換之后的中心點坐標。由于坐標轉換通常尺度變化很小,因此對圓的半徑無需改變。至此即完成了圓的坐標轉換。
橢圓所對應的ObjectARX類為AcDbEllipse。橢圓與圓弧的轉換程序類似。
實線對應的ObjectARX類為AcDbSolid。實線有4個頂點,只需通過getPointAt()函數獲取每一個頂點坐標,然后通過程序獲取轉換之后的坐標。再利用set-PointAt()函數設置相應的坐標即可。
單行文字對應的ObjectARX類為AcDbText,可以通過調用該類的position()函數獲取文字的坐標信息,然后根據第二節所述的方法得到轉換之后的坐標。調用setPosition()函數設置轉換之后的坐標。至此完成坐標轉換。
多行文字對應的ObjectARX類為AcDbMText,可以通過調用該類的location()函數獲取文字的坐標信息,然后根據第二節所述的方法得到轉換之后的坐標。調用setLocation()函數設置轉換之后的坐標。至此完成坐標轉換。
多段線對應的ObjectARX類為AcDbLeader。多段線可以通過調用該類的numVertices()函數獲取總點數。調用該類的vertexAt()函數獲取每個頂點的坐標,然后根據第二節所述的方法得到轉換之后的坐標。調用該類的setVertexAt()函數設置轉換之后的坐標。
標注分為6類:對齊標注、轉角標注、半徑標注、角度標注、直徑標注、坐標標注。地形圖中通常用到的為對齊標注與轉角標注,其他沒有用到。他們對應的ObjectARX類分別為 AcDbRotatedDimension、AcD-bAlignedDimension。轉角標注對應的textPosition()可以獲取調用的頂點,然后根據第二節所述的方法得到轉換之后的坐標。調用setTextPosition()可以設置轉角標注的文字位置。調用dimLinePoint()函數可以獲取該尺寸通過的一點坐標,然后根據第二節所述的方法得到轉換之后的坐標。可以調用setDimLinePoint()設置該點坐標。調用xLine1Point()函數可以獲取第一條尺寸邊界點的坐標信息,然后根據第二節所述的方法得到轉換之后的坐標。可以調用setXLine1Point()函數設置第一條尺寸邊界點的坐標。調用xLine2Point()函數可以獲取第二條尺寸邊界點的坐標信息,然后根據第二節所述的方法得到轉換之后的坐標。可以調用setXLine2Point()函數設置第二條尺寸邊界點的坐標。對齊標注與此相同。
塊參照對應的ObjectARX類名為AcDbBlockReference,可以通過position()獲取塊所在的基點坐標,然后根據第二節所述的方法得到轉換之后的坐標。調用函數setPosition()函數設置轉換之后的坐標。之后調用函數transformBy()實現塊參照整體轉換。此函數的參數為轉換后基點坐標與原基點坐標的構成向量。
完成現有測繪成果向CGCS2000的改造,保證過渡期內現有成果及CGCS2000成果的共存共用,是CGCS2000正式啟用必須解決的技術問題。由于DWG文件存儲量小,并且啟動速度快的特點,目前國內的地形圖數據主要是以DWG文件格式存儲,因此實現DWG文件從傳統的參心坐標系向CGCS2000轉換是很有現實意義的。本文通過對ObjectARX中地形圖常用實體類的研究,實現了地形圖中常用實體的坐標轉換。
[1]李征航,黃勁松.GPS測量與數據處理[M].武漢大學出版社,2005,3(1).
[2]CJJ 8-99.城市測量規范[S].
[3]曾祥新,譚清華,黃炳強.一種2000國家大地坐標系與參心坐標系間的轉換方法[J].廣西科學,2010(11):340~342.
[4]姚宜斌,孔建.基于DXF文件的圖件轉換方法研究及程序實現[J].大地測量與地球動力學,2011(1):117~122.
[5]董玉德,趙韓.CAD二次開發理論與技術[M].合肥工業大學出版社,2009,11(1).
[6]張帆,鄭立楷,王華杰.AutoCAD VBA開發精彩實例教程[M].清華大學出版社,2004,4(1).