AppEngine GeoPt 数据上传
我正在用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
我不知道你的加载器代码是什么,但是……
# 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]