首页
读书
网课

GeoPi 面向中国区域的时空位置数据处理工具包

好邻居 2025-01-23 14:00:22

1. 概述

在分析时空位置数据时,逆向地理编码(也称为逆地址编码、逆地址解析)是一项频繁使用且非常重要的能力,它可以将地理位置的经纬度坐标(Latitude, Longitude)转化为用户易于理解的地址描述信息,如下所示:

where is this place?=𝑓(𝑙𝑎𝑡,𝑙𝑛𝑔)

但是,业内各大地图厂商推出的逆地理位置编码基本都属于收费能力,或者每日有免费的使用次数上限,亦或者是必须接入互联网调用网络API进行查询。

有没有一个无限次数、无需网络、开箱即用的开源逆向地理编码库呢?

𝐺𝑒𝑜𝑃𝑖

https://pypi.org/project/geopi/

你只需稍稍出手

pip install geopi

它就可以轻松安装到你的电脑,包括其内置的中国区位置数据:

  • 地图坐标系采用GCJ02坐标系,也被称为火星坐标系(Mars coordinate system),是中国国家标准的地理坐标系统,用于网络地图服务。该坐标系统是由中国国家测绘地理信息局(现国家测绘地理信息局)开发,主要应用于中国大陆地区;

  • 中国区数据来源于阿里云DataV.GeoAtlas,确保地理位置数据的准确性;

  • POI数据来源于OSM的中国地图数据,且坐标系已经从WGS84转换为GCJ02坐标系,确保位置数据与POI数据坐标系的一致性;

2. 查询位置点所在地省/市/区(县)

只需一个函数,即可快速查询位置经纬度坐在的区域

from geopi import GeoPi geopi = GeoPi() # 设置要查询的经纬度坐标 lat, lng = 32.043787, 118.797437 # 获取所在地址 ret = geopi.search_city(lat, lng) print(ret)

输出结果为json形式

{     'province': ['江苏省', '320000'],      'city': ['南京市', '320100'],      'area': ['玄武区', '320102'] }

3. 查询位置所在区域的可视化展示

GeoPi内置了全国所有省市区的地理空间位置信息,通过 geopi.get_boundary_data(province_code) 函数,既可以获得对应行政区域编码的几何边界信息,结合GeoPandas和Matplotlib,可以轻松对位置及所在区域进行上图可视化

from geopi import GeoPi from geopandas import GeoDataFrame import matplotlib.pyplot as plt geopi = GeoPi() # 设置要查询的经纬度坐标 lat, lng = 32.043787, 118.797437 # 获取所在地址 ret = geopi.search_city(lat, lng) # 获取经纬度坐标所在区域的边界数据 province_boundary = geopi.get_boundary_data(ret['province'][1]) city_boundary = geopi.get_boundary_data(ret['city'][1]) area_boundary = geopi.get_boundary_data(ret['area'][1]) gdf = GeoDataFrame({'geometry': [province_boundary, city_boundary, area_boundary]}, index=['province', 'city', 'area']) ax = gdf.plot(color=['#4A90E2', '#50E3C2', '#B8E986']) plt.xlabel('Longitude') plt.ylabel('Latitude') plt.title('Boundary of Province/City/Area') # 在地图上绘制经纬度位置点 plt.scatter(lng, lat, color='#D2691E', marker='*', s=100, zorder=10, label='Location') ax.legend() plt.show()

输出地图如下所示,红色五角星为查询的位置处,同时将所在的省市区区域也进行了绘制:

查询位置所在的省市区县位置

4. 查询位置点附近的POI信息

POI是“Point of Interest”的缩写,中文意思是“兴趣点”或“兴趣地点”。在地理信息系统(GIS)和位置服务中,POI指的是具有特定地理坐标的地点或对象,这些地点通常对人们有特定的意义或用途,例如餐馆、电影院、博物馆、公园、历史地标等。

GeoPi内置了全国所有常见的POI地理位置信息,通过 geopi.search_nearest_poi(lat, lng, topk) 函数,可以快速查询位置点附近Top K条POI位置数据:

from geopi import GeoPi geopi = GeoPi() # 设置要查询的经纬度坐标 lat, lng = 32.043787, 118.797437 # 查询经纬度位置附近的POI信息 ret = geopi.search_nearest_poi(lat, lng, topk=10)

POI查询输出信息如下所示:

查询位置坐标附近最近的10个POI地理信息

其中,fclass为POI的类型,name为POI名称,wgs84和gcj为POI在不同坐标系的坐标点经纬度坐标,dist为距离查询位置点的距离,距离单位为米(Meters)。

5. 通过folium对查询位置及附近的POI进行可视化

结合folium库对查询位置和附近POI在地图上进行绘制,通过可视化,可以帮助用户快速找到目的地,并了解周边环境。

from geopi import GeoPi import matplotlib.pyplot as plt import folium geopi = GeoPi() # 设置要查询的经纬度坐标 lat, lng = 32.043787, 118.797437 # 查询经纬度位置附近的POI信息 ret = geopi.search_nearest_poi(lat, lng, topk=10) # 创建folium地图(高的坐标系) map = folium.Map(location=[lat, lng],             tiles='https://webrd02.is.autonavi.com/appmaptile?lang=zh_en&size=1&scale=1&style=8&x={x}&y={y}&z={z}',            attr='高德-中英文对照',            zoom_start=15) # 绘制查询位置点 folium.Marker(location=[lat, lng], icon=folium.Icon(color='red')).add_to(map) # 绘制位置点附近的POI for index, row in ret.iterrows():     pt = row['gcj']     folium.Marker(location=[pt.y, pt.x], icon=folium.Icon(color='blue'), popup=row['name']).add_to(map) map

查询位置附近POI可视化如下图所示:

对查询位置坐标和最近的10个POI地理信息进行可视化

6. GeoPi 链接地址

  • Github(如果你觉得这个项目很赞,请不要吝啬你的小星星哦 ,谢谢):

https://github.com/KaffeeCat/geopigithub.com/KaffeeCat/geopi

  • Pypi(可以使用 pip install geopi 轻松安装):

https://pypi.org/project/geopi/pypi.org/project/geopi/


声明:本网站所提供的信息仅供参考之用,并不代表本网站赞同其观点,也不代表本网站对其真实性负责。 




分享到:
最新评论(0)
更多
匿名者
顶楼