gis
gis
管理员
管理员
  • 注册日期2003-07-16
  • 发帖数15951
  • QQ
  • 铜币25345枚
  • 威望15368点
  • 贡献值0点
  • 银元0个
  • GIS帝国居民
  • 帝国沙发管家
  • GIS帝国明星
  • GIS帝国铁杆
阅读:2625回复:1

坐标转换 正确设置坐标系[转帖]

楼主#
更多 发布于:2003-10-15 12:42
在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;
}
喜欢0 评分0
GIS麦田守望者,期待与您交流。
wangjh
论坛版主
论坛版主
  • 注册日期2003-08-22
  • 发帖数994
  • QQ55359982
  • 铜币2579枚
  • 威望0点
  • 贡献值0点
  • 银元0个
1楼#
发布于:2003-10-15 15:59
ding
网 站: www.52xoo.com (3S,信息融合,数字图像处理,模式识别与人工智能等专业电子书、学术文章及源代码共享) E-mail: Jianhong72@163.com QQ: 88128745 (55359982用了近10年,最近被盗了,郁闷!!!)
举报 回复(0) 喜欢(0)     评分
游客

返回顶部