【MapX】100求助,在图层上划线时的坐标转换问题,不够再加
--------------------编程问答-------------------- 前两个问题似乎和地图的坐标系设置有关。你在你准备绘制等值线前加上 m_ctrlMapX.ConvertCoordV(&x1,&y1,&x2,y2,miMapToScreen);把坐标系从地图的转换为屏幕坐标,再输出看看吧,应该可以的 --------------------编程问答-------------------- 谢谢楼上的回复。我想您的意思是这样的
// 加载地图(原地图为笛卡尔坐标)
// 创建等值线的图层,此时的新图层应该也是笛卡尔坐标:
m_ctrlMapX.GetLayers().CreateLayer("isoLayer",NULL,1);
// 物理坐标系 = 屏幕坐标系
//(这样才能保证取到图元取到正确的物理坐标,是我在原帖中注释1处ConvertCoord无效的权宜之计)
// 物理坐标系 = 物理坐标系备份--------------------------------------------物理坐标系还原
// 根据物理坐标计算生成等值点……
// 开始绘制等值线:
float mx1, mx2, my1, my2;
m_ctrlMapX.ConvertCoord(&mx1,&my1,&x1,&y1,miMapToScreen);
m_ctrlMapX.ConvertCoord(&mx2,&my2,&x2,&y2,miMapToScreen);
//设置断点后看到,x1,y1,x2,y2这些的值等于屋里坐标,而mx1, mx2, my1, my2等于屏幕坐标
pts.AddXY(mx1, my1);
pts.AddXY(mx2, my2);
//pts.AddXY(x1, y1);
//pts.AddXY(x2, y2);
newline.GetParts().Add(pts);
ftrName.Format("%.2f",isoline_list[i]->noise);
newline.SetKeyValue(ftrName);
m_ctrlMapX.GetLayers().Item("tempLayer").AddFeature(newline);
这样的绘图结果还是远远偏离。
而且,无论我加不加“物理坐标系还原”那句话,都是同样的效果。
可以肯定是坐标系的问题,但我不知道怎么解决。
CMapXPoints.AddXY(x, y);这个方法要求输入物理坐标。但我在原帖中注释3的地方输入物理坐标还是不能正确绘图。当然了,输入屏幕坐标更不能正确绘图。
看到两个帖子:
http://www.gisforum.net/bbs/dispbbs.asp?boardid=33&id=70788
http://www.cnblogs.com/maweifeng/archive/2006/09/25/512705.html
还是没有找到解决办法,希望能给各位提供点解决思路。
希望大家帮我找出错误,谢谢大家,自己实在有点无力。
--------------------编程问答-------------------- 楼上写的有点笔误。程序的最后一句是
m_ctrlMapX.GetLayers().Item("isoLayer").AddFeature(newline);
--------------------编程问答-------------------- 顶
------------------------ --------------------编程问答-------------------- 据说每天回帖有10分可 以得 --------------------编程问答-------------------- 大致看了一下楼主的问题,
前面两个不说了,控件必须要先初始化一个地图才能进行相应的坐标转换,而且这个地图必须和你当前要计算的经纬度等对应。
最后一个问题,
l = ft.GetLength();
tmpx = ft.GetCenterX();
tmpy = ft.GetCenterY();
如果tmpx和tmpy都是屏幕坐标,你再用ConvertCoord转换的话是肯定会有误差的,这个问题我也遇到过,而且根据地图的放大比率不同,误差也不相同。
楼主应该直接去找到ft的经纬度坐标。
可以试试,ft.GetParts().Item( ** ).Item( ** ).GetX()
**索引值,一般是这样的 图元--部分--点集--点 这个点可就是经纬度了。
我想楼主最想知道的就是这个经纬度吧。 --------------------编程问答-------------------- 我这里有一段找图元的代码你看看,参考一下吧:
CMapXFeature FindF;--------------------编程问答-------------------- mark --------------------编程问答-------------------- To Tinary3v0:
FindF.CreateDispatch( FindF.GetClsid( ) );
FindF.Attach( pMap->GetDispatch( FALSE ) ); //建立一个临时图元
FindF = fs.Item ( j ).Clone( ); //拷贝找到的图元
short pattern = FindF.GetType( ); //这里要使图元高亮显示的话,需要知道图元到底是什么类型的
//不然下面设定图元高亮属性(例如内部填充为绿色 边线为红色)的时候不知道要设置那个了。
if( pattern == miFeatureTypeRegion ) //区域图元
{
FindF.GetStyle().SetRegionColor( RGB(255,0,0));
}else if( pattern == miFeatureTypeLine ){ //我看你地图中的图元都是直线 所以就只写了这一个里面的代码
FindF.GetStyle().SetLineColor( RGB( 255, 0, 0 ) ); //这里直接将图元的线都设置成了红色
//------------------------------------------------------------------------------------
//其实上面把直线直接设置成了红色就可以了,但是总觉得不明显,于是我就去找了图元的所有点 然后用这些点
//又建立了一个区域,并将这个区域设定了颜色加到了临时图层当中。
CMapXPoints FndP;
FndP.CreateDispatch( FndP.GetClsid( ) ); //总点集
int pNm = FindF.GetParts().GetCount( ); //块个数
for( int i = 1; i<= pNm; i++ )
{
CMapXPoints tmP = FindF.GetParts().Item( i ); //每一个块有多个点集
int k = tmP.GetCount( ); //点集中有多个点
for( int m = 1; m<= k; m ++ )
{
FndP.Add( tmP.Item( m ) ); //全部累加到了总点集当中,这里应该是按照一定的规则处理一下 我这里只是简单的累加
}
}
pMap->SetCenterX( FindF.GetParts().Item( 1 ).Item( 1 ).GetX() ); //将地图视图调整到当前图元为中心
pMap->SetCenterY( FindF.GetParts().Item( 1 ).Item( 1 ).GetY() ); //这里也是简单的用了第一个块的第一个点
CMapXFeature FindR; //建立一个新的图元
FindR.CreateDispatch( FindR.GetClsid( ) );
FindR.Attach( pMap->GetDispatch( FALSE ) );
FindR.SetType( miFeatureTypeRegion ); //设定图元为区域图元,下面为设置区域的一些属性
FindR.GetStyle().SetRegionBackColor( RGB( 0,0,255 ) );
FindR.GetStyle().SetRegionBorderColor( RGB( 255,0,0) );
FindR.GetStyle().SetRegionBorderWidth( 2 );
FindR.GetStyle().SetRegionPattern(miPatternSolid);
FindR.GetStyle().SetRegionTransparent( FALSE );
FindR.GetStyle().SetRegionColor( RGB( 0,255, 0 ) );
FindR.GetParts().Add( FndP ); //设定区域图元的点集
//------------------------------------------------------------------------------------
ly1.AddFeature( FindF );
ly1.AddFeature( FindR );
Find易做图 = TRUE;
break;
}else if( pattern == miFeatureTypeSymbol){
}else if( pattern == miFeatureTypeMixed){
}else if( pattern == miFeatureTypeUnknown){
}else if( pattern == miFeatureTypeText){
}else if( pattern == miFeatureTypeNull){
}else if( pattern == miFeatureTypeMultipoint){
}else if( pattern == miFeatureTypeCollection){
}
}
您好!首先感谢您的热情回复!
1 我的取坐标和画图操作都是在同一个gst中的不同图层中进行的(取是在gst中原有的一个图层,画图是程序在此gst中新建的一个图层),假如我没动过坐标系的话,我认为它们的坐标系默认应该是相同的。
2 您提供的方法也对的,我以前在代码里就是这么做的。找到一个线图元,再找到它的两个端点。
CMapXParts sectParts = ft.GetParts();
CMapXPoints sectPoints = sectParts.Item(1);
rd->x1 = sectPoints.Item(1).GetX();
rd->y1 = sectPoints.Item(1).GetY();
rd->x2 = sectPoints.Item(2).GetX();
rd->y2 = sectPoints.Item(2).GetY();
但是这种方法能得到正确XY值结果的前提,是提前将物理坐标系设成显示坐标系!
m_ctrlMapX.SetNumericCoordSys(m_ctrlMapX.GetDisplayCoordSys().m_lpDispatch);
如果提前不写上面这句,还是得不到正确的结果。
3 我现在的问题是:在将物理坐标系设成显示坐标系、正确得到线图元端点XY值进行OOXX运算之后,得到了新的端点XY值,却不能正确画到图层上,无论怎么设坐标都不行(恢复原物理坐标系、将显示坐标系设成原物理坐标系、对XY进行ConvertCoord从地图到屏幕从屏幕到地图都试过了……),甚至画到原图层都不行!杯具啊……
4 您给我的代码与我所做的有一个区别是:您的代码中,线段端点自始自终是用CMapXPoint表示的,只是把一堆CMapXPoint收集起来绘制到另外一个地方;我的代码中,绘图使用的线段端点都是自己new出来的,在中间OOXX运算时,我只是用到了原端点的XY值。或许问题就出在这里呢……虽然我也觉得这不应该是问题的症结所在,还是说明出来让大大看看吧。
5 原gst是笛卡尔坐标。我计算出来的端点物理XY值,在调试时明明与某个参照点只有几百米的距离,但是一绘图出来……就有几万米的距离。
已经一个礼拜了……求解释,求指点,求安慰。请多指教! --------------------编程问答-------------------- 顶
~~~~~~~~~~~~~~~~~ --------------------编程问答-------------------- http://topic.csdn.net/u/20100730/10/f31b7ca5-a17b-4cee-9a16-bd29326fbeb9.html?seed=1511378981&r=67422827#r_67422827
我的帖子也遇到这个问题,也还没有解决,在实际中不停地得到经度和纬度 然后转换成 屏幕坐标的过程中 有些转换后的点偏差太大了,郁闷。貌似老版本的Mapx都没有这个问题。。。 --------------------编程问答--------------------
补充:企业软件 , 地理信息系统