我正在建立一个数据库使用Django,geodjango和postgresql的现场数据。数据包括lats和lons。我的任务之一是摄取已经收集的数据。我想使用.json文件来定义元数据,并编写一些代码来批处理一些json文件。
到目前为止,我得到的是一个模型:
class deployment(models.Model):
'''
@brief This is the abstract deployment class.
'''
startPosition=models.PointField()
startTimeStamp=models.DateTimeField()
endTimeStamp=models.DateTimeField()
missionAim=models.TextField()
minDepth=models.FloatField() # IT seems there is no double in Django
maxDepth=models.FloatField()
class auvDeployment(deployment):
'''
@brief AUV meta data
'''
#==================================================#
# StartPosition : <point>
# distanceCovered : <double>
# startTimeStamp : <dateTime>
# endTimeStamp : <dateTime>
# transectShape : <>
# missionAim : <Text>
# minDepth : <double>
# maxDepth : <double>
#--------------------------------------------------#
# Maybe need to add unique AUV fields here later when
# we have more deployments
#==================================================#
transectShape=models.PolygonField()
distanceCovered=models.FloatField() 和我想用来摄取数据的函数
@staticmethod
def importDeploymentFromFile(file):
'''
@brief This function reads in a metadta file that includes campaign information. Destinction between deployment types is made on the fine name. <type><deployment>.<supported text> auvdeployment.json
@param file The file that holds the metata data. formats include .json todo:-> .xml .yaml
'''
catamiWebPortal.logging.info("Importing metadata from " + file)
fileName, fileExtension = os.path.splitext(file)
if fileExtension == '.json':
if os.path.basename(fileName.upper()) == 'AUVDEPLOYMENT':
catamiWebPortal.logging.info("Found valid deployment file")
data = json.load(open(file))
Model = auvDeployment(**data)
Model.save() 我试图在这里读取的文件
{
"id":1,
"startTimeStamp":"2011-09-09 13:20:00",
"endTimeStamp":"2011-10-19 14:23:54",
"missionAim":"for fun times, call luke",
"minDepth":10.0,
"maxDepth":20.0,
"startPosition":{{"type": "PointField", "coordinates": [ 5.000000, 23.000000 ] }},
"distanceCovered":20.0
}我得到的错误是这样的
TypeError: cannot set auvDeployment GeometryProxy with value of type: <type 'dict'>如果我从模型和文件中删除地理类型。它将读取该文件并填充数据库表。
我将感谢任何关于我如何解析具有地理类型的数据文件的建议。
谢谢
发布于 2012-09-11 10:28:30
好的,解决方法如下。文件格式不是geoJSON文件格式,而是geos格式。.json文件应如下所示。
{
"id": 1,
"startTimeStamp": "2011-10-19 10:23:54",
"endTimeStamp":"2011-10-19 14:23:54",
"missionAim": "for fun times, call luke",
"minDepth":10.0,
"maxDepth":20.0,
"startPosition":"POINT(-23.15 113.12)",
"distanceCovered":20,
"transectShape":"POLYGON((-23.15 113.12, -23.53 113.34, -23.67 112.9, -23.25 112.82, -23.15 113.12))"
}Not StartPosition语法已更改。
发布于 2014-12-01 04:33:15
一种快速的解决方法是在保存模型之前使用geoDjango中的GEOs API将startPosition字段从geoJson格式更改为GEOSGeometry对象。这应该允许它通过验证。
将Django中的GEOSGeometry函数包含在:
from django.contrib.gis.geos import GEOSGeometry
...
Model = auvDeployment(**data)
Model.startPosition = GEOSGeometry(str(Model.startPosition))
Model.save()GEOS API cant construct objects from a GeoJSON format,只要你先把它变成一个字符串。按照原样,您将其作为字典类型而不是字符串进行加载。
https://stackoverflow.com/questions/12347296
复制相似问题