AppEngine GeoPt 数据上传

4 投票
5 回答
3797 浏览
提问于 2025-04-15 15:10

我正在用Java写一个GAE应用程序,只用Python来上传数据。我想导入一个CSV文件,内容大致是这样的:

POSTAL_CODE_ID,PostalCode,City,Province,ProvinceCode,CityType,Latitude,Longitude
1,A0E2Z0,Monkstown,Newfoundland,NL,D,47.150300000000001,-55.299500000000002

我能把这个文件导入到我的数据存储中,只要把纬度和经度作为浮点数导入就可以了,但我现在不知道怎么把纬度和经度导入为GeoPt格式。以下是我的 loader.py 文件:

import datetime
from google.appengine.ext import db
from google.appengine.tools import bulkloader

class PostalCode(db.Model):
  id = db.IntegerProperty()
  postal_code = db.PostalAddressProperty()
  city = db.StringProperty()
  province = db.StringProperty()
  province_code = db.StringProperty()
  city_type = db.StringProperty()
  lat = db.FloatProperty()
  lng = db.FloatProperty()

class PostalCodeLoader(bulkloader.Loader):
  def __init__(self):
    bulkloader.Loader.__init__(self, 'PostalCode',
                               [('id', int),
                                ('postal_code', str),
                                ('city', str),
                                ('province', str),
                                ('province_code', str),
                                ('city_type', str),
                                ('lat', float),
                                ('lng', float)
                               ])

loaders = [PostalCodeLoader]

我觉得那两行 db.FloatProperty() 应该换成 db.GeoPtProperty(),但我不知道接下来该怎么做。我对Python还很陌生,所以任何帮助都非常感谢。

5 个回答

0

避免使用类型转换和实例检查。我使用了geopt和geohash这两个库,它们的用法很相似,建议使用默认值来开始:

    geopt=db.GeoPtProperty(verbose_name="geopt") 

...

        article.geopt = db.GeoPt(self.request.POST.get('lat'),self.request.POST.get('lng'))
        article.geohash = Geohash.encode(float(lat),float(lng), precision=2)#evalu8 precision variable

代码可用

演示应用

0

我不知道你的加载器代码是什么,但是……

# given this
class PostalCode(db.Model):
  id = db.IntegerProperty()
  postal_code = db.PostalAddressProperty()
  city = db.StringProperty()
  province = db.StringProperty()
  province_code = db.StringProperty()
  city_type = db.StringProperty()
  geoLocation = db.GeoPtProperty()


# you should be able to do this
myPostalCode.geoLocation = db.GeoPt(-44.22, -33.55)

更多内容可以在 这里 找到

3

好的,我在Google Groups上找到了我的答案(感谢Takashi Matsuo和Mike Armstrong)。解决办法是修改我的CSV文件,把纬度和经度放在一个双引号的字符串里。这样,双引号字符串中的逗号就不会被当作CSV的分隔符。

POSTAL_CODE_ID,PostalCode,City,Province,ProvinceCode,CityType,Point
1,A0E 2Z0,Monkstown,Newfoundland,NL,D,"47.150300000000001,-55.299500000000002"

另外,这是我新的loader.py。请注意,GeoPtProperty需要一个格式为"00.0000,00.0000"的字符串:

import datetime
from google.appengine.ext import db
from google.appengine.tools import bulkloader


class PostalCode(db.Model):
  id = db.IntegerProperty()
  postal_code = db.PostalAddressProperty()
  city = db.StringProperty()
  province = db.StringProperty()
  province_code = db.StringProperty()
  city_type = db.StringProperty()
  geo_pt = db.GeoPtProperty()

class PostalCodeLoader(bulkloader.Loader):
  def __init__(self):
    bulkloader.Loader.__init__(self, 'PostalCode',
                               [('id', int),
                                ('postal_code', str),
                                ('city', str),
                                ('province', str),
                                ('province_code', str),
                                ('city_type', str),
                                ('geo_pt', str)
                               ])

loaders = [PostalCodeLoader]

撰写回答