【问题标题】:Geocoding with GeoPy and ImportExport in Django在 Django 中使用 GeoPy 和 ImportExport 进行地理编码
【发布时间】:2020-02-16 11:36:12
【问题描述】:

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

90% 的时间它可以工作,但有一些条目会出现以下错误:

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

我猜地理编码没有找到地址,但我不确定为什么它不只是将字段留空。我在 Django Docs、GeoPy docs 和 google maps geocoding docs 中查找了相关部分,但似乎没有找到任何关于如何修复它的提示。

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

Traceback(最近一次调用最后一次):

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

self.save_instance(instance, using_transactions, dry_run)

文件“C:\Users\henry\webvenv\aavev\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】:

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

    我的解决方案涉及将“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()
    

    【讨论】:

      猜你喜欢
      • 2015-09-24
      • 1970-01-01
      • 2021-01-26
      • 2015-10-07
      • 1970-01-01
      • 2015-07-19
      • 2018-09-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多