使用纬度和经度Symfony2 Doctrine按距离存储和排序

时间:2014-02-08 05:27:48

标签: php symfony doctrine-orm latitude-longitude

我正在使用Doctrine在Symfony2工作。

我有一个名为Landmarks的实体数据库,其中每个实体与1:many实体之间存在MapMarker关系,而MapMarker实体的实体latitude 1}}和longitude字段,例如“中央公园”可能是Landmark,其中有许多“入口”,可以存储为MapMarkers

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

对于任何给定的Property,找到数据库中所有附近Landmarks的最佳方式是什么,按照最贴近地标MapMarker排序?

在这个应用程序的旧版本中,没有Doctrine或Symfony2,我就是这样做的:

  1. 检索数据库中的所有Landmarks

  2. 对于每个Landmark,在PHP函数中浏览每个MapMarkers并计算P roperty's MapMarker's lat,lngLandmarks MapMarker's lat,lng之间的距离。

  3. 如果任何计算出的距离小于或等于我选择的某个预定常数(比如3公里),那么我将PropertyLandmark中的many:many相关联{1}} relatioship。

  4. 稍后,当在数据库中查询Property's附近的Landmarks Landmarks时,它只会检查链接的MapMarkers'MapMarker,然后再次计算最近的Property和展示距离如下:

  5.   
        

    您所在地区的附近地标:

      
         
        
    • 中央公园,主门 - 2.4公里
    •   
    •   

    这样做的好处在于,通过在LandmarkLandmarks之间创建永久链接,我自动拥有了附近Landmark的“短名单”,可供计算昂贵的距离公式。

    但是,您可能已经注意到,添加新的MapMarkersLandmark的{​​{1}}更改时会出现问题。此外,每次搜索Property时计算距离仍然很慢(如果Properties找到所有Landmark,则反向计算距离。)

    因为我正在迁移到Symfony2和Doctrine,所以真的希望能找到更好的方法。

    有什么想法吗?

1 个答案:

答案 0 :(得分:0)

Symfony2和Doctrine不会让你摆脱通常的数据库/ PHP约束,所以这几乎就是让你现有的逻辑适应它。

说到我的头脑,我可能会做类似的事情:

  • 加入在纬度/经度上使用BETWEEN查询数据库(即:在marker_lat + X / marker_lat之间的拉幅 - 以及在marker_long + X / marker_long - X之间的长度)以获得地图标记关闭的简短列表
  • 编写一个函数来计算距离并保持最接近的

而不是制作一个包含标记数量的全新表格* X条目会导致可扩展性差,如果你问我但很明显这取决于你的应用程序限制,所以我真的不能认为这是为了你。