在 Python 3 上使用 PostGIS

Posted

技术标签:

【中文标题】在 Python 3 上使用 PostGIS【英文标题】:Using PostGIS on Python 3 【发布时间】:2013-02-03 02:51:01 【问题描述】:

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

【问题讨论】:

【参考方案1】:

如果您没有在客户端 (Python) 上对几何对象做任何花哨的事情,psycopg2 可以使用带有 geometry accessors 的本机数据类型或其他 GIS output formats(如 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)

【讨论】:

它是基本的,在地图上有一层点。作为选项测量两点之间的距离。 @MilleBii 如果您只需要距离,那么 psycopg2 就是您所需要的。 PPyGIS 仅在您需要使用 Python 在客户端而不是使用 PostgreSQL/PostGIS 在服务器端对实际几何/地理进行一些自定义操作时才有用。 您也可以定义特定的适配器来让 psycopg2 格式化地理查询。使用例如来自 pygeoif 的几何图形: def adapt_point(pt): return AsIs("ST_SetSRID(ST_MakePoint(, ), 4326)".format(adapt(pt.x), adapt( pt.y))); register_adapter(Point, adapt_point)【参考方案2】:

您实际上可以使用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)

【讨论】:

【参考方案3】:

自从问了这个问题以来,添加了 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

【讨论】:

以上是关于在 Python 3 上使用 PostGIS的主要内容,如果未能解决你的问题,请参考以下文章

使用 python 3.8+(默认协议=5)时,pickle.load 在 python 3.7 中的(协议=4)对象上失败

在 python 3 上使用 tkinter 打开图像

使用 ElasticBeanstalk 在 AWS 上部署在 Python 3.6 上运行的 Django 项目

使用python 3.5在centos 6.5上安装tkinter

如何在Windows上使用Python 3.3.2直接打印到打印机?

在 Windows 上使用 Python 3.5 Anaconda 的底图