2015-07-21 22 views
11

Tôi đang học cách sử dụng Geo Django. Khi đăng ký sử dụng tôi lưu vĩ độ và kinh độ thông tin như bên dưới:Geo Django nhận được các thành phố từ vĩ độ và kinh độ

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) 

Tiếp theo, tôi muốn thêm một trường mới có tên city nơi ** Tôi muốn để lưu trữ các thành phố "tên" tức là London dựa dài và chi tiết lat được cung cấp.

Tôi đã xem django-cities nơi lưu cơ sở dữ liệu của các thành phố từ Tên địa lý, nhưng điều này có vẻ quá mức cần thiết và không tương thích với Python 3 vì vậy không cần thiết cho tôi. Tôi đã thấy một gói có tên là geopy nhưng điều này dường như thay thế hoàn toàn Geo Django và sử dụng API Google đi kèm với các hạn chế.

Tôi muốn gắn bó với Geo Django và bằng cách nào đó, hãy tìm kiếm tên Thành phố dựa trên dài và lat, vì vậy, các tùy chọn của tôi là gì? tức là ..

  1. Tìm một cách để cài đặt http://www.geonames.org/ dữ liệu django-thành phố không làm việc cho Python 3 và Django 1.8.x
  2. Bằng cách nào đó sử dụng Geo Django để làm tra cứu này bằng cách sử dụng dữ liệu? (không chắc chắn để làm điều này)

Có đúng cách để tiếp cận điều này không? Nếu vậy làm thế nào để tôi nhận được dữ liệu vào DB của tôi sau đó làm một tra cứu trên nó bằng cách sử dụng Geo Django để tìm tên thành phố?

Trả lời

8

Bạn có một vài giải pháp để làm điều này:

  1. Tạo một mô hình thành phố

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

Sau đó, bạn có thể tìm thấy tên của thành phố chứa vị trí của bạn với:

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

Tùy thuộc vào quốc gia/khu vực bạn quan tâm, bạn có thể tìm thấy hình dạng thành phố để điền vào bảng Thành phố trong OpenData (ví dụ: http://www.gadm.org/country (không được thử nghiệm nhưng dường như đề xuất shapefiles mở))

  1. Sử dụng bộ mã hóa địa lý nghịch đảo. Google có thể cung cấp dịch vụ như vậy hoặc xem http://www.geonames.org/export/reverse-geocoding.html nếu có điều gì đó phù hợp với nhu cầu của bạn.
+0

'' geomodel.location'' loại trường này là '' PointField'' là gì? – Prometheus

+1

Có, đây là mô hình bạn đã xác định trong câu hỏi của bạn :) – stellasia

+0

Câu hỏi cuối cùng để '' MultiPolygonField'' được sử dụng trong mô hình Thành phố. cái này trông như thế nào? Tôi đã quyết định sử dụng Tên địa lý nhưng không có trường http://www.geonames.org/search.html?q=london&country= – Prometheus

Các vấn đề liên quan