2017-06-27 100 views
5

我想在Python 3.5上使用sqlalchemygeoalchemy2进行空间操作。我有一个表格作为geom属性。我已经阅读了表格并按照文档说明进行操作:错误空间子集和PostGIS数据库

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

这会正确地返回我表格的列名称。现在,我想创建一个数据的空间子集,只选择POLYGON对象内的点。我试着用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>))) 

多边形是WKT几何形状与定义SRID=4326。我已经尝试过使用同一个多边形的不同形式,但都没有工作。执行查询时,出现以下错误:

(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 =“POLYGON((141.0205078125 -9.166331387642987,143.602294921875 -9.155485188844034,143.67919921875 -11.112885070321443,140.965576171875 -11.11288507032144 ))“'是POLYGON对象。正如你所说,POLYGON确实无效。尽管如此,我试图使用'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;