面朝大海,春暖华开

focus on scientific computue, 3dgis, spatial database
专注于科学计算、GIS空间分析

 

arcEngine 经典代码-编辑

1 [vc]geo包装1

link: http://blog.csdn.net/gm316/archive/2007/10/07/1813634.aspx

void CagGeometrys::AddTrack(CMapControlDefault &mc, hdcGeometryType gt,long button, long shift, long x, long y, double mapX, double mapY)
{
 //演示rubber的操作,mc中才提供包装结果track,在vba中应该用rubber
 if(e_bUnique)
  e_geos.clear();

 switch(gt)
 {
 case gt_Point:
  {
   IPointPtr pt(__uuidof(Point));
   pt->PutCoords(mapX,mapY);
   IGeometryPtr *g=new IGeometryPtr;
   (*g)=pt;
   e_geos.insert(e_geos.end(),g);
  }
  break;
 case gt_Rectangle:
  {
   IEnvelopePtr env=mc.TrackRectangle();
   IGeometryPtr *g=new IGeometryPtr;
   (*g)=env;
   e_geos.insert(e_geos.end(),g);
  }
  break;

 case gt_Polyline:
  { /*
   IPolylinePtr pl=mc.TrackLine();
   IGeometryPtr *g=new IGeometryPtr;
   (*g)=pl;
   e_geos.insert(e_geos.end(),g);
   */
   
   IActiveViewPtr av;
   IScreenDisplayPtr sd;
   av=mc.GetActiveView();
   av->get_ScreenDisplay(&sd);

   ISymbolPtr sym;
   IGeometryPtr *geo=new IGeometryPtr;
   IRubberBandPtr rp(__uuidof(RubberLine));
   rp->TrackNew(sd,sym,&(*geo)); //应该可以在track就有symbol效果
   e_geos.insert(e_geos.end(),geo);

   //转换用QI,应该ok
   //IPolylinePtr line;
   //line=*geo;
  }
  break;

 case gt_Circle:
  {
   IPolygonPtr c=mc.TrackCircle();
   IGeometryPtr *g=new IGeometryPtr;
   (*g)=c;
   e_geos.insert(e_geos.end(),g);
  }
  break;

 case gt_Polygon:
  {
   IPolygonPtr pg=mc.TrackPolygon();
   IGeometryPtr *g=new IGeometryPtr;
   (*g)=pg;
   e_geos.insert(e_geos.end(),g);
  }
  break;

 case gt_Text_Point:
  {

   textInfo *ti=new textInfo;
   IPointPtr pt(CLSID_Point);
   pt->PutCoords(mapX,mapY);
   ti->geo=pt;

   IGetStringDialogPtr gsd(__uuidof(GetStringDialog));
   short res;
   gsd->DoModal(L"title",L"label",L"",NULL,&res);
   CComBSTR bstr;
   CString str;
   gsd->get_Value(&bstr);
   str=bstr;
   strcpy(ti->text,str);
   
   e_texts.insert(e_texts.end(),ti);

  }
  break;

 case gt_Text_Polyline:
  {
   textInfo *ti=new textInfo;
   ti->geo=mc.TrackLine();

   IGetStringDialogPtr gsd(__uuidof(GetStringDialog));
   short res;
   gsd->DoModal(L"title",L"label",L"",NULL,&res);
   CComBSTR bstr;
   CString str;
   gsd->get_Value(&bstr);
   str=bstr;
   strcpy(ti->text,str);
   
   e_texts.insert(e_texts.end(),ti);

  }
  break;

 case gt_Text_Polygon:
  {

   textInfo *ti=new textInfo;
   ti->geo=mc.TrackPolygon(); //可以模拟圆形,矩形等

   IGetStringDialogPtr gsd(__uuidof(GetStringDialog));
   short res;
   gsd->DoModal(L"title",L"label",L"",NULL,&res);
   CComBSTR bstr;
   CString str;
   gsd->get_Value(&bstr);
   str=bstr;
   strcpy(ti->text,str);
   
   e_texts.insert(e_texts.end(),ti);

  }
  break;

 }

 IActiveViewPtr av=mc.GetActiveView();
 av->Refresh();
}

