您的位置:首页 > 其它

GIS 门牌号地址匹配的简单实现

2008-10-09 16:51 337 查看
最近一直在考虑如何实现门牌号的地址匹配问题。由于,一开始对于现实中的门牌号的设定规则不甚了解,所以,一直感觉没有头绪,最近,看了经理给的一份门牌号地址表,再经过最近查看的一些星稀的文档,有了一个初步的实现想法,但感觉还是可以进一步优化,先看一下我是如何实现的。

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);//在地图上定位显示出来

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: