【发布时间】:2022-01-04 17:41:53
【问题描述】:
所以,我正在开发一个用于地理标记图像的地图应用程序,我希望在我的地图上包含兴趣点的地址信息。我已经成功地使用 Geopandas、GeoPy 和 Nominatim 以及 PostGIS 表中的点数据完成了大部分任务(例如 POINT Z (8.726176366993529 50.10868874301912 96.90000000000001)。
虽然脚本完成了我想要的大部分工作,但结果返回了大量无关信息,我想在更新我的数据库之前将其解析为一两条数据。我能够使用gecoding 和reverse geocoding 上的两篇文章来破解我的脚本。我的问题归结为不确定脚本如何接收响应对象以及如何在属性添加到我的数据框之前或之后访问它们。
我没有导入语句的代码如下:
conn = psycopg2.connect(
host="localhost",
database="Nizz0k",
user="Nizz0k",
password="")
sql = "select * from public.\"Peng\""
engine = create_engine('postgresql://Nizz0k@localhost:5432/public.\"Peng\"')
df = gpd.read_postgis(sql, conn, geom_col="geom")
df['lon'] = df.geometry.apply(lambda p: p.x)
df['lat'] = df.geometry.apply(lambda p: p.y)
df['geocode'] = df['lat'].map(str) + ', ' + df['lon'].map(str)
locator = Nominatim(user_agent="pengMappingAgent", timeout=10)
rgeocode = RateLimiter(locator.reverse, min_delay_seconds=0.001)
tqdm.pandas()
df['address'] = df['geocode'].progress_apply(rgeocode)
所以,我的 Python 知识非常有限,但我尝试访问新创建的 df['address'] 列中的属性似乎没有任何效果。调用df.head() 会显示正确创建的列和地址信息,但现在我想简化列中的信息并将部分信息提取到新列中。理想情况下,我希望提取街道和门牌号信息以及社区信息,并去掉多余的城市、县、州和国家信息。
根据我所做的研究,我应该能够从响应对象中提取这些信息,但我不确定在哪里或如何访问它。似乎这些信息在我的专栏中被转换为字符串(我认为),如果没有,我不确定如何设置循环或 lambda 函数来获取这些内容。最坏的情况,我认为只是一些字符串操作可能会实现我的目标,但似乎应该有更简单的方法。
【问题讨论】:
-
1) 您是否使用OSMPythonTools、GeoPy 或其他方法进行查询? 2) 你能include the input data in your question?我们无权访问你的SQL服务器吗。
-
所以,它只是 GeoPy,我提供了表中数据的示例,但它是 WGS84 中具有 x、y、z 的有效几何。
标签: python geopandas geopy nominatim