Formatieren Sie eine bestimmte GeoJSON-Datei in das richtige Format

9

Ich möchte diese JSON-Datei verwenden, es ist noch keine GeoJSON-Datei, aber ich habe festgestellt, dass sie mehrere Funktionen enthält und keine, die ich verwirrend finde. Ich wollte fragen, ob Sie ein Tool kennen, mit dem ich alle Features / FeatureCollections in einer gültigen GeoJSON-Datei zusammenführen kann, damit ich sie für D3.js verwenden kann. Die Originaldatei ist hier und ich habe bereits das Zeug entfernt, das für den Geojson nicht benötigt wird.

Hier ist ein Auszug aus dem GeoJson, er ist ziemlich groß, also bin ich nur ein Ausschnitt

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

Haben Sie Ideen, wie Sie dieses Problem lösen und eine richtige GeoJSON-Datei erhalten können?

basedian
quelle

Antworten:

10

Sie können ein einfaches Skript in (zum Beispiel) Python schreiben, das die Daten für Sie verarbeitet.

import json
from itertools import chain

Öffnen Sie die Datei und lesen Sie die Daten in ein Python-Wörterbuch:

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

Das points-Objekt ist nur eine Liste von Feature-Sammlungen. Sie können also die Python- itertoolsBibliothek verwenden, um die Features in diesen Sammlungen miteinander zu verketten:

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

Und schließlich schreiben Sie eine neue Feature-Sammlung mit allen 2818 Features in eine Datei.

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

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

Und das sollte in ein System Ihrer Wahl geladen werden können. Betrachten der Daten Sie müssen wahrscheinlich auch einige manuelle Bereinigungen durchführen (einige "Gesamt" -Standorte und einige Punkte, die keinen Standort haben), aber das sollte ein Anfang sein.

Die Punkte aus jeder der Feature-Sammlungen werden zusammengeführt.

om_henners
quelle
7

Da es sich um einen "Oneshot" handelt, können Sie dies manuell tun (auch über Node möglich).

Öffnen Sie eine JavaScript-Konsole in Ihrem Browser.

Sie müssen eine Schleife ausführen, um ein Array von Arrays zu erhalten Feature(da jedes FeatureCollectionein oder mehrere hat Feature).

Anschließend verwenden Sie die Funktion "Reduzieren", um das Array des Arrays in ein Array umzuwandeln (eine rekursive Funktion, die von https://stackoverflow.com/a/15030117 entlehnt wurde ).

Der vollständige Code ist unten aufgeführt (mit Ausnahme des Dateiinhalts, der nicht vollständig ist, um die Lesbarkeit zu gewährleisten).

// 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));

Das Ergebnis kann unter http://geojson.io/#id=gist:anonymous/da10ab9afc9a5941ba66&map=4/19.48/22.32 eingesehen werden

Sie werden sehen, dass einige Ergebnisse falsche Koordinaten haben (0, 0). Es liegt am ursprünglichen Inhalt.

Von dieser Demo aus können Sie auch nach GeoJSON exportieren.

ThomasG77
quelle