使用地理空间类型的边界框 MySql 中的点
Points in bounding box MySql using geospatial types
我正在尝试查询 SQL 到 return 个位于边界框内的点。我找到的最佳答案是这种想法:
lng1 <= lng2 AND (lng1 <= lng AND lng <= lng2) /* both edges on same side */
OR
lng1 > lng2 AND (lng1 <= lng OR lng <= lng2) /* edges on opposite sides */
可以在这里看到:DBfiddle
但是我使用的是 MySQL 的较新版本,我将坐标存储为“点”类型。我一直在试图了解 MySQL (8) 的这个较新版本是否可以让我有更好的方法来 select 带有边界框内点的行,但我没有任何运气。这种能力存在吗?
MySQL简单的bounding box可以很容易做到,但是不支持反子午线交叉的boxes,所以这会很复杂。
如果你没有任何盒子穿过反时序,你可以简单地写这样的表达式
ST_Intersects(
ST_MakeEnvelope(Point(lng1, lat1), Point(lng2, lat2)),
Point(lng, lat))
但是由于在 MySQL ST_MakeEnvelope only supports Cartesian CRS 中,您需要自己编写反子午线交叉框的代码,例如通过构建两个盒子 - 一个从 lng1 到 180,一个从 -180 到 lng2。
我正在尝试查询 SQL 到 return 个位于边界框内的点。我找到的最佳答案是这种想法:
lng1 <= lng2 AND (lng1 <= lng AND lng <= lng2) /* both edges on same side */
OR
lng1 > lng2 AND (lng1 <= lng OR lng <= lng2) /* edges on opposite sides */
可以在这里看到:DBfiddle
但是我使用的是 MySQL 的较新版本,我将坐标存储为“点”类型。我一直在试图了解 MySQL (8) 的这个较新版本是否可以让我有更好的方法来 select 带有边界框内点的行,但我没有任何运气。这种能力存在吗?
MySQL简单的bounding box可以很容易做到,但是不支持反子午线交叉的boxes,所以这会很复杂。
如果你没有任何盒子穿过反时序,你可以简单地写这样的表达式
ST_Intersects(
ST_MakeEnvelope(Point(lng1, lat1), Point(lng2, lat2)),
Point(lng, lat))
但是由于在 MySQL ST_MakeEnvelope only supports Cartesian CRS 中,您需要自己编写反子午线交叉框的代码,例如通过构建两个盒子 - 一个从 lng1 到 180,一个从 -180 到 lng2。