如何在输入位置的x个旅行时间内搜索lat,lon项目的数据库

时间:2016-10-25 16:04:49

标签: php solr maps geo

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

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

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

有没有人知道如何在我的Solr核心(或必要的mysql数据库)中搜索文档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
    )
);

这种方法很好,但它并不是那么准确。它也不允许我按照旅行类型过滤,如步行,公共交通...任何想法?

1 个答案:

答案 0 :(得分:1)

旅行时间是一项非平凡的计算。

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

接下来,计算每个点与输入位置之间的“直线”距离,以过滤到圆半径x距离单位内的位置列表。

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

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

  1. 从与输入位置对应的节点开始,为从起点(从输入位置通往的每条道路上的下一个交叉点)导航的每个节点分配行程时间。
  2. 选择一个未访问的节点,该节点具有通向受访节点(已经有旅行时间的节点)的边缘,其节点的值不超过时间限制。如果可以从多个访问节点到达未访问的节点,则通过每个直接链接的访问笔记计算总时间并分配最低值。
  3. 重复2,直到与候选名单中每个locationID相关联的节点都有一个值,或者没有边缘将未访问的节点链接到任何值低于时间限制的访问节点。
  4. 这是一种广度优先的方法,最适用于成本变化不大的边缘。您可以通过调整节点选择来优化具有低直线的节点的优先级到列入候选位置的距离,但是你需要跟踪每个被访问节点的路由,如果稍后计算的路由的成本低于已经计算的路由,则需要减去当前最佳路由通过的所有节点的差异通过重新访问的节点。

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