Использование PostGIS на Python 3

Я использую Python 3 и вам нужно подключиться к postGre с расширениями postGIS. Я намерен использовать драйвер psycopg2.
Этот PPyGIS является единственным расширением, которое я нашел, но он работает на python 2.7, а не на 3.3.0.
Кто-нибудь знает решение, работающее над 3.3.0?

Ответ 1

Если вы ничего не делаете с объектами геометрии на стороне клиента (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)

Ответ 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