Formatee un archivo GeoJSON específico en el formato correcto

9

Quiero usar este archivo json, todavía no es un archivo GeoJSON, pero noté que contiene varias características y no una que me parece confusa. Quería preguntarle si conoce alguna herramienta en la que pueda fusionar todas las características / colecciones de características en un archivo GeoJSON válido para poder usarlo como D3.js. El archivo original está aquí y ya eliminé las cosas que no son necesarias para el geojson.

Aquí hay un extracto de GeoJson, es bastante grande, así que solo soy un fragmento

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

¿Tiene alguna idea de cómo resolver este problema y obtener un archivo GeoJSON adecuado?

Basianian
fuente

Respuestas:

10

Podría escribir un script simple en (por ejemplo) Python que procesará los datos por usted.

import json
from itertools import chain

Abra el archivo y lea los datos en un diccionario de Python:

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

El objeto de puntos es solo una lista de colecciones de características, por lo que puede usar la itertoolsbiblioteca de Python para ayudar a encadenar las características de esas colecciones:

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

Y, finalmente, escriba una nueva colección de características con las 2818 características en un archivo.

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

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

Y eso debería poder cargarse en un sistema de su elección. Mirando los datos Probablemente también tenga que hacer una limpieza manual (algunas ubicaciones "totales" y algunos puntos que no tienen una ubicación), pero eso debería ser un comienzo.

Los puntos de cada una de las colecciones de características, fusionados.

om_henners
fuente
7

Debido a que es un "oneshot", puede hacerlo manualmente (también es posible ejecutarlo a través del nodo)

Abra una consola de JavaScript en su navegador.

Necesita hacer un bucle para obtener una matriz de matriz Feature(porque cada FeatureCollectionuna tiene una o más Feature)

Luego, utilizará la función de aplanar para transformar la matriz de la matriz en una matriz (una función recursiva tomada de https://stackoverflow.com/a/15030117 )

El código completo está debajo (excepto el contenido del archivo, no está completo para mantener las cosas legibles)

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

El resultado se puede ver en http://geojson.io/#id=gist:anonymous/da10ab9afc9a5941ba66&map=4/19.48/22.32

Verá que algunos resultados tienen coordenadas incorrectas (0, 0). Se debe al contenido original.

Desde esta demostración, también puede exportar a GeoJSON.

ThomasG77
fuente