2013-02-18 44 views
10

我正在使用Python 3,需要使用PostGIS擴展連接到postGre。 我打算使用psycopg2驅動程序。
PPyGIS是我發現的唯一擴展,但它適用於python 2.7而不是3.3.0。
任何人都知道在3.3.0上工作的解決方案?在Python 3上使用PostGIS

回答

6

如果你沒有做任何幻想,而客戶端(Python)的幾何對象,psycopg2可以使用本機數據類型得到最基本的信息與geometry accessors,或其他GIS output formatsGeoJSON。讓服務器(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) 
+0

的例子它將基本的,具有點的上一層地圖。作爲選項測量兩點之間的距離。 – 2013-02-19 15:11:37

+1

@MilleBii如果你所需要的只是距離,那麼psycopg2就是你所需要的。如果您需要使用Python在客戶端上對實際幾何體/地理位置做一些自定義的事情,而不是使用PostgreSQL/PostGIS在服務器端進行自定義,PPyGIS纔有用。 – 2013-02-19 17:48:12

+0

您也可以定義特定的適配器,讓_psycopg2_格式化地理查詢。例如,使用* pygeoif *的幾何: def adapt_point(pt): return AsIs(「ST_SetSRID(ST_MakePoint({},{}),4326)」。 Y))); register_adapter(Point,adapt_point) – Rmatt 2017-01-12 17:13:19

1

您可以實際使用ShapelyGDAL/OGR,但是這兩個庫有依賴的一長串。

如果只有很少的usecases,你也可以實現一個小協議自己的基礎上,超光滑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)