在Python 3中使用PostGIS

17 投票
4 回答
17085 浏览
提问于 2025-04-17 16:16

我正在使用Python 3,想要连接到带有postGIS扩展的PostgreSQL数据库。
我打算使用psycopg2这个驱动程序。
我找到的唯一一个扩展是PPyGIS,但它只支持Python 2.7,而不支持3.3.0版本。
有没有人知道有什么解决方案可以在3.3.0上使用?

4 个回答

2

自从这个问题被提出来之后,Geopandas这个包增加了一个功能

classmethod GeoDataFrame.from_postgis(sql, con, geom_col='geom', 
    crs=None, index_col=None, coerce_float=True, parse_dates=None, params=None)

这个功能可以从一个包含几何数据的SQL表中获取一个地理数据框。

http://geopandas.org/reference.html#geopandas.GeoDataFrame.from_postgis

3

你可以使用Shapely或者GDAL/OGR这两个库,但这两个库都有很多依赖项,也就是说在使用之前需要安装很多其他的东西。

如果你只有很少的使用场景,实际上你也可以自己实现一个简单的协议,基于非常好用的pygeoif库,就像下面的例子那样。

from psycopg2.extensions import register_adapter, AsIs, adapt
from pygeoif.geometry import Point

def adapt_point(pt):
    return AsIs("ST_SetSRID(ST_MakePoint({}, {}), 4326)".format(adapt(pt.x), adapt(pt.y)))

register_adapter(Point, adapt_point)
14

如果你在客户端(用Python)处理几何对象时没有做什么复杂的事情,psycopg2可以通过一些基本的数据类型来获取大部分基本信息,使用的工具叫做几何访问器,或者其他GIS的输出格式,比如GeoJSON。让服务器(PostgreSQL/PostGIS)来处理复杂的工作。

下面是一个随机的例子,展示如何返回距离某个兴趣点1公里内的形状的GeoJSON:

import psycopg2
conn = psycopg2.connect(database='postgis', user='postgres')
curs = conn.cursor()

# Find the distance within 1 km of point-of-interest
poi = (-124.3, 53.2)  # longitude, latitude

# Table 'my_points' has a geography column 'geog'
curs.execute("""\
SELECT gid, ST_AsGeoJSON(geog), ST_Distance(geog, poi)
FROM my_points, (SELECT ST_MakePoint(%s, %s)::geography AS poi) AS f
WHERE ST_DWithin(geog, poi, 1000);""", poi)

for row in curs.fetchall():
    print(row)

撰写回答