首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >json到geoDjango模型

json到geoDjango模型
EN

Stack Overflow用户
提问于 2012-09-10 15:47:35
回答 3查看 2K关注 0票数 0

我正在建立一个数据库使用Django,geodjango和postgresql的现场数据。数据包括lats和lons。我的任务之一是摄取已经收集的数据。我想使用.json文件来定义元数据,并编写一些代码来批处理一些json文件。

到目前为止,我得到的是一个模型:

代码语言:javascript
复制
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()      

和我想用来摄取数据的函数

代码语言:javascript
复制
@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()           

我试图在这里读取的文件

代码语言:javascript
复制
{
"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
}

我得到的错误是这样的

代码语言:javascript
复制
TypeError: cannot set auvDeployment GeometryProxy with value of type: <type 'dict'>

如果我从模型和文件中删除地理类型。它将读取该文件并填充数据库表。

我将感谢任何关于我如何解析具有地理类型的数据文件的建议。

谢谢

EN

回答 3

Stack Overflow用户

发布于 2012-09-11 10:28:30

好的,解决方法如下。文件格式不是geoJSON文件格式,而是geos格式。.json文件应如下所示。

代码语言:javascript
复制
{
"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语法已更改。

票数 1
EN

Stack Overflow用户

发布于 2014-12-01 04:33:15

一种快速的解决方法是在保存模型之前使用geoDjango中的GEOs API将startPosition字段从geoJson格式更改为GEOSGeometry对象。这应该允许它通过验证。

将Django中的GEOSGeometry函数包含在:

代码语言:javascript
复制
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,只要你先把它变成一个字符串。按照原样,您将其作为字典类型而不是字符串进行加载。

票数 1
EN

Stack Overflow用户

发布于 2012-09-10 15:54:31

我建议您使用默认的命令来加载fixture:loaddata

代码语言:javascript
复制
python manage.py loaddata path/to/myfixture.json ...

您的json的结构必须稍作调整,但您可以创建一个简单的dumpdata来查看结构应该是什么样子。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12347296

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档