void CagGeometrys::Draw(CMapControlDefault &mc)
{
 //draw geometry
 long i,count;
 count=e_geos.size();
 for(i=0;i<count;i++)
 {
  mc.DrawShape((*e_geos[i]),NULL);
 }

 {
  ISelectionTrackerPtr sk;
  sk.CreateInstance(__uuidof(EnvelopeTracker));

  IActiveViewPtr av=mc.GetActiveView();
  IScreenDisplayPtr sd;
  av->get_ScreenDisplay(&sd);

  IEnvelopePtr env;
  count=e_sels.size();
  for(i=0;i<count;i++)
  {
   (*e_sels[i])->get_Envelope(&env);
   sk->put_Geometry(env);
   sk->Draw(sd,NULL,esriTrackerDominant);
  }
 }

 //文本
 count=e_texts.size();
 for(i=0;i<count;i++)
 {
  IMapPtr map=mc.GetMap();
  IActiveViewPtr av=mc.GetActiveView();
  IScreenDisplayPtr sd;
  av->get_ScreenDisplay(&sd);
/* 屏幕中间
  ITextSymbolPtr t(__uuidof(TextSymbol));
  IFontDispPtr f; //无用途
  t->get_Font(&f);
  t->put_Size(18.0);
  OLE_HANDLE hdc;
  sd->get_hDC(&hdc);
  sd->StartDrawing(hdc,esriNoScreenCache);
  ISymbolPtr s=t;
  sd->SetSymbol(s);
  IAreaPtr a;
  IDisplayTransformationPtr dt;
  sd->get_DisplayTransformation(&dt);
  IEnvelopePtr e;
  dt->get_VisibleBounds(&e);
  a=e;
  IPointPtr pt;
  a->get_Centroid(&pt);
  sd->DrawText(pt,L"test");
*/
  ITextSymbolPtr t(__uuidof(TextSymbol));
  IColorPtr c(__uuidof(RgbColor));
  c->put_RGB(RGB(0,0,255));
  t->put_Color(c);
  IFontDispPtr f; //无用途
  t->get_Font(&f);
  t->put_Size(18.0);
  OLE_HANDLE hdc;
  sd->get_hDC(&hdc);
  sd->StartDrawing(hdc,esriNoScreenCache);
  ISymbolPtr s=t;
  sd->SetSymbol(s);
  USES_CONVERSION;
  //点位置是字符底部中间
  sd->DrawText(e_texts[i]->geo,A2W(e_texts[i]->text));
  sd->FinishDrawing();
 }
}

void CagGeometrys::HitTest(double x, double y)
{
 /*
esriGeometryNull          = 0
esriGeometryPoint         = 1
esriGeometryMultipoint    = 2
esriGeometryPolyline      = 3
esriGeometryPolygon       = 4
esriGeometryEnvelope      = 5
esriGeometryPath          = 6
esriGeometryAny           = 7
esriGeometryMultiPatch    = 9
esriGeometryRing          = 11
esriGeometryLine          = 13
esriGeometryCircularArc   = 14
esriGeometryBezier3Curve  = 15
esriGeometryEllipticArc   = 16
esriGeometryBag           = 17
esriGeometryTriangleStrip = 18
esriGeometryTriangleFan   = 19
esriGeometryRay           = 20
esriGeometrySphere        = 21
*/
/*
HRESULT HitTest(
  IPoint* QueryPoint,
  double searchRadius,
  esriGeometryHitPartType geometryPart,
  IPoint* hitPoint,
  double* hitDistance,
  long* hitPartIndex,
  long* hitSegmentIndex,
  VARIANT_BOOL* bRightSide,
  VARIANT_BOOL* bHit
);
*/
 e_sels.clear();
 
 esriGeometryType gt;
 long i,count=e_geos.size();
 for(i=0;i<count;i++)
 {
  (*e_geos[i])->get_GeometryType(&gt);
  switch(gt)
  {
  case esriGeometryPoint:
   { //OK,但是被选择的显示方式有问题
    IHitTestPtr ht;
    IPointPtr pt;
    pt=e_geos[i];
    ht=pt;

    IPointPtr qp(__uuidof(Point));
    qp->PutCoords(x,y);

    IPointPtr hp(__uuidof(Point));
    double hd;
    long hpi,hs;
    short rs,h;
    ht->HitTest(qp,5.0,esriGeometryPartBoundary,hp,&hd,&hpi,&hs,&rs,&h);

    if(h==-1)
    {
     e_sels.insert(e_sels.end(),e_geos[i]);
    }
   }
   break;
  case esriGeometryPolyline:
   {
    IHitTestPtr ht;
    IPolylinePtr pl;
    pl=e_geos[i];
    ht=pl;

    IPointPtr qp(__uuidof(Point));
    qp->PutCoords(x,y);

    IPointPtr hp(__uuidof(Point));
    double hd;
    long hpi,hs;
    short rs,h;
    ht->HitTest(qp,5.0,esriGeometryPartBoundary,hp,&hd,&hpi,&hs,&rs,&h);

    if(h==-1)
    {
     e_sels.insert(e_sels.end(),e_geos[i]);
    }
   }
   break;

  case esriGeometryEnvelope:
  case esriGeometryPolygon:
   {
    IPointPtr qp(__uuidof(Point));
    qp->PutCoords(x,y);

    IRelationalOperatorPtr ro;
    ro=e_geos[i];
    short yes;
    ro->Contains(qp,&yes);
    if(yes==-1)
    {
     e_sels.insert(e_sels.end(),e_geos[i]);
    }
   }
   break;
  }
 }

}

