Php 使用纬度和经度Symfony2原则按距离存储和排序

Php 使用纬度和经度Symfony2原则按距离存储和排序,php,symfony,doctrine-orm,latitude-longitude,Php,Symfony,Doctrine Orm,Latitude Longitude,我在Symfony2和Doctrine一起工作 我有一个名为Landmarks的实体数据库,其中每个实体都与MapMarker实体有1:many关系,而MapMarker实体有纬度和经度字段,例如,“中央公园”可能是一个具有许多“入口”的地标将存储为地图标记 然后我有另一个名为Property的实体,它与MapMarker有1:1的关系 对于任何给定的属性,查找数据库中所有附近地标的最佳方法是什么,按地标最近的地图标记排序 在这个应用程序的遗留版本中,没有条令或Symfony2,我是这样做的:

我在Symfony2和Doctrine一起工作

我有一个名为
Landmarks
的实体数据库,其中每个实体都与
MapMarker
实体有
1:many
关系,而
MapMarker
实体有
纬度
经度
字段,例如,“中央公园”可能是一个
具有许多“入口”的地标将存储为
地图标记

然后我有另一个名为
Property
的实体,它与
MapMarker
1:1的关系

对于任何给定的
属性
,查找数据库中所有附近
地标
的最佳方法是什么,按地标最近的
地图标记
排序

在这个应用程序的遗留版本中,没有条令或Symfony2,我是这样做的:

  • 检索数据库中的所有
    地标

  • 对于每个
    地标
    ,在PHP函数中遍历其每个
    地图标记
    ,并计算p
    Property地图标记的lat,lng
    地标地图标记的lat,lng
    之间的距离

  • 如果任何计算的距离小于或等于我选择的某个预先确定的常数(比如3km),那么我将
    属性
    链接到
    地标
    中的
    多:多
    关系

  • 稍后,当查询数据库中
    属性附近
    地标
    时,它将只遍历链接的
    地标
    地图标记
    ,然后再次计算最近的
    地图标记
    和显示距离,如下所示:

  • 酒店附近的地标:

    • 中央公园,正门-2.4公里
    • 等等
    这样做的好处是,通过在
    属性
    地标
    之间创建永久链接,我自动获得了附近
    地标
    的“短列表”,用于计算昂贵的距离公式

    但是,正如您可能注意到的,当添加新的
    地标
    地标
    地图标记
    更改时,会出现问题。此外,每次搜索
    属性
    时,计算距离仍然非常缓慢(如果通过
    Landmark
    查找所有
    属性
    ,则计算速度会相反)

    我真的希望找到一个更好的方法,现在我正在迁移到Symfony2和学说


    有什么想法吗

    Symfony2和Doctrine不会将您从通常的数据库/PHP约束中解放出来,因此这几乎是一个调整现有逻辑以适应它的问题

    说到这里,在我的头顶上,我可能会做一些类似的事情:

    • 使用纬度/经度之间的连接查询数据库(即:lat-BETWEEN-marker\u-lat+X/marker\u-lat-X和long-BETWEEN-marker\u-long+X/marker\u-long-X),以获得近距地图标记的短列表
    • 编写一个函数来计算距离并保持最近距离

    而不是创建一个包含大量标记*X条目的全新表,如果你问我的话,这会导致较差的可伸缩性,但显然这取决于你的应用程序限制,因此我无法真正为你考虑清楚。

    计算最大/最小lat和lng如何(例如,在4个方向的直线上3km处的最高和最低lat和lng值)然后,您只需查询地图标记,并找到这些值之间的lat和lng。是的,这是我提出的解决方案中包含的一个步骤!通过缩小字段,在性能上产生了巨大的差异!谢谢@Derickfth这基本上就是我最终要做的,但在细节上有点复杂。