我在Symfony2中使用Doctrine。使用经纬度存储和按距离排序Symfony2 Doctrine
我有一个名为Landmarks
,其中每个实体具有与MapMarker
实体1:many
关系的实体的数据库中,并且它是具有latitude
和longitude
字段,例如该实体MapMarker
“中央公园”可能是一个Landmark
与许多“入口”将被存储为。
然后我有另一个名为Property
的实体,它有1:1
与MapMarker
的关系。
对于任何给定的Property
什么是最好的方式来查找所有附近的Landmarks
在数据库中,按地标的最近MapMarker
?
在这个应用程序的旧版本,没有教义或Symfony2中,我在做这样说:
检索所有数据库中的
Landmarks
对于每个
Landmark
,经过各其在PHP函数中,并计算Property's MapMarker's lat,lng
和Landmarks MapMarker's lat,lng
之间的距离。如果任何计算出的距离的是小于或等于某个预定常数我选择(比方说3公里)然后我发链接的
Property
到Landmark
在many:many
relatioship。后来,为
Property's
附近Landmarks
查询数据库时,它会去只通过链接Landmarks
“,然后计算,再次呈现最近MapMarker
和距离像这样:
附近的地标为您的属性:
- 中央公园,正门 - 2.4公里
- 等
这样做的好处是,它通过创建Property
和Landmark
的永久链路,我会自动有一个“短 - “附近的Landmarks
”,为其计算昂贵的距离公式。
但是,正如您可能注意到的,当添加新的Landmark
或Landmark
的发生更改时,会出现问题。而且,每次搜索到Property
时,计算距离的速度仍然很慢(或者如果发现所有Properties
的值为Landmark
)则仍然很慢。
真的希望想出一个更好的办法,现在我是迁移到Symfony2的和教条。
任何想法?
怎么样计算的最大/最小纬度和经度(例如,在4个方向的直线为3公里最高和最低纬度和经度值),那么你可以进行查询的地图标记,并找到lat和在这些值之间。 –
是的,这是我包含在我想出的解决方案中的一个步骤!通过缩小领域在性能上有很大的差异!谢谢@DerickF –