我在地图中有一个定义为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
]
]
]
}
}
]
}
<代码>
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”的