我们经常遇到这样的需求,就是需要统计各自行政区内行政村的基站覆盖情况,采用的方式主要是人工审核,找到行政村所在地后,查看附近的基站覆盖情况,得到覆盖基站信息。该方式优点为:获得的信息非常准确,但缺点也很明显,首先就是效率问题,当行政村数量急剧增加的时候,人工方式的效率就急剧下降。因此我们提出一种方法,在提升该项工作的效率,又能尽可能的确保准确性。
我们首先需要有一份行政村的信息的excel文件,只要有村名就可以了。
然后,我们去看看高德的API的接口信息:
uri:http://restapi.amap.com/v3/place/text?
参数信息:'key':'aac43f8467440a31e0838efb6d06a2a8',#高德API的KEY,
'keywords':village_name,#村名'city':'临安',#城市名称'citylimit':'true',#只查询本城市'offset':'50',#每页显示数量
'page':'1',#页数,如果POI信息多的话,后面还有2、3页,这里用于演示,只填写了1
简单解释下,其实可以输的参数很多,我这就简单的提取这些,这里特别说明的是:
keyword,这个参数的信息就来源于我们刚刚的那张网格清单表格
page,我这只填了1,offset我填了50,这样的话,实际上一个村最多的经纬度信息点,最多只有50个。实际操作时,应该做一个for循环,把page1后面的数据也循环获得。
我们可以用python,去构建一个POST的代码,POST的参数,村名去提取2015网格清单中的村名,其他参数可以就采用我刚刚写的这些内容。最终获得一个json格式的内容,我们用pandas去提取出,然后保存到excel。
defpost(self,village_name):
parameters = urllib.urlencode({'key':'aac43f8467440a31e0838efb6d06a2a8',
'keywords':village_name,
'city':'临安',
'citylimit':'true',
'offset':'50',
'page':'1',
})
postUrl =' http://restapi.amap.com/v3/place/text?'#POST地址result = urllib2.urlopen(postUrl,parameters)#模拟登录,并把cookie保存到变量
data = json.load(result)
df2 = pd.DataFrame(data['pois'],columns=['name','location'])
df2.insert(,'villagename',village_name)
returndf2
然后把POST获得的信息,通过pandas导出到excel。
defread_excel(self):
dat =map(self.post,self.df[u'村名'])
df = pd.concat(dat)
df.to_excel('ddd.xls')
最终我们获得了一份excel表格
其实这份表格,我们只需要村名和经纬度信息就足够了。到这里,尽可能多的经纬度点的事情,我们已经办到了。我们把这份表格稍微整理下,整理成这样的格式即可。
然后,我们把这份文件,导入到MAPINFO中去。
然后创建点,创建一个TAB图层,一个大致的图层就出现了。这步操作,熟悉mapinfo的人,应该都没有问题,具体操作过程就不再赘述。
接下来,我们利用mapinfo的泰森多边形功能,在table目录下面voronoi。这样我们就创建了一个泰森多边形,具体形态如下:其中我们要把这个村名信息存入这个多边形内,否则一会无法合并。
我们具体找其中一个地方再仔细看看
我们发现,有很多个块,其中标签是绍鲁村,每个点的中间划分了边界。
接下来我们要做的,就是把标签一样的多边形,合并成一个多边形。
这样我们就把村名一样的多边形合并成了一个多边形。
行政村的边界也就大致制作完成了。
通过这样的方法,我们知道:
1、首先,点越多,边界越准确。因此在获得经纬度信息时,我们要尽可能多的去POST高德API 2、对于市区,因为POI信息非常的多,因此在市区获得的行政村图层应该是比较准确的。3、图层可以用于快速的检索各行政村内的基站信息。
这个方法,我们巧妙的把图层准确性和POI信息做了结合,在POI信息足够多的情况下,可以有效的提升图层的准确性。通过高德API接口,解决了POI信息的获取问题。通过mapinfo的泰森多边形和图层合并的功能,解决了图层获得的问题。
领取专属 10元无门槛券
私享最新 技术干货