Карта Google для отображения нескольких мест в Django Project

Я хочу использовать карту Google, чтобы показать более одного почтового адреса в моем проекте django. Адреса являются переменными из базы данных.

До сих пор я пробовал django-easy-maps, который отлично подходит для отображения только ОДНОГО адреса. Как уже говорилось, его очень легко использовать, если у вас есть только один адрес (возможно, вы сможете показать более одного).

Я также попробовал django-gmapi, который может отображать более одного адреса (в формате latlng). Но мне трудно преобразовать мой почтовый адрес в формате latlng.

Итак, мои вопросы:

  1. Поддерживает ли django-easy-maps более одного адреса?
  2. Как использовать geocoding с django-gmapi
  3. Любые предложения, как показать более одного почтового адреса США на карте Google в Django?

person Bigyellowbee    schedule 15.11.2011    source источник


Ответы (1)


Возможно, я могу помочь решить пункт 2 ... как геокодировать существующие адреса.

ОБНОВЛЕНИЕ
Похоже, что gmapi имеет встроенный помощник по геокодированию, поэтому вам, вероятно, не нужен код, который я вставил ниже. См.: Есть ли у кого-нибудь опыт геокодирования с использованием django-gmapi?< /а>


Я использовал следующий код:

import urllib

from django.conf import settings
from django.utils.encoding import smart_str
from django.db.models.signals import pre_save
from django.utils import simplejson as json


def get_lat_long(location):
    output = "csv"
    location = urllib.quote_plus(smart_str(location))
    request = "http://maps.google.co.uk/maps/api/geocode/json?address=%s&sensor=false" % location
    response = urllib.urlopen(request).read()
    data = json.loads(response)
    if data['status'] == 'OK':
        # take first result
        return (str(data['results'][0]['geometry']['location']['lat']), str(data['results'][0]['geometry']['location']['lng']))
    else:
        return (None, None)

def get_geocode(sender, instance, **kwargs):
    tlat, tlon = instance._geocode__target_fields
    if not getattr(instance, tlat) or not getattr(instance, tlon):
        map_query = getattr(instance, instance._geocode__src_field, '')
        if callable(map_query):
            map_query = map_query()
        lat, lon = get_lat_long(map_query)
        setattr(instance, tlat, lat)
        setattr(instance, tlon, lon)

def geocode(model, src_field, target_fields=('lat','lon')):
    # pass src and target field names as strings
    setattr(model, '_geocode__src_field', src_field)
    setattr(model, '_geocode__target_fields', target_fields)
    pre_save.connect(get_geocode, sender=model)

(Возможно, я позаимствовал его где-то из проекта Github, если да, я потерял авторство, извините!)

Тогда на вашей модели вам нужно что-то вроде:

from django.db import models
from gmaps import geocode # import the function from above

class MyModel(models.Model):
    address = models.TextField(blank=True)
    city = models.CharField(max_length=32, blank=True)
    postcode = models.CharField(max_length=32, blank=True)

    lat = models.DecimalField(max_digits=12, decimal_places=6, verbose_name='latitude', blank=True, null=True, help_text="Will be filled automatically.")
    lon = models.DecimalField(max_digits=12, decimal_places=6, verbose_name='longitude', blank=True, null=True, help_text="Will be filled automatically.")

    def map_query(self):
        """
        Called on save by the geocode decorator which automatically fills the
        lat,lng values. This method returns a string to use as query to gmaps.
        """
        map_query = ''
        if self.address and self.city:
            map_query = '%s, %s' % (self.address, self.city)
        if self.postcode:
            if map_query:
                map_query = '%s, ' % map_query
            map_query = '%s%s' % (map_query, self.postcode)
        return map_query

geocode(Venue, 'map_query')

Затем, чтобы геокодировать существующие данные, вы можете просто повторно сохранить все существующие записи, например:

from .models import MyModel

for obj in MyModel.objects.all():
    obj.save()
person Anentropic    schedule 12.01.2012
comment
@user1046012 user1046012 о, я вижу, что другой вопрос тоже был вашим, так что я думаю, у вас уже есть ответ! - person Anentropic; 12.01.2012