0

フィールドデータのDjango、geodjango、postgresqlを使ってデータベースを構築しています。データには緯度と経度が含まれます。私のタスクの 1 つは、既に収集されたデータを取り込むことです。.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'>

モデルとファイルから地理タイプを削除すると。ファイルを読み取り、データベース テーブルに入力します。

ジオタイプを使用してデータファイルを解析する方法についてアドバイスをいただければ幸いです。

ありがとう

4

3 に答える 3

1

さて、解決策は次のとおりです。ファイル形式は 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))"   
}

StartPosition 構文は変更されていません。

于 2012-09-11T02:28:29.873 に答える
1

モデルを保存する前に、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 は GeoJSON 形式からオブジェクトを構築できません。現状では、文字列ではなく辞書型としてロードしています。

于 2014-11-30T20:33:15.287 に答える
0

I suggest you use the default command for loading fixtures: loaddata

python manage.py loaddata path/to/myfixture.json ...

The structure of your json would have to be slighty adjusted, but you could make a simple dumpdata to see how the structure should look like.

于 2012-09-10T07:54:30.507 に答える