long CagGeometrys::GetSelectCount()
{
 return (e_sels.size());
}

void CagGeometrys::ClearSelect()
{
 e_sels.clear();
}

BOOL CagGeometrys::DeleteSelect()
{
 long i,j,count1,count=e_sels.size();
 
 //sel中不一定是用了geos中顺序,并且选择后可能添加了新的geo
 for(i=0;i<count;i++)
 {
  count1=e_geos.size();
  for(j=0;j<count1;j++)
  {
   if(e_geos[j]==e_sels[i])
   {
    e_geos.erase(e_geos.begin()+j);
    break;
   }
  }
 }

 return TRUE;
}

void CagGeometrys::Move(CMapControlDefault &mc)
{
 IActiveViewPtr av;
 av=mc.GetActiveView();

 IScreenDisplayPtr sd;
 av->get_ScreenDisplay(&sd);
 
 ISymbolPtr sym;
 IGeometryPtr geo=(*e_sels[0]);
 IRubberBandPtr rb;
 short c;

 esriGeometryType gt;
// long i,count=e_sels.size();
// for(i=0;i<count;i++) 每次只可以移动一个shape
 {
  (*e_sels[0])->get_GeometryType(&gt);
  switch(gt)
  {
  case esriGeometryPoint:
   rb.CreateInstance(CLSID_RubberPoint);
   break;
  case esriGeometryPolyline:
   rb.CreateInstance(CLSID_RubberLine);
   break;

  case esriGeometryEnvelope:
   rb.CreateInstance(CLSID_RubberEnvelope); //移动后图形消失
//   rb.CreateInstance(CLSID_RubberPolygon);//无效果
   break;

  case esriGeometryPolygon: //包括了circle
   rb.CreateInstance(CLSID_RubberPolygon);
   break;
  }
 }

 if(rb!=NULL)
  rb->TrackExisting(sd,sym,geo,&c); 
 av->Refresh();

}

BOOL CagGeometrys::AddImportPoint(CString sPathFile)
{
 FILE *f;
 f=fopen(sPathFile,"rt");
 if(f==NULL)
 {
  AfxMessageBox("无法打开指定文件.");
  return FALSE;
 }

 IPointCollectionPtr pc(__uuidof(Multipoint));
 IPointPtr pt;
 double x,y;
 while(1)
 {
  if(fscanf(f,"%lf %lf",&x,&y)!=2)
   break;
  
  pt.CreateInstance(CLSID_Point);
  pt->put_X(x);
  pt->put_Y(y);
  pc->AddPoint(pt);
 }
 fclose(f);

 if(e_bUnique)
  e_geos.clear();

 IGeometryPtr *g=new IGeometryPtr;
 (*g)=pc;
 e_geos.insert(e_geos.end(),g);

 return TRUE;
}


BOOL CagGeometrys::AddImportPolyline(CString sPathFile)
{
 FILE *f;
 f=fopen(sPathFile,"rt");
 if(f==NULL)
 {
  AfxMessageBox("无法打开指定文件.");
  return FALSE;
 }

 double x,y;
 IPointPtr pt;
 IPointCollectionPtr pts(CLSID_Polyline);
 while(1)
 {
  if(fscanf(f,"%lf %lf",&x,&y)!=2)
   break;
  
  pt.CreateInstance(CLSID_Point);
  pt->put_X(x);
  pt->put_Y(y);
  pts->AddPoint(pt);
 }
 fclose(f);

 if(e_bUnique)
  e_geos.clear();

 IGeometryPtr *g=new IGeometryPtr;
 (*g)=pts;
 e_geos.insert(e_geos.end(),g);

 return TRUE;
}

