如何在输入位置的x行程时间内搜索纬度,经度项目的数据库

Posted

技术标签:

【中文标题】如何在输入位置的x行程时间内搜索纬度,经度项目的数据库【英文标题】:how to search database of lat,lon items within x travel time of input location 【发布时间】:2017-03-07 18:45:32 【问题描述】:

我有一个 mysql 和 solr 作业数据库,每个作业的位置都有一个 lat 和 lon 值。

目前,用户可以在 x 英里范围内按位置搜索工作。 我想在 x 分钟(旅行时间)内提供按位置搜索的功能。

我尝试过搜索,但我只能找到有关如何在地图上绘制可能的旅行区域的信息,例如此示例来自 route360:http://codepen.io/route360/pen/Wrbvmg

有谁知道我如何在我的 Solr 核心(或必要时的 mysql DB)中搜索文档 latlon 位于该区域内的文档?

或者我应该以不同的方式处理这个问题?

我有一个解决方案,我只使用平均速度(比如 30 英里/小时),然后乘以用户输入的时间因子(我使用日光浴室)

$speed = 30; //mph
$time = $_GET['time']; //say it was '30' minutes

// time is in minutes. get what that is as fraction of 60
// to multiply speed by to get radius

$fraction = $time/60; // would give 30/60 = 0.5;

$radius = $speed * $fraction; // would give 30 * 0.5 = 15 miles radius


// lat and lon are created earlier from user input location by querying my DB of locations
$query->createFilterQuery('distance')->setQuery(
    $helper->geofilt(
        'latlon',
        doubleval($lat),
        doubleval($lon),
        doubleval($radius * 1.609344) // default is KM so multiply to get miles
    )
);

这很好用,但它并不那么准确。它也不允许我按旅行类型(如步行、公共交通)进行过滤......有什么想法吗?

【问题讨论】:

看看这个scribd.com/presentation/2569355/Geo-Distance-Search-with-MySQL FWIW,Route360 现在称为 Targomo。与链接的(无法运行的)codepen 等效的是this example。 (无法直接编辑答案...) 【参考方案1】:

旅行时间是一个重要的计算。

首先计算输入位置的边界框 x 距离单位 N,S,E,W 的最小和最大纬度和经度。获取边界框内位置的 ID、纬度和经度

接下来,计算每个点与输入位置之间的“直线”距离,以筛选出落在圆半径 x 距离单位内的位置候选列表。

请记住,地球不是一个球体。存在世界圆度的模型。这是否重要取决于漏报的重要性、您需要处理的项目数量以及可接受的性能。

对于最后一步,您需要一个可导航点模型作为有向图。将每个 locationID 映射到有向图中的一个节点。

    从与输入位置对应的节点开始,为从您的起点(从输入位置引出的每条道路上的下一个路口)可导航的每个节点分配行程时间。 选择一个未访问节点,该节点的边通向已访问节点(已具有行程时间的节点),其值尚未大于时间限制。如果可以从多个已访问节点到达未访问节点,则通过每个直接链接的已访问注释计算总时间并分配最小值。 重复 2 直到与候选列表中的每个 locationID 关联的节点都具有值,或者没有将未访问节点链接到任何值低于时间限制的已访问节点的边。

这是一种广度优先的方法,最适用于成本变化不大的边。您可以通过调整节点选择来优化具有低直线的节点的优先级到入围位置的距离,但是您需要跟踪每个访问节点所采用的路线,以防稍后计算的路线的成本低于已经计算的路线,因此需要减去当前最佳路线通过的所有节点的差异通过重新访问的节点。

大约 10 年前,我在计算机科学学位模块中研究了其中一些图问题算法。这不是一个新问题。您可以使用现有的解决方案,而不是自己编写代码。

【讨论】:

另一个优化选项:按速度对边缘进行分类。对于每个位置,计算完整图的子路径,该子路径到达具有高速边缘的点,该点在朝向输入位置的正确方向的 20 度范围内。然后从输入位置开始,在完整图中搜索之前找到的子路径的末端,但是一旦到达高速边,就忽略低速边。您可以在公共路由节点之间为预先计算的子路由添加额外的边。

以上是关于如何在输入位置的x行程时间内搜索纬度,经度项目的数据库的主要内容,如果未能解决你的问题,请参考以下文章

如何确定一个位置是不是在一个正方形(纬度,经度)PHP内

从给定位置(经度、纬度)的 Y 半径内查找 X 的所有值

如何在弹性搜索中使用纬度经度搜索位置附近的区域

MySQL:多个纬度和经度的附近位置

如何通过经纬度确定位置 知道经纬度怎么查询实际地点?

使用经度和纬度查找给定距离内的所有附近客户