Memformat file GeoJSON tertentu ke dalam format yang benar

9

Saya ingin menggunakan file json ini . Ini bukan file GeoJSON, tetapi saya perhatikan bahwa itu berisi beberapa Fitur dan bukan yang menurut saya membingungkan. Saya ingin bertanya apakah Anda tahu beberapa alat di mana saya dapat menggabungkan semua Fitur / FeatureCollections menjadi satu file GeoJSON yang valid sehingga saya dapat menggunakannya untuk seperti D3.js? File asli ada di sini dan saya sudah menyingkirkan barang-barang yang tidak diperlukan untuk geojson.

Berikut adalah kutipan dari GeoJson, ini cukup besar jadi saya hanya cuplikan

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

Apakah Anda memiliki beberapa ide cara mengatasi masalah ini dan mendapatkan file GeoJSON yang tepat?

berbasiskan
sumber

Jawaban:

10

Anda dapat menulis skrip sederhana di (misalnya) Python yang akan memproses data untuk Anda.

import json
from itertools import chain

Buka file dan baca data ke dalam kamus Python:

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

Objek poin hanyalah daftar koleksi fitur, sehingga Anda dapat menggunakan itertoolspustaka python untuk membantu rantai fitur dalam koleksi tersebut bersama-sama:

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

Dan akhirnya menulis koleksi fitur baru dengan semua 2818 fitur ke file.

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

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

Dan itu harus dapat dimuat ke dalam sistem pilihan Anda. Melihat data Anda mungkin harus melakukan pembersihan manual juga (beberapa "total" lokasi dan beberapa titik yang tidak memiliki lokasi), tetapi itu harus menjadi permulaan.

Poin dari masing-masing koleksi fitur, digabung.

om_henners
sumber
7

Karena ini adalah "oneshot", Anda dapat melakukannya secara manual (juga dapat dijalankan melalui Node)

Buka konsol JavaScript di browser Anda.

Anda perlu mengulang untuk mendapatkan array array Feature(karena masing FeatureCollection- masing memiliki satu atau lebih Feature)

Kemudian, Anda akan menggunakan fungsi flatten untuk mengubah array array menjadi array (fungsi rekursif yang dipinjam dari https://stackoverflow.com/a/15030117 )

Kode lengkapnya ada di bawah ini (kecuali konten file, tidak lengkap agar semuanya dapat dibaca)

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

Hasilnya dapat dilihat di http://geojson.io/#id=gist:anonymous/da10ab9afc9a5941ba66&map=4/19.48/22.32

Anda akan melihat bahwa beberapa hasil memiliki koordinat yang salah (0, 0). Itu karena konten aslinya.

Dari demo ini, Anda juga dapat mengekspor ke GeoJSON.

ThomasG77
sumber