Est-il possible de convertir du JSON ordinaire en GeoJSON?


10

Mes excuses s'il s'agit d'une question répétée, j'ai cherché ici et je n'ai pas trouvé de réponse. J'ai des données JSON que j'ai exportées depuis Openpaths.cc qui contient des valeurs lat et lon. Cependant, les données ne sont pas au format GeoJSON et ne peuvent donc pas être lues par OGR2OGR. Quelqu'un pourrait-il m'indiquer dans la bonne direction comment convertir mes données en GeoJSON? J'aimerais finalement l'afficher avec Leaflet. Voici à quoi ressemblent les données:

[
{
    "lon": -73.97, 
    "device": "iPhone3,3", 
    "version": "1.1", 
    "t": 1381167616, 
    "lat": 40.66, 
    "alt": 67, 
    "os": "6.1.3"
}, 
{
    "lon": -73.96, 
    "device": "iPhone3,3", 
    "version": "1.1", 
    "t": 1381171200, 
    "lat": 40.66, 
    "alt": 45, 
    "os": "6.1.3"
} 

]



Failure: Unable to open datasourceJ'obtiens un ogr2ogr en essayant cela avec mes données json.
clhenrick

pouvez-vous publier un fichier / code sur jsfiddle ou pastbin?
Mapperz

code? Je cherche juste à changer le format de données ci-dessus. Le JSON ci-dessus est un exemple mais c'est le schéma.
clhenrick

Le moyen le plus simple consiste à enregistrer votre couche en tant que GeoJson dans QGIS sans aucun code!
maxkpow

Réponses:


11

Donc, ce script python prendra un fichier d'entrée json comme détaillé ci-dessus et écrit geojson correctement formaté dans le fichier de sortie.

exécuter le script dans le terminal en faisant python scriptname.py input_file.json output_file.json

#! usr/bin/env python

from sys import argv
from os.path import exists
import simplejson as json 

script, in_file, out_file = argv

data = json.load(open(in_file))

geojson = {
    "type": "FeatureCollection",
    "features": [
    {
        "type": "Feature",
        "geometry" : {
            "type": "Point",
            "coordinates": [d["lon"], d["lat"]],
            },
        "properties" : d,
     } for d in data]
}


output = open(out_file, 'w')
json.dump(geojson, output)

print geojson

Lorsque j'essaie ceci avec sur la ligne de commande avec mon fichier JSON, j'obtiens l'erreur: Fichier "json2geojson.py", ligne 28 print geojson ^ SyntaxError: syntaxe invalide Pouvez-vous m'aider avec cela?
Stefan

Salut @Stefan quelle version de python utilisez-vous? si vous commentez cette ligne, cela fonctionne-t-il?
clhenrick

1
J'utilise python 2.7, donc cela peut être un problème. Essayez de changer import simplejson as jsonpourimport json
clhenrick

1
@Stefan pouvez-vous publier vos données json quelque part afin que je puisse les consulter?
clhenrick

1
Vos données sont formatées différemment des miennes. Si vous supprimez le plus externe { }et supprimez également "events:"mais laissez le [ ]puis enregistrez le fichier de données et exécutez le script, cela devrait fonctionner. Voici ce que je veux dire: jsfiddle.net/chenrick/1cjh81hf
clhenrick

2

Je vous recommande de suivre:

1- Convertissez votre json en csv en utilisant http://www.danmandle.com/blog/json-to-csv-conversion-utility/

2- Créez un fichier vrt pour vos données csv en utilisant http://www.gdal.org/ogr/drv_csv.html

3- Utiliser GDAL (ogr2ogr -f 'GeoJSON' output_file input_file)

4- Chargez le fichier geojson de sortie sur votre carte à l'aide de la bibliothèque de brochures

J'espère que cela aidera.


merci Farhat, cette solution fonctionne. J'ai également trouvé un script python pour accomplir cela ici
clhenrick

0

Conversion d'ArcGIS JSON en GeoJSONThere dans le navigateur pur

il y a 2 façons de faire

1) TERRAFORMER

Remarque: l'utilisation dans node.js et l'utilisation dans le navigateur sont différentes , détails voir lien

2) Esri / arcgis-to-geojson-utils

Esri ne fournit pas le bundle.js, vous ne pouvez donc PAS utiliser cette lib directement dans le navigateur

À ce jour, vous ne pouvez pas charger le module dans le navigateur.

Vous ne pouvez utiliser ESIR lib que dans node.js, pas dans le navigateur.

Pour utiliser cette bibliothèque esri dans le navigateur, vous devez utiliser un bundler, veuillez suivre:

a) Vous devez compiler tout le fichier source du module dans un seul bundle.js

rollup.js installer par

npm install --global rollup

puis allez dans votre dossier racine js lib, trouvez le fichier js du point d'entrée, dans ce cas c'est index.js

$ rollup index.js --format umd --name "esri_arcgis_to_geojson" --file bundle.js

Vous devriez trouver un nouveau fichier bundle.js dans votre répertoire racine.

Maintenant, dans votre fichier html de navigateur, incluez ce fichier bundle.js

<script src='.../.../.../bundle.js'>

Vous pouvez l'utiliser maintenant en

  // parse ArcGIS JSON, convert it to GeoJSON
  var geojson = esri_arcgis_to_geojson.arcgisToGeoJSON({
                            "x":-122.6764,
                            "y":45.5165,
                            "spatialReference": {
                              "wkid": 4326
                            }
                            });

 // take GeoJSON and convert it to ArcGIS JSON
  var arcgis = esri_arcgis_to_geojson.geojsonToArcGIS({
                            "type": "Point",
                              "coordinates": [45.5165, -122.6764]
                            });enter code here

N'oubliez pas que esri_arcgis_to_geojson est le nom que vous avez nommé lib

Cela devient le nom de la variable globale, disponible dans le navigateur.

L'astuce est que le processus de bundle ajoute une fonction d'implémentation instantanée comme (fonction xx {}) voici la partie supérieure de bundle.js

  (function (global, factory) {
     typeof exports === 'object' && typeof module !== 'undefined' ? 
        factory(exports) :
      typeof define === 'function' && define.amd ? define(['exports'], 
         factory) :
      (factory((global.arcgis_to_geojson = {})));
      }(this, (function (exports) { 'use strict';

         ***ORIGINAL SOURCE CODE OF JS MODULE***

     })));

arcgis-to-geojson-utils

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.