Php 使用纬度和经度Symfony2原则按距离存储和排序
我在Symfony2和Doctrine一起工作 我有一个名为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,我是这样做的:
Landmarks
的实体数据库,其中每个实体都与MapMarker
实体有1:many
关系,而MapMarker
实体有纬度和经度字段,例如,“中央公园”可能是一个具有许多“入口”的地标将存储为地图标记
然后我有另一个名为Property
的实体,它与MapMarker
有1:1的关系
对于任何给定的属性
,查找数据库中所有附近地标
的最佳方法是什么,按地标最近的地图标记
排序
在这个应用程序的遗留版本中,没有条令或Symfony2,我是这样做的:
检索数据库中的所有地标
对于每个地标
,在PHP函数中遍历其每个地图标记
,并计算pProperty地图标记的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这基本上就是我最终要做的,但在细节上有点复杂。