2014-02-08 36 views
0

我在Symfony2中使用Doctrine。使用经纬度存储和按距离排序Symfony2 Doctrine

我有一个名为Landmarks,其中每个实体具有与MapMarker实体1:many关系的实体的数据库中,并且它是具有latitudelongitude字段,例如该实体MapMarker “中央公园”可能是一个Landmark与许多“入口”将被存储为​​。

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

对于任何给定的Property什么是最好的方式来查找所有附近的Landmarks在数据库中,按地标的最近MapMarker

在这个应用程序的旧版本,没有教义或Symfony2中,我在做这样说:

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

  2. 对于每个Landmark,经过各其​​在PHP函数中,并计算P roperty's MapMarker's lat,lngLandmarks MapMarker's lat,lng之间的距离。

  3. 如果任何计算出的距离的是小于或等于某个预定常数我选择(比方说3公里)然后我发链接的PropertyLandmarkmany:many relatioship。

  4. 后来,为Property's附近Landmarks查询数据库时,它会去只通过链接Landmarks“​​,然后计算,再次呈现最近MapMarker和距离像这样:

附近的地标为您的属性:

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

这样做的好处是,它通过创建PropertyLandmark的永久链路,我会自动有一个“短 - “附近的Landmarks”,为其计算昂贵的距离公式。

但是,正如您可能注意到的,当添加新的LandmarkLandmark的​​发生更改时,会出现问题。而且,每次搜索到Property时,计算距离的速度仍然很慢(或者如果发现所有Properties的值为Landmark)则仍然很慢。

真的希望想出一个更好的办法,现在我是迁移到Symfony2的和教条。

任何想法?

+0

怎么样计算的最大/最小纬度和经度(例如,在4个方向的直线为3公里最高和最低纬度和经度值),那么你可以进行查询的地图标记,并找到lat和在这些值之间。 –

+0

是的,这是我包含在我想出的解决方案中的一个步骤!通过缩小领域在性能上有很大的差异!谢谢@DerickF –

回答

0

那么Symfony2中和学说将不会从你平时的数据库/ PHP的约束中解放出来所以它是非常适应现有的逻辑,它的问题。

虽这么说,我的头顶,我可能会做这样的事情:

  • 加入查询与A之间的纬度/经度(即数据库:LAT marker_lat之间+ X/marker_lat - X长marker_long + X/marker_long之间 - X)来获得由mapmarkers接近短名单
  • 编写一个函数来计算距离,并保持最接近

而不是让一个全新的表的标记数* X条目,使穷人可扩展性,如果你问我,但显然这取决于你的应用程序的限制,所以我不能真的认为你通过。

+0

这基本上就是我最终做的,但是它在细节上有点复杂。 –

相关问题