代码之家  ›  专栏  ›  技术社区  ›  Guy Doulberg

ST_交叉地理

  •  1
  • Guy Doulberg  · 技术社区  · 7 年前

    我在想办法,我在postgres 9.6上使用postgis 2.3

    ST_相交 地理 返回false,尽管两个地理位置相交。 为了调试,我使用 几何学

    有人能帮我解释一下吗?

    例子:

    我正在运行此查询:

    select ST_intersects(ST_GeogFromText('POLYGON((12.856 41.890,12.856 41.935,12.811 41.935,12.811 41.890,12.856 41.890))'), ST_GeogFromText('POLYGON((-170 -47,174 -47,174 77,-170 77,-170 -47))'))  from table limit 1;
    

    我得到:

     st_intersects 
    ---------------
     f
    (1 row)
    

    当我跑步时:

     select ST_intersects(ST_GeomFromText('POLYGON((12.856 41.890,12.856 41.935,12.811 41.935,12.811 41.890,12.856 41.890))'), ST_GeomFromText('POLYGON((-170 -47,174 -47,174 77,-170 77,-170 -47))')) from  table limit 1;
    

    我得到:

     st_intersects
     ---------------
      t
     (1 row)
    
    1 回复  |  直到 7 年前
        1
  •  0
  •   timmur    7 年前

    ST_Intersects -- returns True if Geometries/Geography spatially intersect in 2D . 如果从转换,则查询应返回相同的结果 POLYGON (在具有5个顶点的情况下)到 LINESTRING

    SELECT 
     ST_Intersects(
     ST_GeomFromText('SRID=4326;LINESTRING(12.856 41.890,12.856 41.935,12.811 41.935,12.811 41.890,12.856 41.890)'), 
     ST_GeomFromText('SRID=4326;LINESTRING(-170 -47,174 -47,174 77,-170 77,-170 -47)'));
    
    
    SELECT 
     ST_Intersects(
     ST_GeogFromText('SRID=4326; LINESTRING(12.856 41.890,12.856 41.935,12.811 41.935,12.811 41.890,12.856 41.890)'), 
     ST_GeogFromText('SRID=4326; LINESTRING(-170 -47,174 -47,174 77,-170 77,-170 -47)'));
    

    更新::

    实际上,使用 Polygon 对我来说很好 ST_Intersects . 我意识到了 Linestring 不是你想要的——返回false,因为一个完全在另一个里面。问题是这两个多边形在球坐标系中相距很远。检查:

    SELECT 
     ST_Distance(
     ST_GeomFromText('SRID=4326;POLYGON((12.856 41.890,12.856 41.935,12.811 41.935,12.811 41.890,12.856 41.890))'), 
     ST_GeomFromText('SRID=4326;POLYGON((-170 -47,174 -47,174 77,-170 77,-170 -47))'));
    

    ==>0

    SELECT 
     ST_Distance(
     ST_GeogFromText('SRID=4326;POLYGON((12.856 41.890,12.856 41.935,12.811 41.935,12.811 41.890,12.856 41.890))'), 
     ST_GeogFromText('SRID=4326;POLYGON((-170 -47,174 -47,174 77,-170 77,-170 -47))'));
    

    ==>6743507.32

    你当然可以投 geography geometry

    SELECT 
     ST_Intersects(
     ST_GeogFromText('SRID=4326;POLYGON((12.856 41.890,12.856 41.935,12.811 41.935,12.811 41.890,12.856 41.890))')::geometry, 
     ST_GeogFromText('SRID=4326;POLYGON((-170 -47,174 -47,174 77,-170 77,-170 -47))')::geometry);