2012-09-10 5 views
0

Je construis une base de données en utilisant Django, geodjango et postgresql de données de terrain. Les données incluent les lats et les lons. L'une de mes tâches consiste à ingérer des données qui ont déjà été recueillies. Je voudrais utiliser le fichier .json pour définir les métadonnées et écrire du code pour traiter par lots des fichiers json.json au modèle geoDjango

Ce que j'ai jusqu'à présent est un modèle:

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()  

Je fonction que je veux utiliser pour ingérer les données

@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()   

et le fichier que je suis en train de lire dans ce

{ 
"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 
} 

L'erreur que je reçois est ce

TypeError: cannot set auvDeployment GeometryProxy with value of type: <type 'dict'> 

Si je supprime les géo-types du modèle et du fichier. Il va lire le fichier et remplir la table de base de données.

J'apprécierais n'importe quel conseil un comment je suis analyser le fichier de données avec les géotypes.

Merci

Répondre

0

Je vous suggère d'utiliser la commande par défaut pour les appareils de chargement: loaddata

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

La structure de votre JSON devrait être ajusté slighty, mais vous pouvez faire un simple dumpdata pour voir comment la structure devrait ressembler.

0

D'accord, la solution est la suivante. Le format de fichier n'est pas le format de fichier geoJSON, c'est le format geos. Le fichier .json devrait être comme suit.

{ 
"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))" 
} 

La syntaxe StartPosition n'a pas été modifiée.

1

Une solution rapide serait d'utiliser l'API GEO dans geoDjango pour changer le champ startPosition du format geoJson en un objet GEOSGeometry avant de sauvegarder le modèle. Cela devrait lui permettre de passer la validation.

Inclure la fonction GEOSGeometry de Django avec:

from django.contrib.gis.geos import GEOSGeometry 
... 

Model = auvDeployment(**data) 
Model.startPosition = GEOSGeometry(str(Model.startPosition)) 
Model.save() 

Le GEOS API cant construct objects from a GeoJSON format, aussi longtemps que vous le faites une première chaîne. En l'état, vous le chargez en tant que type de dictionnaire au lieu d'une chaîne.