在mysql中计算哪些点(纬度,经度)在一定距离内?

Posted

技术标签:

【中文标题】在mysql中计算哪些点(纬度,经度)在一定距离内?【英文标题】:Computing which points (latitude, longitude) are within a certain distance in mysql? 【发布时间】:2012-01-06 04:56:58 【问题描述】:

有两个点 A、B,距离 x(距 A 英里)和 y(距 B 英里)。设从 A 到 B 的距离为 N。所以,A 距离 B 有 N 英里。我该如何解决这个问题:距离 A (N + x + y) 英里的可用点是什么?我不确定如何更好地解释这一点。我真的不知道如何解决这个问题,我读了Fastest Way to Find Distance Between Two Lat/Long Points,我相信给出的解决方案计算了两点之间的距离,不知道这个解决方案是否可以用于我的问题,或者如果可以,如何.

【问题讨论】:

1.如果我理解正确,您正在寻找圆心为点 A 且半径为 R = (N + x + y) 的所有点。 2. 我假设你能够在 mysql 之外计算 R。这两个假设正确吗? 我不是sire但是检查这些Mysql函数functions-for-testing-spatial-relations-between-geometric-objects 【参考方案1】:

如果您正在寻找近似算法,我建议您寻找 k-means 算法或层次聚类,尤其是怪物曲线或空间填充曲线。首先,您可以计算图的最小生成树,然后删除最长和最昂贵的边。然后这棵树会生成许多小树,您可以使用 k-means 来计算点组,即集群。

“单链接 k 聚类算法……正是 Kruskal 算法……相当于找到一个 MST 并删除 k-1 个最昂贵的边。”例如,请参见此处:https://stats.stackexchange.com/questions/1475/visualization-software-for-clustering。

怪物曲线的一个很好的例子是希尔伯特曲线。这条曲线的基本形式是 U 形,通过将其中的许多复制在一起并旋转它,曲线填充了欧克里德空间。令人惊讶的是,格雷码可以帮助找出这个 U 形的方向。你可以查查尼克的空间索引四叉树希尔伯特曲线blog article about more details。而不是计算曲线的索引,您可以像在 bing 地图中一样将四键组合在一起。 quadkey 对于每个坐标都是唯一的,它可以用于正常的字符串操作。键中的每个位置都是 U 形曲线的一部分,因此您可以从四键中从左到右部分选择该点区域。

在这张图片中,您可以看到绿色多边形是使用希尔伯特曲线找到的:

你可以在这里找到我的 php 类:http://www.phpclasses.org/package/6202-PHP-Generate-points-of-an-Hilbert-curve.html

【讨论】:

+1 尽管根据您的描述很难理解,但如果有一个工作示例来说明如何实现这一点会更清楚(而且是啊哈)。 @Jasonw:我在答案中添加了更多信息。图像和绿色多边形是我自己使用希尔伯特曲线完成的。找出旅行推销员问题会很有用。

以上是关于在mysql中计算哪些点(纬度,经度)在一定距离内?的主要内容,如果未能解决你的问题,请参考以下文章

一组经度/纬度点之间的最大距离

当经纬度为已知点时计算100米距离

PHP,Mysql根据经纬度计算距离并排序

PHP,Mysql根据经纬度计算距离并排序

PHP,Mysql根据经纬度计算距离并排序

性能 - 按纬度/经度查找特定距离内的所有点