MO+C#地名索引(摘要)

来源:互联网 发布:韩网络短剧 奇迹 编辑:程序博客网 时间:2024/05/22 16:45
MapObjects提供了PlaceLocator对象,建立地名查询,这个工具也叫地名一览表。他用一个引导类型定位一个地名,光标自动移动到指定位置。
PalaceLocator(地点定位)对象勇于匹配在其PlaceNameTable(地点名称数据表)属性中制定的地理数据库地点名。Indexed树形表示是否已经建立好索引。Locat方法勇于沛沛地点名,返回一个包含匹配后的地理位置的点集对象。FindeApproximateMatches方法利用近似方法匹配给定的地址。FindAllPlaceNames方法搜索以给定字符开始的地点名。这两个方法都返回一个Strings集合对象。
地点定位对象的一般步骤:
1.为地点定位对象的PlaceNameTable属性指定一个GetDataset对象,只要包含地名字段即可。
2.用BuildIndex方法为地名字段建立索引,检查Indexed属性,确定该索引是否已建立。
3.利用地点定位对象中的一种方法返回匹配指定地名的地名字符串集:
  (1)FindAllPlaceNames返回所有以指定字符开头的地名字符串集;
  (2)FindApproximateMatches返回与指定地名相似的地名字符串集;
  (3)Locate返回匹配指定地名特征的所有地理位置的点集。
使用GeoDataset:点线多边形都可作为地点定位对象的PlaceNameTable的属性值。若包含线特征,则Locate方法返回的为之是沿线的起点。若是多边形特征,则返回多边形的中心位置。

例子:

private void Form1_Load(object sender, System.EventArgs e)
  {
    MapObjects2.DataConnection dc=new MapObjects2.DataConnection();
   gdname="counties";
   fldname="name";
   dc.Database="D://Program Files//ESRI//MapObjects2//Samples//Data//USA";
   if(dc.Connect()==false)
   {
    MessageBox.Show("连接错误");
    return;
   }

   pl.PlaceNameTable=dc.FindGeoDataset(gdname);
   if(!pl.BuildIndex(fldname,false))
   {
    MessageBox.Show("不能创建索引!");
    return;
   }
   MapObjects2.MapLayer layer=new MapObjects2.MapLayer();
   layer.GeoDataset=dc.FindGeoDataset(gdname);
   axMap1.Layers.Add(layer);
   layer.Symbol.Color=(uint)MapObjects2.ColorConstants.moYellow;
  }

   private void button1_Click(object sender, System.EventArgs e)
  {
   MapObjects2.Strings strs=new MapObjects2.Strings();
   places=new ArrayList();
   listBox3.Items.Clear();
   pts=pl.Locate(textBox1.Text);
   if(pts.Count>0)
   {
    for(int i=0;i<pts.Count;i++)
     places.Add(pts.Item(i));
    strs.Add(textBox1.Text);
   }
   else
   {
    if(checkBox1.Checked)
     strs=pl.FindAllPlaceNames(textBox1.Text);
    else
    {
     strs=pl.FindApproximateMatches(textBox1.Text);
     if(strs.Count==0)
      MessageBox.Show("没找到");
    }

    if(strs.Count>0)
    {
     places=null;
     places=new ArrayList();
     listBox1.Items.Clear();
     for(int i=0;i<strs.Count;i++)
     {
      pts=pl.Locate(strs.Item(i));
      for(int j=0;j<pts.Count;j++)
       places.Add(pts.Item(j));
     }
    }
   }
   for(int i=0;i<strs.Count;i++)
    listBox1.Items.Add(strs.Item(i));
  }

  private void listBox3_DoubleClick(object sender,System.EventArgs e)
  {
   MapObjects2.Recordset result;
   MapObjects2.MapLayer layer=(MapObjects2.MapLayer)axMap1.Layers.Item(0);

   if(listBox1.Items.Count>1)
   {
    result=layer.SearchShape(places[listBox3.SelectedIndex],MapObjects2.SearchMethodConstants.moPointInPolygon,"");
    axMap1.FlashShape(result.Fields.Item("shape").Value,4);
   }
   else
   {
    for(int i=0;i<places.Count;i++)
    {
     result=layer.SearchShape(places[i],MapObjects2.SearchMethodConstants.moPointInPolygon,"");
     axMap1.FlashShape(result.Fields.Item("shape").Value,4);
    }
   }
  }

  private void axMap1_AfterTrackingLayerDraw(object sender,AxMapObjects2._DMapEvents_AfterTrackingLayerDrawEvent e)
  {
   MapObjects2.Symbol sym=new MapObjects2.SymbolClass();
   sym.SymbolType=MapObjects2.SymbolTypeConstants.moPointSymbol;
   sym.Style=(short)MapObjects2.MarkerStyleConstants.moCircleMarker;
   sym.Color=(uint)MapObjects2.ColorConstants.moRed;
   sym.Size=7;

   for(int i=0;i<places.Count;i++)
   {
    axMap1.DrawShape(places[i],sym);
   }
  }

  private void axMap1_MouseDownEvent(object sender, AxMapObjects2._DMapEvents_MouseDownEvent e)
  {
   if(e.button==1)//左键
   {
    if(e.shift==0)
     axMap1.Extent=axMap1.TrackRectangle();//放大
    else if(e.shift==1)
    {
     MapObjects2.Rectangle extRect = axMap1.Extent;
     extRect.ScaleRectangle(1.5);
     axMap1.Extent = extRect;
    }
   }
   else if(e.button==2)
    axMap1.Pan();
  }

原创粉丝点击