15

我正在使用 Python 3,需要使用 postGIS 扩展连接到 postGre。我打算使用 psycopg2 驱动程序。
这个PPyGIS是我发现的唯一扩展,但它适用于 python 2.7 而不是 3.3.0。
有人知道适用于 3.3.0 的解决方案吗?

4

3 回答 3

13

如果您没有在客户端(Python)上对几何对象做任何花哨的事情,psycopg2 可以使用带有几何访问器的本机数据类型或其他 GIS输出格式(如GeoJSON )来获取大多数基本信息。让服务器(PostgreSQL/PostGIS)做艰苦的工作。

这是一个将 GeoJSON 返回到兴趣点 1 公里范围内的形状的随机示例:

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)
于 2013-02-18T22:10:52.760 回答
3

您实际上可能使用ShapelyGDAL/OGR,但是这两个库都有很长的依赖项列表。

如果你只有很少的用例,你也可以自己实现一个小协议,基于 super slick 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)
于 2017-01-12T17:22:01.987 回答
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

于 2019-07-28T19:04:41.423 回答