2013-02-18 10 views
10

Utilizzo Python 3 e devo connettermi a postGre con le estensioni postGIS. Ho intenzione di utilizzare un driver psycopg2.
Questo PPyGIS è l'unica estensione che ho trovato, ma funziona su Python 2.7 non 3.3.0.
Qualcuno conosce una soluzione che funziona su 3.3.0?Utilizzo di PostGIS su Python 3

risposta

6

Se non si sta facendo nulla di fantasia con gli oggetti della geometria sul lato client (Python), psycopg2 può ottenere più informazioni di base utilizzando i tipi di dati nativi con geometry accessors, o altro GIS output formats come GeoJSON. Lascia che il server (PostgreSQL/PostGIS) faccia il duro lavoro.

Ecco un esempio a caso per restituire la GeoJSON a forme che si trovano entro 1 km di un punto di interesse:

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

Sarà fondamentale, avendo uno strato di punti su una carta geografica. Come opzione misurare la distanza tra due punti. –

+1

@MilleBii se tutto ciò di cui hai bisogno è la distanza, allora psycopg2 è tutto ciò di cui hai bisogno. PPyGIS è utile solo se hai bisogno di fare alcune cose personalizzate sulla geometria/geografia reale sul lato client con Python, piuttosto che sul lato server con PostgreSQL/PostGIS. –

+0

È anche possibile definire adattatori specifici per consentire a _psycopg2_ di formattare le geoquery. Usando per esempio le geometrie di * pygeoif *: def adapt_point (pt): return AsIs ("ST_SetSRID (ST_MakePoint ({}, {}), 4326)." Format (adatta (pt.x), adatta (pt. y))); register_adapter (Point, adapt_point) – Rmatt

1

Si può effettivamente utilizzare Shapely o GDAL/OGR, ma entrambe le librerie hanno una lunga lista di dipendenze .

Se avete solo pochissimi casi d'uso, si potrebbe anche implementare un piccolo protocollo te stesso, sulla base del super-chiazza di petrolio pygeoif biblioteca, come nell'esempio qui sotto

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)