在Django中使用GeoPy和ImportExport进行地理编码

问题描述 投票:0回答:1

[我通过ImportExport插件将地址的.CSV文件中的数据集带入Django中的模型中,并在保存该点时,模型使用GeoPy运行地理编码过程。

90%的时间有效,但有些条目出现以下错误:

...在保存_,latlon = geocoder.geocode(地址)TypeError:无法解压缩不可迭代的NoneType对象

我猜测地理编码找不到地址,但我不确定为什么它不只是将字段留空。我在Django文档,GeoPy文档和Google Maps地理编码文档中查找了相关章节,但似乎没有找到有关如何解决它的任何提示。

下面是更完整的追溯错误输出:

追踪(最近通话):

文件“ C:\ Users \ henry \ webvenv \ aavenv \ lib \ site-packages \ import_export \ resources.py”,第522行,在import_row中

self.save_instance(instance,using_transactions,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行,保存中

_,latlon = geocoder.geocode(地址)

TypeError:无法解包不可迭代的NoneType对象

下面是由.CSV文件填充并正在运行地址解析过程的app / model.py:

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()
python django google-maps-api-3 geocoding django-import-export
1个回答
0
投票

我似乎已经解决了我的问题

我的解决方案涉及在异常中添加'TypeError'。

[我还添加了10秒的超时来帮助遇到会话超时错误的地址解析,根据我的理解,对于GeoPy,默认超时为1秒。

如果有更简洁或更有效的方式编写此代码,我将感谢您的指导。

...
    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()
© www.soinside.com 2019 - 2024. All rights reserved.