Геокодирование с помощью GeoPy и ImportExport в Django - PullRequest
0 голосов
/ 20 октября 2019

Я переношу набор данных из файла адресов .CSV в модель в Django через плагин ImportExport , и в момент сохранения модель запускает процесс геокодирования с GeoPy.

90% времени, когда это работает, но есть несколько записей, которые появляются со следующей ошибкой:

... в save _, latlon =geocoder.geocode (address) TypeError: невозможно распаковать не повторяемый объект NoneType

Я предполагаю, что геокодирование не находит адрес, но я не уверен, почему он не просто покидает полеопорожнить. Я просмотрел соответствующие разделы в Django Docs, GeoPy docs и docs, но, похоже, не нашел никаких подсказок относительно того, как это исправить.

ниже приведен более полный вывод ошибок трассировки. :

Трассировка (последний последний вызов):

Файл "C: \ Users \ henry \ webvenv \ aavenv \ lib \ site-packages \ import_export \ resources.py",строка 522, в import_row

self.save_instance (экземпляр с использованием_транзакций, dry_run)

Файл "C: \ Users \ henry \ webvenv \ aavenv \ lib \ site-packages \ import_export \ resources. py ", строка 315, в save_instance

instance.save ()

Файл" C: \ Users \ henry \ webvenv \ project \ architects \ models.py ", строка 51, в save

_, latlon = geocoder.geocode (address)

TypeError: невозможно распаковать не повторяемый объект NoneType

Ниже приведен файл app / model.py, которыйзаполняется файлом .CSV и выполняет процесс геокодирования:

from django.conf import settings

from urllib.request import URLError

from django.contrib.gis.db import models

from django.contrib.gis import geos

import geopy.geocoders
from geopy.geocoders import GoogleV3


class Architect(models.Model):

    id = models.CharField(max_length=100, primary_key=True)
    sname = models.CharField(max_length=100)
    fname = models.CharField(max_length=100)
    a1 = models.CharField(max_length=100)
    a2 = models.CharField(max_length=100)
    a3 = models.CharField(max_length=100)
    a4 = models.CharField(max_length=100)
    a5 = models.CharField(max_length=100)
    a6 = models.CharField(max_length=100)
    pcode = models.CharField(max_length=100)
    author = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, null=True)
    location = models.PointField(u"longitude/latitude", blank=True, null=True)

    objects = models.Manager()

#Original def:
#    def __str__(self):
#        return self.id

    def __unicode__(self):
        return self.id

    def save(self, **kwargs):
        if not self.location:
            address = u'%s %s %s %s %s %s' % (self.a2, self.a3, self.a4, self.a5, self.a6, self.pcode)
            address = address.encode('utf-8')
            geocoder = GoogleV3(api_key='my API key')
            try:
                _, latlon = geocoder.geocode(address)
            except (URLError, ValueError):

                pass
            else:
                point = "POINT(%s %s)" % (latlon[1], latlon[0])
                self.location = geos.fromstr(point)
        super(Architect, self).save()

1 Ответ

0 голосов
/ 20 октября 2019

Я, кажется, исправил свою проблему сейчас

Мое решение заключалось в добавлении 'TypeError' к исключению.

Я также добавил тайм-аут 10 секунд, чтобы помочь с геокодами, которые имели сеансошибки тайм-аута, насколько я понимаю, тайм-аут по умолчанию составляет 1 секунду с GeoPy.

Если есть более чистый или более эффективный способ написания этого кода, я был бы признателен за руководство.

...
    def save(self, **kwargs):
        if not self.location:
            address = u'%s %s %s %s %s %s' % (self.a2, self.a3, self.a4, self.a5, self.a6, self.pcode)
            address = address.encode('utf-8')
            geocoder = GoogleV3(api_key='My API Key')
            try:
                _, latlon = geocoder.geocode(address, timeout=10)
            except (URLError, ValueError, TypeError):

                pass
            else:
                point = "POINT(%s %s)" % (latlon[1], latlon[0])
                self.location = geos.fromstr(point)
        super(Architect, self).save()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...