[我通过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()
我似乎已经解决了我的问题
我的解决方案涉及在异常中添加'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()