【问题标题】:Error spatially subsetting and PostGIS database错误空间子集和 PostGIS 数据库
【发布时间】:2017-11-30 12:16:43
【问题描述】:

我正在尝试在 Python 3.5 上使用 sqlalchemygeoalchemy2 进行空间操作。我有一个带有点的表格作为geom 属性。我已经阅读了表格并按照文档说明进行操作:

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>)))

POLYGON 是一个定义了SRID=4326 的WKT 几何体。我已经尝试过使用同一个多边形的不同形式,但没有一个奏效。执行查询时,返回如下错误:

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

我在哪里失败了?

【问题讨论】:

  • 把你的多边形 WKT。正如错误所说,一个环可能没有闭合(例如每个环的第一个和最后一个点必须相同)
  • 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 并且问题仍然存在。有什么想法吗?

标签: python postgresql postgis geoalchemy2


【解决方案1】:

您使用的多边形不是闭合的。第一个和最后一个坐标必须相同。改成:

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;

【讨论】:

    猜你喜欢
    • 2012-08-24
    • 2011-11-20
    • 2011-03-21
    • 2011-06-09
    • 2010-12-04
    • 2012-12-24
    • 2019-04-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多