2017-06-27 26 views
5

मैं पाइथन 3.5 पर sqlalchemy और geoalchemy2 का उपयोग करके एक स्थानिक ऑपरेशन करने की कोशिश कर रहा हूं। मेरे पास geom विशेषता के रूप में अंक वाली एक तालिका है। मैं पहले से ही मेज पढ़ सकते हैं और प्रलेखन निर्देशों का पालन किया है:त्रुटि स्थानिक रूप से सबसेटिंग और पोस्टजीआईएस डेटाबेस

metadata = MetaData() 
table = Table('table', 
       metadata, autoload=True, 
       schema = "schema", 
       autoload_with=engine) 
print(table.columns) 

यह सही ढंग से मुझे मेरे तालिका के कॉलम का नाम देता है। अब, मैं डेटा के एक स्थानिक सबसेट को केवल पॉलीगॉन ऑब्जेक्ट के अंदर वाले बिंदुओं का चयन करना चाहता हूं। मैं ST_Contains और ST_Intersection साथ करने की कोशिश की:

# Create session for queries 
Session = sessionmaker(bind=engine) 
session = Session() 

#SELECT * FROM table: 
q = session.query(table).filter(table.c.geom.ST_Intersects(func.GeomFromEWKT(<POLYGON>))) 

बहुभुज परिभाषित SRID=4326 के साथ एक वाली WKT- ज्यामिति है। मैंने पहले से ही उसी बहुभुज के विभिन्न रूपों के साथ प्रयास किया है, लेकिन कोई भी काम नहीं किया है। क्वेरी निष्पादित करते समय, निम्न त्रुटि लौटाती है:

(psycopg2.InternalError) geometry contains non-closed rings 
HINT: "...140.965576171875 -11.11288507032144))" <-- parse error at position 166 within geometry 

जहां मैं असफल रहा हूं?

+0

अपने बहुभुज वाली WKT- डाल जोड़ सकते हैं। जैसा कि त्रुटि कहती है, एक अंगूठी शायद बंद नहीं होती है (उदाहरण के लिए प्रत्येक अंगूठी का पहला और अंतिम बिंदु समान होना चाहिए) – JGH

+0

'wkt_string =" पॉलीगॉन ((141.0205078125 -9.166331387642987, 143.602294921875 -9.155485188844034, 143.67919921875 -11.112885070321443, 140.965576171875 -11.11288507032144)) "क्या पॉलीगॉन ऑब्जेक्ट है। जैसा कि आपने कहा था, पॉलीगॉन वास्तव में मान्य नहीं है। फिर भी, मैंने 'sqlalchemy.sql.func.ST_MakeValid' का उपयोग करने का प्रयास किया है और समस्या बनी रहती है। कोई विचार? –

उत्तर

2

आप जिस बहुभुज का उपयोग कर रहे हैं वह बंद नहीं है। पहला और अंतिम निर्देशांक समान होना चाहिए। यह करने के लिए परिवर्तित करें:

wkt_string = "POLYGON((141.0205078125 -9.166331387642987, 
         143.602294921875 -9.155485188844034, 
         143.67919921875 -11.112885070321443, 
         140.965576171875 -11.11288507032144, 
         141.0205078125 -9.166331387642987))" 

वैकल्पिक रूप से, आप construct the polygon एक लाइन से और स्वचालित रूप से लापता बिंदु

SELECT ST_MakePolygon(
     ST_AddPoint(foo.open_line, ST_StartPoint(foo.open_line))) 
FROM (
    SELECT ST_GeomFromText(
      'LINESTRING(141.0205078125 -9.166331387642987, 
         143.602294921875 -9.155485188844034, 
         143.67919921875 -11.112885070321443, 
         140.965576171875 -11.11288507032144)') 
       As open_line) 
    As foo; 
संबंधित मुद्दे