2013-02-18 15 views
10

पर पोस्टजीआईएस का उपयोग करके मैं पायथन 3 का उपयोग कर रहा हूं और पोस्टजीआईएस एक्सटेंशन के साथ पोस्टग्रे से कनेक्ट करने की आवश्यकता है। मैं एक psycopg2 ड्राइवर का उपयोग करने का इरादा रख रहा हूं।
यह PPyGIS मुझे मिला एकमात्र विस्तार है, लेकिन यह अजगर 2.7 नहीं 3.3.0 पर काम करता है।
कोई भी 3.3.0 पर काम कर रहे समाधान को जानता है?पायथन 3

उत्तर

6

आप कुछ भी ग्राहक के पक्ष (अजगर) पर ज्यामिति वस्तुओं के साथ फैंसी नहीं कर रहे हैं, तो psycopg2 सबसे बुनियादी जानकारी देशी डेटा प्रकार का उपयोग कर geometry accessors के साथ अन्य जीआईएस output formatsGeoJSON की तरह प्राप्त कर सकते हैं, या। सर्वर (PostgreSQL/PostGIS) को कड़ी मेहनत करने दें।

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

नीचे दिए गए उदाहरण की तरह लागू हो सकता है यह होगा बुनियादी, एक पर अंक की एक परत होने नक्शा। एक विकल्प उपाय के रूप में दूरी दो बिंदुओं के बीच। –

+1

@MilleBii यदि आपको केवल दूरी की आवश्यकता है, तो psycopg2 आपको बस चाहिए। पीपीजीजीआईएस केवल तभी उपयोगी होता है जब आपको पोस्टग्रेएसक्यूएल/पोस्टजीआईएस के साथ सर्वर पक्ष की बजाय पाइथन के साथ क्लाइंट साइड पर वास्तविक ज्यामिति/भूगोल पर कुछ कस्टम चीजें करने की आवश्यकता होती है। –

+0

आप विशिष्ट एडाप्टर को परिभाषित भी कर सकते हैं ताकि _psycopg2_ भू-प्रश्नों को प्रारूपित कर सकें। उदाहरण के लिए * pygeoif *: def adapt_point (pt): वापसी एएसआई ("ST_SetSRID (ST_MakePoint ({}, {}), 4326)" प्रारूप (अनुकूल (pt.x), अनुकूल (pt। वाई))); register_adapter (प्वाइंट, adapt_point) – Rmatt

1

आप वास्तव में उपयोग कर सकते हैं Shapely या GDAL/OGR, लेकिन दोनों पुस्तकालयों निर्भरता की एक लंबी सूची है:

यहाँ आकार कि ब्याज की एक बिंदु के 1 किमी के भीतर हैं करने के लिए GeoJSON वापस जाने के लिए एक यादृच्छिक उदाहरण है ।

आप केवल बहुत कम 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)