2,154
社区成员




l = ft.GetLength();
x = ft.GetCenterX();
y = ft.GetCenterY();
l = ft.GetLength();
tmpx = ft.GetCenterX();
tmpy = ft.GetCenterY();
m_ctrlMapX.ConvertCoord(&tmpx,&tmpy,&x,&y,miScreenToMap);//------------------------1
m_ctrlMapX.SetNumericCoordSys(m_ctrlMapX.GetDisplayCoordSys().m_lpDispatch);//---------------------2
l = ft.GetLength();
x = ft.GetCenterX();
y = ft.GetCenterY();
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("isoLayer").AddFeature(newline);//----------------3
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();
m_ctrlMapX.SetNumericCoordSys(m_ctrlMapX.GetDisplayCoordSys().m_lpDispatch);
CMapXFeature FindF;
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 );
FindFlg = 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){
}
}
m_ctrlMapX.GetLayers().Item("isoLayer").AddFeature(newline);
// 加载地图(原地图为笛卡尔坐标)
// 创建等值线的图层,此时的新图层应该也是笛卡尔坐标:
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);