2017-06-27 27 views
5

Tôi đang cố gắng thực hiện một phép toán không gian bằng cách sử dụng sqlalchemygeoalchemy2 trên Python 3.5. Tôi có một bảng có các điểm là thuộc tính geom. Tôi đã đọc bảng và làm theo hướng dẫn tài liệu:Lỗi về không gian và cơ sở dữ liệu PostGIS

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

Điều này trả về chính xác tên của các cột trong bảng của tôi. Bây giờ, tôi muốn tạo một tập hợp con không gian của dữ liệu chỉ chọn các điểm bên trong một đối tượng POLYGON. Tôi đã thử với ST_ContainsST_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>))) 

Polygon là một hình học WKT với một định nghĩa SRID=4326. Tôi đã thử với các hình thức khác nhau của cùng một đa giác đó, nhưng không ai có thể làm việc được. Khi thực hiện truy vấn, lỗi sau đây trả về:

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

Tôi thất bại ở đâu?

+0

đặt WKT đa giác của bạn. Như lỗi nói, một vòng có lẽ không được đóng (ví dụ điểm 1 và điểm cuối cùng của mỗi vòng phải giống nhau) – JGH

+0

'wkt_string =" POLYGON ((141.0205078125 -9.166331387642987, 143.602294921875 -9.155485188844034, 143.67919921875 -11.112885070321443, 140.965576171875 -11.11288507032144)) "' Là đối tượng POLYGON. Như bạn đã nói, POLYGON thực sự không hợp lệ. Tuy nhiên, tôi đã cố gắng sử dụng 'sqlalchemy.sql.func.ST_MakeValid' và vấn đề vẫn tồn tại. Bất kỳ ý tưởng? –

Trả lời

2

Đa giác bạn đang sử dụng không bị đóng. Tọa độ đầu tiên và cuối cùng phải giống nhau. Thay đổi nó thành:

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

Ngoài ra, bạn construct the polygon từ một dòng và tự động có thể thêm điểm thiếu

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; 
Các vấn đề liên quan