BOOL CagGeometrys::AddImportPolygon(CString sPathFile)
{
 FILE *f;
 f=fopen(sPathFile,"rt");
 if(f==NULL)
 {
  AfxMessageBox("无法打开指定文件.");
  return FALSE;
 }

 IPolygonPtr pg(CLSID_Polygon);

 double x,y;
 IPointPtr pt;
 IPointCollectionPtr pts(__uuidof(Ring));
 while(1)
 {
  if(fscanf(f,"%lf %lf",&x,&y)!=2)
   break;
  
  pt.CreateInstance(CLSID_Point);
  pt->put_X(x);
  pt->put_Y(y);
  pts->AddPoint(pt);
 }
 fclose(f);

 IRingPtr r=pts;
 r->Close();
 IGeometryCollectionPtr gc=pg;
 gc->AddGeometry(r);

 if(e_bUnique)
  e_geos.clear();

 IGeometryPtr *g=new IGeometryPtr;
 (*g)=pg;
 e_geos.insert(e_geos.end(),g);

 return TRUE;
}

BOOL CagGeometrys::AddPoint(double x, double y)
{
 if(e_bUnique)
  e_geos.clear();

 IPointPtr pt(__uuidof(Point));
 pt->PutCoords(x,y);
 IGeometryPtr *g=new IGeometryPtr;
 (*g)=pt;
 e_geos.insert(e_geos.end(),g);

 return TRUE;
}

BOOL CagGeometrys::AddCircle(double x, double y, double r)
{
 if(e_bUnique)
  e_geos.clear();

 IPointPtr pt(__uuidof(Point));
 IConstructCircularArcPtr cca(__uuidof(CircularArc));
 pt->PutCoords(x,y);
 cca->ConstructCircle(pt,r,-1);

 IGeometryPtr *g=new IGeometryPtr;
 (*g)=cca;
 e_geos.insert(e_geos.end(),g);

 return TRUE;
}

 

2 绘制一条polyline

可以使用AE里面的  IRubberBand 接口画在MapControl上:

  IRubberBand rubberLine = new RubberLineClass();
  IPolyline polyLine = (IPolyline)rubberLine.TrackNew(pActiveView.ScreenDisplay, null);

//设置图形的样式
  m_Symbol = SetDisplaySymbol(polyLine);
      
   //画出图形
  pActiveView.ScreenDisplay.StartDrawing(m_QueryMap.ActiveView.ScreenDisplay.hDC, (short)esriScreenCache.esriNoScreenCache);
  pActiveView.ScreenDisplay.DrawPolyline(pGeometry);
  pActiveView.Refresh();
  pActiveView.ScreenDisplay.FinishDrawing();

 

通过point构造Segment,再构造path,再构造polyline

用到ISegmentCollection,IPointCollection等接口,帮助里有个例子

The following subs are demonstrating how to create valid polylines efficiently.

A. Geometry type: Polyline

1. createMultipartPolylinePathSegmentCollection: Create a multipart polyline using path via ISegmentCollection.

2. createMultipartPolylinePathPointCollection: Create a multipart polyline using path via IPointCollection.

private IGeometry CreateShape(int x1,int y1,int x2,int y2)
                {
                        IPoint p1 = this.axMapControl1.ActiveView.ScreenDisplay.DisplayTransformation.ToMapPoint(x1,y1);
                        IPoint p2 = this.axMapControl1.ActiveView.ScreenDisplay.DisplayTransformation.ToMapPoint(x2,y2);
                        IPolyline line = new PolylineClass();
                        line.FromPoint=p1;
                        line.ToPoint=p2;
                        IGeometry lineGeometry = line as IGeometry;
                          retrun lineGeometry ;

                }
 
利用上面创建好的Line,在grahic上画线,嗯。。里面的代码要改动一下。因为是直接贴的以前写的东西
private void DrawShape(IGeometry line)
                {
                        pgc.DeleteAllElements();
                        //定义颜色
                        //定义线符号
                        IRgbColor lcolor = Utility.GetRGBColor(btnLColor.BackColor);
                        ISimpleLineSymbol outline = new SimpleLineSymbolClass();
                        if(this.txtWidth.Text.Trim()=="")
                                outline.Width=0;
                        else
                                outline.Width=Double.Parse(this.txtWidth.Text);

                        outline.Color = lcolor;
                        outline.Style = (esriSimpleLineStyle)(((StringIntObject)this.cbLineStyle.SelectedItem).i);

                        //定义使用填充符号的面
                        ILineElement LineE = new LineElementClass();
                        LineE.Symbol=outline;
                        IElement pElement = LineE as IElement;
                        pElement.Geometry=line ;
                        pgc.AddElement(pElement,0);
                        axMapControl1.Refresh( esriViewDrawPhase.esriViewGraphics, null,null );

                }

posted on 2008-07-26 11:05  风过 无痕  阅读(4134)  评论(0编辑  收藏  举报

导航

向日葵支付宝收钱码