从这个问题开始,我想决定是否应该使用GeoDjango,或者用Python自己动手来过滤另一个Point的某个半径内的Point。
有两个优秀的答案可以采用不同的方法解决如何执行此类计算的问题:Django sort by distance
其中一个使用GeoDjango在PostGIS中执行距离计算。我猜测计算会在RDS实例上完成吗?
另一个使用自定义管理器来实现Great Circle距离公式。计算显然可以在EC2实例上完成。
我认为PostGIS的实施效率更高,因为人们可能比我优化它更聪明。他们在多大程度上优化了它?他们的实施有什么特别之处吗?
假设我假设GeoDjango在RDS实例上使用PostGIS执行距离计算是正确的,我认为RDS不适合繁重的计算任务,最终可能会变得更慢或更昂贵。我的假设是否正确?
如果我不需要精确的距离,八角形甚至一个正方形就足够了怎么办?在正方形的情况下,仅仅是在一定范围内过滤具有纬度和经度的点的问题。 GeoDjango / PostGIS能够执行这样的估算吗?
如果我确实需要一个精确的距离,我可以计算出给定半径可以达到的最远边界,并且只对这些边界内的点进行精确的距离计算。 GeoDjango / PostGIS会这样做吗?
答案 0 :(得分:1)
我会试着解答你的问题:
其中一个使用GeoDjango来执行距离计算 PostGIS的。我猜测计算将在RDS上完成 实例
如果要将两个django模型带入内存,并使用Django进行计算,例如
model_a = Foo.objects.get(id=1)
model_b = Bar.objects.get(id=1)
distance = model_a.geometry.distance(model_b.geometry)
这将使用GEOS在Python中完成。
Django上有距离查找,例如
foos = Foo.objects.filter(geometry__distance_lte=(Point(0,0,srid=4326), km1))
此计算将由后端(也称为数据库)完成。
另一个使用自定义管理器来实现Great Circle距离 式。计算显然可以在EC2实例上完成。
我认为PostGIS的实施效率更高,因为人们可能比我优化它更聪明。 他们在多大程度上优化了它?有什么特别的吗? 他们的实施?
Django有在查询中使用GCD的方法。这需要将PostGIS(如果是几何字段)转换为地理字段。目前仅支持EPSG:4326。如果这就是您所需要的,我敢打赌,PostGIS实施对于几乎所有应用程序(如果不是全部)都足够好。
假设我在假设GeoDjango在RDS实例上使用PostGIS执行距离计算是正确的,我会想象RDS是 不适合繁重的计算任务,并可能最终变慢或 最后更贵。我的假设是否正确?
我对亚马逊产品了解不多,但没有大小估计(行数,计算类型(例如交叉产品)等),很难进一步帮助
如果我不需要精确的距离,八角形甚至一个正方形就足够了怎么办?在正方形的情况下,它将只是一个 在a内过滤具有纬度和经度的点的问题 一定的范围。 GeoDjango / PostGIS是否能够执行估算 此?
你有什么样的数据?计算距离和面积有几个组成部分,主要是您使用的空间参考(基准面,椭球面,投影)。
如果您需要在地球的两个距离边之间进行准确或更准确的距离测量,地理方面更精确,并将产生良好的结果。如果您需要在笛卡尔平面上进行这种测量,那么您的数据将产生不良结果。
如果您的数据是本地数据,例如几平方公里,请考虑使用更本地的空间参考。 WGS84 4326更适合全球数据。本地空间参考可以为您提供精确的结果,但范围要小得多。
如果我确实需要精确的距离,我可以计算出给定半径可以达到的最远边界,并且只执行 在这些边界内的点上的精确距离计算。是否 GeoDjango / PostGIS做到了吗?
我认为你过早地进行了优化。我知道你的问题有点陈旧,但这是你应该只关心它开始受伤的事情。在一个政府中,PostGIS和Django长期以来一直在研究大量数据。检查土地登记处地块的系统,并进行大量查询以检查几个参数。它没有任何障碍地工作了几年。