当前位置: 首页 > 知识库问答 >
问题:

在Postgis 2.5中查询点是否在面内

司空叶五
2023-03-14

我在地图中有一个定义为GeoJSON的多边形。需要知道某个点是否在该多边形内。

多边形:

ST_AsGeoJSON( 
 'POLYGON ((
    -69.62607888946572 -22.389720278609026, 
    -69.62632833490409 -22.39009971947581,
    -69.6252903200153 -22.3904196394022,
    -69.62501673469583 -22.390032759398007,
    -69.62553708324471 -22.389888919122058,
    -69.62607888946572 -22.389720278609026))')

点:

ST_Point(-69.625137, -22.389777)

需要知道问Postgis这个查询的正确方法。

我们测试了不同的替代方案,其中一些返回正确答案,但不知道它们有何不同以及哪种是“正确的方法”(解释ST_Intersects、ST_Contains和ST_DWithin之间的差异将不胜感激)。我是否需要在查询中“设置SRID”点和多边形?

1:

select
ST_SetSRID(ST_GeomFromGeoJSON(ST_AsGeoJSON( 
 'POLYGON ((
    -69.62607888946572 -22.389720278609026, 
    -69.62632833490409 -22.39009971947581,
    -69.6252903200153 -22.3904196394022,
    -69.62501673469583 -22.390032759398007,
    -69.62553708324471 -22.389888919122058,
    -69.62607888946572 -22.389720278609026))')), 4326) &&
ST_SetSRID(ST_Point(-69.625137, -22.389777), 4326)

2:ST_Intersects,返回false,CORRECT

select 
ST_Intersects(
ST_SetSRID(
 'POLYGON ((
    -69.62607888946572 -22.389720278609026, 
    -69.62632833490409 -22.39009971947581,
    -69.6252903200153 -22.3904196394022,
    -69.62501673469583 -22.390032759398007,
    -69.62553708324471 -22.389888919122058,
    -69.62607888946572 -22.389720278609026))':: geography, 4326),
 ST_SetSRID(ST_Point(-69.625137, -22.389777):: geography, 4326))

3:ST_Contains,返回错误,正确

select 
ST_Contains(
ST_SetSRID(ST_GeomFromGeoJSON(ST_AsGeoJSON( 
 'POLYGON ((
    -69.62607888946572 -22.389720278609026, 
    -69.62632833490409 -22.39009971947581,
    -69.6252903200153 -22.3904196394022,
    -69.62501673469583 -22.390032759398007,
    -69.62553708324471 -22.389888919122058,
    -69.62607888946572 -22.389720278609026))':: geography)), 4326),
ST_SetSRID(ST_Point(-69.625137, -22.389777), 4326))

4:ST_DWithin,返回错误,正确

select 
ST_DWithin( 
 'POLYGON ((
    -69.62607888946572 -22.389720278609026, 
    -69.62632833490409 -22.39009971947581,
    -69.6252903200153 -22.3904196394022,    
    -69.62501673469583 -22.390032759398007,
    -69.62553708324471 -22.389888919122058,
    -69.62607888946572 -22.389720278609026))':: geography,
 ST_Point(-69.625137, -22.389777):: geography,0)

如果您想复制/粘贴geojson.io:

{
  "type": "FeatureCollection",
  "features": [
    {
      "type": "Feature",
      "properties": {},
      "geometry": {
        "type": "Point",
        "coordinates": [
          -69.625137,
          -22.389777
        ]
      }
    },
    {
      "type": "Feature",
      "properties": {},
      "geometry": {
        "type": "Polygon",
        "coordinates": [
          [
            [
              -69.62607888946572, 
              -22.389720278609026
            ],
            [
              -69.62632833490409,
              -22.39009971947581
            ],
            [
              -69.6252903200153,
              -22.3904196394022
            ],
            [
              -69.62501673469583,
              -22.390032759398007
            ],
            [
              -69.62553708324471,
              -22.389888919122058
            ],
            [
              -69.62607888946572,
              -22.389720278609026
            ]
          ]
        ]
      }
    }
  ]
}

共有1个答案

彭鹭洋
2023-03-14

<代码>

st_interacts不言自明。

对于面操作中的点,st_contains类似(尽管面边上的点不被视为包含在面中)。线与面或多边形与面之间非常不同,因为第一个要素必须位于另一个要素内部(而对于交点,如果 geom 1 的一部分位于 geom2 中,则相交为真)。

st_dwithin检查 2 个几何之间的最小距离是否小于或等于指定的距离。值为 0 时,它与 st_intersects 相同。

 类似资料:
  • 我有一个用lat/long表达的观点 我有一个以米表示的半径值。我需要检查另一个点,也用拉特/long表示,是否在圆内。 如果我在平面上,我可以简单地使用公式 正如这些答案所深刻解释的那样。 然而,根据纬度/经度的用法,我不能使用这个公式,因为行星是球形的。 如何计算从任何给定点到中心的距离以与半径进行比较?

  • 问题内容: 我先画了一条线,然后画了一个点,然后我要检查该点是否在线上。我已经在数组中取得了一条线坐标(因为有多条线)。我想在最后一行检查当前点吗? 问题是当一点在直线的起点附近或直线大约在m1和c1的垂直值相差很大时。因此,检测点是否在线上存在一个问题。我如何检查这种情况? 问题答案: 如果点(xP,yP)在从(x1,y1)到(x2,y2)的线段上,则返回0.0。 对无限行执行相同的操作。

  • 我偶尔收到以下信息: 这发生在具有表的页面中,其中的行延伸到视点之后。 我用来在表中选择随机行的方法 是否有一种方法来检查是否有元素在#Focus之后?

  • 我有一种感觉,我在这件事上完全错了。但无论如何。 我有一个sql数据库,它本质上是一个有目的的非规范化表,我构造这个表是为了使这项任务对我来说更容易,所以我可以从一个表中获取内容。 我有一张成双成对的桌子,像这样: 等等 所以对于我的neo4j图数据库,我希望每个用户ID作为一个节点,其他的东西不是太重要,但基本上是关系中的东西。 我只希望每个用户有一个节点,所以我的感觉是,如果我这样做: 当我们

  • 为了让我的用户执行更复杂的搜索,我正在使用Algolia。 我想将此jsonObject转换为与兼容的东西,以便能够使用 谢谢你!

  • 我从我的网络商店API调用中获取XML,其结构非常像下面的示例: 其中有更多的参数,数量取决于许多外部因素。我正在尝试获取用户名,当id“111”和id“112”的值是我要查找的值时 上述代码按预期返回“userOne”和“userTwo”。 问题是,Id“111”要么有值“Param 1 is on”要么什么都没有,如果没有值,它就不会显示在XML中。所以我需要一个表达式来检查id为“111”的