2013-02-18 7 views
10

Ich verwende Python 3 und muss eine Verbindung zu PostGre mit PostGIS-Erweiterungen herstellen. Ich beabsichtige, einen psycopg2-Treiber zu verwenden.
Diese PPyGIS ist die einzige Erweiterung, die ich gefunden habe, aber es funktioniert auf Python 2.7 nicht 3.3.0.
Kennt jemand eine Lösung, die an 3.3.0 arbeitet?Verwenden von PostGIS auf Python 3

Antwort

6

Wenn Sie nicht etwas Besonderes mit den Geometrieobjekten auf der Clientseite (Python) zu tun, psycopg2 kann die meisten grundlegenden Informationen mit nativen Datentypen mit geometry accessors oder anderen GIS output formats wie GeoJSON zu bekommen. Lass den Server (PostgreSQL/PostGIS) die harte Arbeit machen.

Hier ist ein willkürliches Beispiel der GeoJSON auf Formen zurück, die innerhalb von 1 km von einem Punkt von Interesse sind:

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

implementieren Es wird einfach, eine Schicht von Punkten auf einem mit Karte. Als Option messen Sie die Entfernung zwischen zwei Punkten. –

+1

@MilleBii Wenn alles, was Sie brauchen, ist die Entfernung, dann ist psycopg2 alles was Sie brauchen. PPyGIS ist nur nützlich, wenn Sie einige benutzerdefinierte Dinge auf der tatsächlichen Geometrie/Geographie auf der Client-Seite mit Python tun müssen, anstatt auf der Server-Seite mit PostgreSQL/PostGIS. –

+0

Sie können auch bestimmte Adapter definieren, um _psycopg2_ die Geo-Queries zu formatieren. Verwenden Sie zum Beispiel Geometrien von * pygeoif *: def adapt_point (pt): Rückkehr AsIs ("ST_SetSRID (ST_MakePoint ({}, {}), 4326)". Format (anpassen (pt.x), anpassen (pt. y))); register_adapter (Punkt, Adaptierpunkt) – Rmatt

1

Sie tatsächlich Shapely oder GDAL/OGR, aber beide Bibliotheken haben eine lange Liste von Abhängigkeiten verwenden .

Wenn Sie nur sehr wenige usecases haben, können Sie auch ein kleines Protokoll selbst, basierend auf dem aalglatten pygeoif Bibliothek, wie im folgenden Beispiel

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)