【问题标题】:MySQL: Spatial Query to find whether a latitude/longitude point is located within a given boundaryMySQL:空间查询以查找纬度/经度点是否位于给定边界内
【发布时间】:2014-08-25 18:11:57
【问题描述】:

我正在开发谷歌地图搜索功能。这样做的目的是找出(地理定位)点是否位于多边形内,如下图所示?

我正在使用带有 Spatial 扩展的 mysql 5.6.20,我知道它内置了有用的几何函数,因此我可以直接从数据库中查询地理编码位置。

我的目的是让自己熟悉地理空间功能,所以我写了一个实验性的 sql。

给定一个点地理位置:POINT(100.52438735961914 13.748889613522605)

并且要测试的多边形或边界是: POLYGON(100.49503326416016 13.766897133254545,100.55940628051758 13.746555203977,100.56266784667969 13.72170897580617,100.48885345458984 13.739051587150175) P>

这是我的 sql 示例:

SELECT ST_Within(
ST_GEOMFROMTEXT('POINT(100.52438735961914 13.748889613522605)'),
ST_GEOMFROMTEXT('POLYGON(100.49503326416016 13.766897133254545,
100.55940628051758 13.746555203977,100.56266784667969 13.72170897580617,
100.48885345458984 13.739051587150175)'))
As geoFenceStatus

但是发出命令后,我得到的回报似乎如下:

geoFenceStatus
===============
null

我很不确定为什么它返回了“null”值。因为在函数文档中指出,如果一个点位于给定的多边形内,这应该返回“1”

任何建议都将不胜感激,如何让我的 sql 正确。

【问题讨论】:

    标签: mysql geospatial


    【解决方案1】:

    错误消息不是很清楚,但您的问题是您的多边形无效。它有两个问题:

    1. 您必须在末尾重复第一个点——这是为了将其与 LINESTRING 区分开来,本质上,即它是封闭的。

    2. POLYGONS 以双括号开头和结尾,即POLYGON((x1 y1, x2 y2.......xn yn, x1 y1))。这是为了允许用多边形内的单括号集来描绘内环。

    请参阅wikipedia WKT article 了解更多信息。

    您应该会发现,如果您将查询编写为:

    SELECT ST_Within(ST_GEOMFROMTEXT('POINT(100.52438735961914 13.748889613522605)'),
                 ST_GEOMFROMTEXT('POLYGON((100.49503326416016 13.766897133254545, 100.55940628051758 13.746555203977,100.56266784667969 13.72170897580617, 100.48885345458984 13.739051587150175,
                 100.49503326416016 13.766897133254545))'))
    As geoFenceStatus
    

    那么应该可以了。

    【讨论】:

    • 不客气。我一生中看过太多的 WKT
    • 这将返回不在边界内的表中的所有记录。 SELECT ST_Within(ST_GEOMFROMTEXT( 'POINT(1.2940879962646 103.77771377563)'),ST_GEOMFROMTEXT( 'POLYGON((1.2965335457972 103.77599716187,1.2965335457972 103.7794303894,1.2916424443739 103.77599716187,1.2916424443739 103.7794303894,1.2965335457972 103.77599716187))'))作为geoFenceStatus,名称,reviews_cnt,纬度,经度, photo, place_id from google_place_data order by reviews_cnt desc
    • @NileshKumar。您使用的是什么版本的 MySQL。并非所有版本的 MySQL 都支持正确的交集函数——在 5.7 之前,它只支持 MBR 操作。感谢您的反对,在您投入数百小时帮助社区之后,人们这样做总是很好,而且人们甚至都没有陈述他们的用例。
    • @John MySQL 版本为 5.7.20
    • 一个因不清楚我在这里抱怨的事情而被关闭的问题。我再说一遍,你问了一个糟糕的问题,然后对一个非常好的答案投了反对票,因为你不明白为什么它对你不起作用。可耻的态度。
    猜你喜欢
    • 2017-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-25
    • 2010-11-07
    相关资源
    最近更新 更多