GIS 门牌号地址匹配的简单实现
2008-10-09 16:51 Jeffery Tao 阅读(2114) 评论(2) 收藏 举报最近一直在考虑如何实现门牌号的地址匹配问题。由于,一开始对于现实中的门牌号的设定规则不甚了解,所以,一直感觉没有头绪,最近,看了经理给的一份门牌号地址表,再经过最近查看的一些星稀的文档,有了一个初步的实现想法,但感觉还是可以进一步优化,先看一下我是如何实现的。
1、在道路线这个图层上,我们取一条路线,标识这条路的起点和终点,然后,根据精确度的要求,划分区域,用点作为界限隔开,所以取得点越多越精确。然后,获得这些点的空间坐标,作为一个地址匹配库保存起来。
2、由于门牌号的表示中,开始的几个字符都具有路名,这样,可以对我们稍后用到的数据做一个初步筛选,譬如,我们想匹配的一个门牌号是:柳泉路110号三单元,对于这样的数据,我们在地图中,做一个门牌号层,将柳泉路标识的数据过滤出来,形成一个哈希表,这样便于我们对初步数据的整理。
3、将过滤出来的数据放到哈希表中后,对于需要匹配的门牌号进行排序查询,记录两个数据,主要是用来比较我们要查看的门牌号与那个更近一些。
4、通过比较后,获得距要匹配的地址最近的点,然后,将其定位显示出来。
【上面的地址匹配精确度与你在地图上取得点的多少有关。】
查询代码如下:
protected void Button2_Click(object sender, EventArgs e)
{
Hashtable ht=toGetAll_oneRoadNumber();//这个方法获取过滤的数据
ArrayList akeys = new ArrayList(ht.Keys);
akeys.Sort();//对数据排序
int searchNum = Convert.ToInt32(getRoadNum());
int preNum = 0,lastNum=0;
string preName = string.Empty, lastName = string.Empty;
foreach (string skey in akeys)
{
lastNum = Convert.ToInt32(ht[skey]);
lastName = skey;
if (searchNum > lastNum)
{
preNum = lastNum;
preName = skey;
}
if (preNum != lastNum)
{
break;
}
}
int out1 = lastNum,out2=preNum;
int prepare1 = searchNum - preNum,
prepare2 = lastNum - searchNum;
string outstr = lastName.ToString();
if (prepare1 < prepare2)
{
outstr = preName.ToString();
}
MapInfo_Data_getInfo(outstr);//在地图上定位显示出来
}
浙公网安备 33010602011771号