Geo Django通过纬度和经度获取城市

13

我正在学习如何使用Geo Django。当用户注册时,我将纬度和经度信息保存如下:

from django.contrib.gis.db import models
from django.contrib.gis.geos import Point

class GeoModel(models.Model):
    """
    Abstract model to provide GEO fields.
    """
    latitude = models.FloatField(blank=True, null=True, verbose_name='Latitude')
    longitude = models.FloatField(blank=True, null=True, verbose_name='Longitude')
    location = models.PointField(blank=True, null=True)

    class Meta:
        abstract = True

    def save(self, *args, **kwargs):
        if self.latitude and self.longitude:
            self.location = Point(float(self.latitude), float(self.longitude))
        super(GeoModel, self).save(*args, **kwargs)

接下来我想添加一个名为city的新字段,**我想要存储基于给定的经纬度详细信息的城市“名称”,例如伦敦。

我看过了django-cities ,它保存了从Geo Name获取的城市数据库,但这似乎太过复杂并且不兼容Python 3,因此对我来说不可行。我看到了一个名为geopy 的包,但这似乎完全替代了Geo Django,并使用具有限制的Google API。

我想坚持使用Geo Django 并以某种方式进行查找,以便根据经度和纬度找到城市名称,那么我的选择是什么?比如...

  1. 找到一种方法将http://www.geonames.org/数据安装到django-cities中,因为django-cities无法在Python 3和Django 1.8.x上工作。
  2. 以某种方式使用Geo Django来使用数据进行查找?(不确定如何做到这一点)

以上是否是正确的处理方式?如果是,那么我如何将数据导入我的数据库,然后使用Geo Django进行查找以找到城市名称?

1个回答

10

你有几种解决方法:

  1. 创建另一个名为 City 的模型

    from django.contrib.gis.db import models
    class City(models.Model):
        name = models.CharField(max_lenght=255)
        geometry = models.MultiPolygonField()
    
        objects = models.GeoManager()
    

接着,您可以使用以下代码查找包含您位置的城市名称:

    geomodel = GeoModel(...)
    city = City.objects.get(geometry__contains=geomodel.location)
    city_name = city.name

根据您感兴趣的国家/地区,您可以在OpenData中找到城市几何信息来填充城市表格(例如http://www.gadm.org/country(未经测试,但似乎提供开放的shapefiles))。

  1. 使用反向地理编码器。谷歌可以提供这样的服务,或者查看http://www.geonames.org/export/reverse-geocoding.html,看看是否有适合您需求的内容。

“geomodel.location” 这是什么类型的字段?是 “PointField” 吗? - Prometheus
1
是的,这就是你在问题中定义的模型 :) - stellasia
最后一个问题是关于“City”模型中使用的“MultiPolygonField”。这是什么,它是什么样子的?我决定使用Geo Name,但它没有那个字段。http://www.geonames.org/search.html?q=london&country= - Prometheus
1
MultiPolygonField包含城市的形状信息,以便查找“包含”检查点是否在多边形内部。该形状似乎不在http://download.geonames.org/export/dump/readme.txt中。您对哪个国家感兴趣? - stellasia
请尝试在此处链接或者链接下载相关内容。 - stellasia

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接