阅读:2625回复:1
坐标转换 正确设置坐标系[转帖]
在MapX开发中需要特别注意地图坐标系问题,MapX地图坐标系分为地图显示坐标系和内部计算坐标系,两者互为独立,在GIS应用开发中根据应用需要设置好这两种坐标系非常重要,因为坐标系一方面影响软件系统的内部坐标处理,另一方面影响地图的外观显示。Map对象的坐标系及投影通过CoordSys对象的Set方法定义:
Set(Type, [Datum], [Units], [OriginLongitude], [OriginLatitude], [StandardParallelOne], [StandardParallelTwo], [Azimuth], [ScaleFactor], [FalseEasting], [FalseNorthing], [Range], [Bounds], [AffineTransform]) 其中主要参数:Type表示投影类型,Type为1时地图坐标以经纬度表示,后面都为可选参数,其中Datum为地球基准面;Units为坐标单位,如Units为7表示以米为单位;OriginLongitude、OriginLatitude分别为起始经度和纬度;StandardParallelOne、StandardParallelTwo为第一、第二标准纬线,该参数与地图投影相关。 通过设置Map对象的DisplayCoordSys和NumericCoordSys属性返回的CoordSys对象,就可设定地图显示坐标系和内部计算坐标系。举例如下: procedure TMain.DefineMapParam(); var MapDatum: Variant;//地球基准面 begin try MapDatum := CreateOleObject('MapX.Datum.4'); //建立基准面对象 //定义北京54坐标系基准面 // (Ellipsoid, ShiftX, ShiftY, ShiftZ, RotateX, RotateY, RotateZ, ScaleAdjust, PrimeMeridian) MapDatum.set(3, 24, -123, -94, -0.02, 0.25, 0.13, 1.1, 0); //定义北京54坐标系经纬度作为内部计算坐标系 Map1.NumericCoordSys.Set_(1, MapDatum); //定义北京54坐标系30度标准纬线麦卡托投影作为显示坐标系,单位为米 Map1.DisplayCoordSys.Set_(26,MapDatum,7,0,0,30); finally VarClear(MapDatum); end; 坐标系是GIS系统的基石,正确设置坐标系是系统成败的关键。 非地球坐标系如何定义!!!请看!!!!!!! 设置语法: OBJECT.Set Type, [Datum], [Units], [OriginLongitude], [OriginLatitude], [StandardParallelOne], [StandardParallelTwo], [Azimuth], [ScaleFactor], [FalseEasting], [FalseNorthing], [Range], [Bounds], [AffineTransform] 其中type是必须的,其他的根据type指定投影方式的需要进行设置。 type:坐标系种类,定义了一些常量,如0表示非地理坐标系,1表示经纬度坐标系,可参看帮助 [Datum]:Datum对象表示地球形状与方位,可以理解为投影。我们绝大多数时候都是利用mapinfow.prj中记录的Datum,而不会自己去定义一套。 [units]:单位,7表示米,1表示公里,0表示英里。参见帮助 [Bounds]:对非地理坐标系是必需的参数,其他坐标系可选。表示坐标系区域的外框 可以参看帮助中Summary of Parameters Used by Coordinate Systems部分内容确定某种投影所必须参数。 请参照下面一段代码,希望能对大家有所帮助。 var MapBounds: CMapxRectangle; begin // CurrentCoordsys := CreateOleObject('Mapx.Coordsys.3') as CMapXCoordsys; CurrentCoordsys := CoCoordsys.Create; TVarData(VEmpty).VType := VT_ERROR; TVarData(VEmpty).VInteger := DISP_E_PARAMNOTFOUND; MapBounds := CoRectangle.Create; MapBounds.Set_(-1000000, -1000000, 1000000, 1000000); // set coordinate system to Non_earth Metres. CurrentCoordsys.Set_(0, vEmpty, 7, vEmpty, vEmpty, vEmpty, vEmpty, vEmpty, vEmpty, vEmpty, vEmpty, vEmpty, MapBounds, vEmpty); Map1.OleObject.NumericCoordSys := CurrentCoordsys; Map1.OleObject.DisplayCoordsys := Map1.oleObject.NumericCoordsys; -------------------------------------------------------------------------------- 付上VC代码 请看!!! 一般项目用非地理坐标即可.现将VC版本贴上: int CFileExportView::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (CView::OnCreate(lpCreateStruct) == -1) return -1; // TODO: Add your specialized creation code here if (!m_ctrlMapX.Create(NULL, WS_VISIBLE, CRect(0,0,100,100), this,IDC_MAP)) return -1; CMapXRectangle Rect; CMapXCoordSys CurrentCoordsys; COptionalVariant vEmpty; VARIANT MapUnit,MapBounds; if(!Rect.CreateDispatch(Rect.GetClsid()) //!CurrentCoordsys.CreateDispatch(CurrentCoordsys.GetClsid())) { TRACE0("Could not Create object"); return -1; } try { MapUnit.vt=VT_I4; MapUnit.lVal=miUnitMeter; Rect.Set(-1000000, -1000000, 1000000, 100000); MapBounds.vt=VT_DISPATCH; MapBounds.pdispVal=Rect.m_lpDispatch; MapBounds.pdispVal->AddRef(); CurrentCoordsys.Set(miNonEarth, vEmpty,MapUnit, vEmpty, vEmpty, vEmpty, vEmpty, vEmpty, vEmpty, vEmpty, vEmpty, vEmpty,MapBounds, vEmpty); m_ctrlMapX.SetNumericCoordSys(CurrentCoordsys.m_lpDispatch); m_ctrlMapX.SetDisplayCoordSys(m_ctrlMapX.GetNumericCoordSys().m_lpDispatch); m_ctrlMapX.SetGeoSet("E:\\JHPrograme\\GST\\Temp.gst"); CreateCustomTool(); m_ctrlMapX.GetTitle().SetVisible(false); } catch (COleDispatchException *e) { e->ReportError(); e->Delete(); } catch (COleException *e) { e->ReportError(); e->Delete(); } return 0; } |
|
|
1楼#
发布于:2003-10-15 15:59
ding
|
|
|