【问题标题】:MySQL - See if a radius intersects a polygonMySQL - 查看半径是否与多边形相交
【发布时间】:2020-04-24 13:43:01
【问题描述】:

我有一个“区域”表,并且在该表中我有一个名为多边形的字段来定义该区域。这是多边形中的数据示例

(51.562537549259275, -0.18651649218749844),(51.56518165749251, -0.1497333723210481),(51.55111270638887, -0.10924630850248862),(51.568708395618486, -0.12155901469758534),(51.51636175962405, -0.07797281013359303),(51.46339366897244, -0.1081939612190741),(51.45202948056895, -0.13394078643432783),(51.44657087249458, -0.14909693896627108),(51.43333085349518, -0.18476873548843198),(51.42143028245271, -0.16866370898437344),(51.42048689213698, -0.2246564608006274),(51.410609105933894, -0.2541484477524758),(51.38180048734274, -0.31050333075316905),(51.38632646897756, -0.3486097751090478),(51.4462317250533, -0.39531041838200887),(51.482412594272446, -0.33524472163053654),(51.49386310130167, -0.31459844345063326),(51.57115695855739, -0.25625859642894877),

此多边形是在 Google 地图中创建的,如果将此数据更改为不同的数据会有所帮助,我可以这样做,我不拘泥于这种数据格式。

在前端,客户端通过选择位置(给出纬度和经度)和要搜索的半径来进行搜索。

在 MySQL 中有没有办法查看这两个东西是否相交?非常感谢任何帮助。

【问题讨论】:

  • 您的问题非常模糊,我们需要您的问题的更多信息。请提供 SQL 脚本以创建您的表并向其中插入数据以及您迄今为止开发的查询(即使该查询没有给您现在想要的)
  • 这看起来像你有很多点(经度,经度)并且没有多边形。多边形将wlook这样SET @g = 'POLYGON((22.367582117085913 70.71181669186944,22.225161442616514 70.65582486840117,22.20736264867434 70.83229276390898,22.18701840565626 70.9867880031668,22.22452581029355 71.0918447658621,22.382709129816103 70.98884793969023,22.40112042636022 70.94078275414336,22.411912121843205 70.7849142238699,22.367582117085913 70.71181669186944))'; 跨度>
  • @Mike 很抱歉你被否决了,但是我不对被否决负责。诬告通常被认为是不礼貌的,尽量不要对那些试图帮助你的人无礼。至于我对问题含糊不清的原始评论,请参阅这两个帮助项目,这些项目讨论如何正确提出问题并提供最小的可重现 SQL 查询:stackoverflow.com/help/how-to-ask || meta.stackoverflow.com/questions/333952/…
  • @GharbadTheWeak 为我的咆哮道歉,我很生气,因为我不能再在不需要完整答案的问题上做 cmets。当我再次发布问题时,我会尝试提供更多详细信息,但我确实认为那里已经足够了,我没有 SQL 可以给出.....虽然实际上我已经玩了一些东西,结果证明是实际的回答,所以,你可能是对的。

标签: mysql google-maps polygon


【解决方案1】:

对于遇到此问题的任何人,我都找到了解决方案。

正如最初的帖子中提到的,我有一个名为多边形的字段,它以同样显示的格式保存多边形。我创建了一个名为 enc_polygon 的 POLYGON 类型的新字段,并编写了 PHP 以在插入和更新时将多边形转换为 enc_polygon。我不会展示这一点,因为人们不太可能以与我使用的格式相同的格式保存!

值得一提的是,要使 POLYGON 数据库字段起作用,第一个和最后一个坐标必须相同,要关闭它,对于 Google 地图,它不会。

现在我在数据库中有多边形,我可以这样做

SELECT *
FROM   AREAS
WHERE ......
AND   ST_Within(ST_PointFromText('POINT($latitude $longitude)'), ST_Buffer(enc_polygon, 0.008983157 * $distance )) = 1

纬度和经度不是来自数据库,所以我需要将它们转换为点,这是使用ST_PointFromText

距离也会在页面上输入用户愿意走多远的公里数。所以我使用ST_Buffer 函数在整个多边形周围放置一个输入距离的缓冲区。

ST_Within 我认为很明显,但如果该点在缓冲多边形内,它基本上返回 1。

【讨论】:

    猜你喜欢
    • 2019-03-30
    • 2014-01-24
    • 1970-01-01
    • 2018-03-09
    • 2014-03-21
    • 1970-01-01
    • 2021-07-11
    • 1970-01-01
    • 2016-03-26
    相关资源
    最近更新 更多