Formater un fichier GeoJSON spécifique dans le format correct

9

Je veux utiliser ce fichier json, ce n'est pas encore un fichier GeoJSON mais j'ai remarqué qu'il contient plusieurs fonctionnalités et pas une qui me déroute. Je voulais vous demander si vous connaissez un outil où je peux fusionner toutes les fonctionnalités / FeatureCollections dans un fichier GeoJSON valide afin que je puisse l'utiliser comme D3.js? Le fichier d'origine est ici et je me suis déjà débarrassé de ce qui n'est pas nécessaire pour le geojson.

Voici un extrait du GeoJson, il est assez gros donc c'est juste un extrait

{"points": [{
        "type": "FeatureCollection",
        "features": [{
            "type": "Feature",
            "geometry": {
                "coordinates": [41.9773865, 36.3372536],
                "type": "Point"
            },
            "properties": {
                "attacks": 1,
                "location": "Sinjar",
                "date": "2015-10-16"
            }
        }, {
            "type": "Feature",
            "geometry": {
                "coordinates": [43.4873886, 34.9301605],
                "type": "Point"
            },
            "properties": {
                "attacks": 2,
                "location": "Baiji",
                "date": "2015-10-16"
            }
        }, {
            "type": "Feature",
            "geometry": {
                "coordinates": [42.4509315, 36.3707008],
                "type": "Point"
            },
            "properties": {
                "attacks": 3,
                "location": "Tal Afar",
                "date": "2015-10-16"
            }
        }, {
            "type": "Feature",
            "geometry": {
                "coordinates": [43.76667, 35.31667],
                "type": "Point"
            },
            "properties": {
                "attacks": 1,
                "location": "Hawija",
                "date": "2015-10-16"
            }
        }]
    }, {
        "type": "FeatureCollection",
        "features": [{
            "type": "Feature",
            "geometry": {
                "coordinates": [43.7820587, 33.3516083],
                "type": "Point"
            },
            "properties": {
                "attacks": 4,
                "location": "Fallujah",
                "date": "2015-04-24"
            }
        }, {
            "type": "Feature",
            "geometry": {
                "coordinates": [43.2637405, 33.4324112],
                "type": "Point"
            },
            "properties": {
                "attacks": 1,
                "location": "Ramadi",
                "date": "2015-04-24"
            }
        }, {
            "type": "Feature",
            "geometry": {
                "coordinates": [43.1170998, 36.3246002],
                "type": "Point"
            },
            "properties": {
                "attacks": 5,
                "location": "Mosul",
                "date": "2015-04-24"
            }
        }, {
            "type": "Feature",
            "geometry": {
                "coordinates": [38.3535004, 36.8908997],
                "type": "Point"
            },
            "properties": {
                "attacks": 4,
                "location": "Kobane",
                "date": "2015-04-24"
            }
        }, {
            "type": "Feature",
            "geometry": {
                "coordinates": [42.4509315, 36.3707008],
                "type": "Point"
            },
            "properties": {
                "attacks": 1,
                "location": "Tal Afar",
                "date": "2015-04-24"
            }
        }]
    }, {
        "type": "FeatureCollection",
        "features": [{
            "type": "Feature",
            "geometry": {
                "coordinates": [43.7820587, 33.3516083],
                "type": "Point"
            },
            "properties": {
                "attacks": 1,
                "location": "Fallujah",
                "date": "2015-09-09"
            }
        }, {
            "type": "Feature",
            "geometry": {
                "coordinates": [43.2637405, 33.4324112],
                "type": "Point"
            },
            "properties": {
                "attacks": 3,
                "location": "Ramadi",
                "date": "2015-09-09"
            }
        }, {
            "type": "Feature",
            "geometry": {
                "coordinates": [41.9773865, 36.3372536],
                "type": "Point"
            },
            "properties": {
                "attacks": 1,
                "location": "Sinjar",
                "date": "2015-09-09"
            }
        }, {
            "type": "Feature",
            "geometry": {
                "coordinates": [43.4873886, 34.9301605],
                "type": "Point"
            },
            "properties": {
                "attacks": 1,
                "location": "Baiji",
                "date": "2015-09-09"
            }
        }, {
            "type": "Feature",
            "geometry": {
                "coordinates": [42.4509315, 36.3707008],
                "type": "Point"
            },
            "properties": {
                "attacks": 2,
                "location": "Tal Afar",
                "date": "2015-09-09"
            }
        }, 

Avez-vous des idées pour résoudre ce problème et obtenir un fichier GeoJSON approprié?

basé
la source

Réponses:

10

Vous pouvez écrire un script simple en (par exemple) Python qui traitera les données pour vous.

import json
from itertools import chain

Ouvrez le fichier et lisez les données dans un dictionnaire Python:

isil = json.load(open('isil.en.json'))

L'objet points n'est qu'une liste de collections d' itertoolsentités , vous pouvez donc utiliser la bibliothèque python pour vous aider à enchaîner les entités de ces collections:

features = list(chain.from_iterable(fc['feature'] for fc in isil['points']))

Et enfin, écrivez une nouvelle collection de fonctionnalités avec toutes les 2818 fonctionnalités dans un fichier.

feature_collection = {
    "type": "FeatureCollection":,
    "features": features
}

with open("isil_points.geojson", "w") as f:
    json.dump(feature_collection, f)

Et cela devrait pouvoir être chargé dans un système de votre choix. En regardant les données Vous devrez probablement aussi faire un nettoyage manuel (certains emplacements «totaux» et quelques points qui n'ont pas d'emplacement), mais cela devrait être un début.

Les points de chacune des collections d'entités ont fusionné.

om_henners
la source
7

Parce que c'est un "oneshot", vous pouvez le faire manuellement (également possible via Node)

Ouvrez une console JavaScript dans votre navigateur.

Vous devez faire une boucle pour obtenir un tableau de tableau de Feature(car chacun en FeatureCollectiona un ou plusieurs Feature)

Ensuite, vous utiliserez la fonction d'aplatissement pour transformer le tableau de tableau en tableau (une fonction récursive empruntée à https://stackoverflow.com/a/15030117 )

Le code complet est ci-dessous (sauf le contenu du fichier, incomplet pour que les choses soient lisibles)

// Copy/paste the text from you source https://raw.githubusercontent.com/RitterLean/Geojson/master/geofile.json 
content = {
"points": [{
    "type": "FeatureCollection",
    "features": [{
        "type": "Feature",
        "geometry": {
            "coordinates": [41.9773865, 36.3372536],
            "type": "Point"
        },
        "properties": {
            "attacks": 1,
            "location": "Sinjar",
            "date": "2015-10-16"
        }
    }, {
        "type": "Feature",
        "geometry": {
            "coordinates": [43.4873886, 34.9301605],
            "type": "Point"
        },
        "properties": {
            "attacks": 2,
            "location": "Baiji",
            "date": "2015-10-16"
        }
    }, {
    ...
    // Be careful, incomplete because shortened for illustration 

intermediate_result = content['points'].map(function(el){
    return el.features;
});

function flatten(arr) {
  return arr.reduce(function (flat, toFlatten) {
    return flat.concat(Array.isArray(toFlatten) ? flatten(toFlatten) : toFlatten);
  }, []);
};

geojson_output = {
        "type": "FeatureCollection",
        "features": flatten(intermediate_result)
}
// Transform the object to a string you can paste into a file
console.log(JSON.stringify(geojson_output));

Le résultat peut être vu à http://geojson.io/#id=gist:anonymous/da10ab9afc9a5941ba66&map=4/19.48/22.32

Vous verrez que certains résultats ont des coordonnées erronées (0, 0). C'est dû au contenu original.

À partir de cette démo, vous pouvez également exporter vers GeoJSON.

ThomasG77
la source