2013-02-18 9 views
10

Używam Pythona 3 i muszę połączyć się z postGre z rozszerzeniami postGIS. Mam zamiar użyć sterownika psycopg2.
Ten PPyGIS jest jedynym rozszerzeniem, jakie znalazłem, ale działa na pythonie 2.7, a nie 3.3.0.
Ktoś zna rozwiązanie działające na 3.3.0?Używanie PostGIS na Pythonie 3

Odpowiedz

6

Jeśli nie robią niczego wyjątkowego z obiektów geometrycznych po stronie klienta (Python), psycopg2 może uzyskać większość podstawowych informacji z wykorzystaniem rodzimych typów danych z geometry accessors lub inny GIS output formats jak GeoJSON. Pozwól serwerowi (PostgreSQL/PostGIS) wykonać ciężką pracę.

Oto losowo przykład zwrócić GeoJSON do kształtów, które są w odległości 1 km od punktu zainteresowania:

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) 
+0

Będzie podstawowy, mający warstwę punktów na mapa. Jako opcję zmierz odległość między dwoma punktami. –

+1

@MilleBii, jeśli wszystko czego potrzebujesz, to odległość, a następnie psycopg2 to wszystko, czego potrzebujesz. PPyGIS przydaje się tylko wtedy, gdy chcesz wykonać pewne niestandardowe czynności w rzeczywistej geometrii/geografii po stronie klienta za pomocą Pythona, a nie po stronie serwera z PostgreSQL/PostGIS. –

+0

Możesz także zdefiniować określone adaptery, aby formatować zapytania geolokalizacyjne _psycopg2_. Użycie na przykład geometrii z * pygeoif *: def adapt_point (pt): return AsIs ("ST_SetSRID (ST_MakePoint ({}, {}), 4326)." Format (adapt (pt.x), adapt (pkt. y))); register_adapter (Point, adapt_point) – Rmatt

1

rzeczywistości można używać Shapely lub GDAL/OGR, ale obie biblioteki mają długą listę zależności .

Jeśli masz tylko bardzo niewiele usecases, można również realizować małe protokół samodzielnie, w oparciu o bardzo śliskiej pygeoif biblioteki, podobnie jak przykład poniżej

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)