GeoDjango 距离搜索

3 投票
2 回答
1885 浏览
提问于 2025-04-15 17:14

我想用GeoDjango来做一些基本的地点搜索。具体来说,我想给搜索功能一个邮政编码、城市或县,然后找到在5英里、10英里、20英里等范围内的所有邮政编码、城市和县。我在文档中找到以下一段话:

使用地理坐标系统可能会给开发者带来一些后续的复杂问题。例如,PostGIS无法在使用地理坐标系统的情况下,对非点几何体进行距离计算,比如构建一个查询来查找所有在以WGS84存储的县边界5英里范围内的点。

如果我想在美国使用PostGIS来进行上述搜索,这到底是什么意思呢?文档建议使用投影坐标系统来覆盖特定区域。但我需要覆盖整个国家,所以这可能不是一个选项。

简单来说,我最终想要的是能够根据一个起始位置和距离,找到相邻的邮政编码、城市和县。我并不太关心这在技术层面上是怎么实现的。

另外,我在哪里可以找到一个包含美国邮政编码、城市和县地理边界的数据库,以便我可以导入到GeoDjango模型中呢?

更新

我找到一个包含美国所有邮政编码的经纬度坐标的数据库,在这里。我的计划是将这些点导入到GeoDjango模型中,并使用PostGIS构建查询,以找到距离给定点x英里范围内的其他点。这就解决了文档中提到的问题,因为所有邮政编码都被视为点,而不是多边形。这对我的使用场景来说是可以接受的,因为我并不在乎完美的准确性。

好的方面:这个数据文件是免费的。

坏的方面:这些数据来自2000年的人口普查,所以有点过时。

稍微乐观一点:美国人口普查局每10年进行一次人口普查,快到2010年了。

结论:对我来说,这已经足够好了。

2 个回答

0

在编程中,有时候我们需要把一些数据从一个地方传到另一个地方。这就像把水从一个杯子倒到另一个杯子一样。为了做到这一点,我们通常会用一些工具或者方法来帮助我们完成这个任务。

有些时候,这个过程可能会遇到一些问题,比如数据可能会丢失,或者在传输的过程中出现错误。就像在倒水的时候,如果不小心倾斜得太快,水可能会洒出来一样。

为了避免这些问题,我们可以采取一些措施,比如使用更稳妥的方式来传输数据,或者在传输之前先检查一下数据的完整性。这样可以确保我们在传输数据的时候不会出错。

总之,数据传输就像是一个小小的搬家过程,我们需要小心翼翼地把每一件东西都搬到新地方,确保它们不会在路上丢失或损坏。

In [1]: o = Place.objects.get(pk=2463583)  # Oakland, CA

In [2]: sf = Place.objects.get(pk=2487956)  # San Francisco, CA

In [3]: o.coords.transform(3410)  # use the NSIDC EASE-Grid Global projection

In [4]: sf.coords.transform(3410)  # use the NSIDC EASE-Grid Global projection

In [5]: o.coords.distance(sf.coords)  # find the distance between Oakland and San Francisco (in meters)
Out[5]: 14401.942808571299
3

为了绕过你提到的限制,你可以先找到用户提供的邮政编码区域的中心点,然后从这个点出发,找出所有与这个点形成5、10英里或其他距离的圆圈相交的邮政编码区域。我不太确定在geodjango中怎么实现,但在postgis中肯定是可以做到的。

你提到的限制基本上是说,你不能写一个查询来要求“给我所有在俄亥俄州边界内5英里范围内的点。”

撰写回答