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();
}