代码改变世界

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