Belirli bir GeoJSON dosyasını doğru biçime biçimlendirme


9

Bu json dosyasını kullanmak istiyorum , henüz GeoJSON dosyası değil, ancak birkaç Özellik ve kafa karıştırıcı bulduğum bir tane içerdiğini fark ettim. D3.js gibi kullanabilmeniz için tüm Features / FeatureCollections'ı geçerli bir GeoJSON dosyasına birleştirebileceğim bir araç biliyor musunuz sormak istedim? Orijinal dosya burada ve zaten geojson için gerekli olmayan şeylerden kurtuldum.

İşte GeoJson'un bir alıntısı, oldukça büyük, bu yüzden sadece bir pasaj

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

Bu sorunu çözmek ve uygun bir GeoJSON dosyası almak için nasıl fikirleriniz var?

Yanıtlar:


10

Python'a verileri sizin için işleyecek basit bir komut dosyası yazabilirsiniz.

import json
from itertools import chain

Dosyayı açın ve verileri bir Python sözlüğüne okuyun:

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

Points nesnesi yalnızca özellik koleksiyonlarının bir listesidir, bu nedenle itertoolsbu koleksiyonlardaki özelliklerin birlikte zincirlenmesine yardımcı olmak için python kitaplığını kullanabilirsiniz :

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

Ve son olarak 2818 özelliğin tümünü bir dosyaya içeren yeni bir özellik koleksiyonu yazın.

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

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

Ve bu, seçtiğiniz bir sisteme yüklenebilmelidir. Verilere bakma Muhtemelen bazı manuel temizlik de yapmanız gerekir (bazı "toplam" konumlar ve konumu olmayan birkaç nokta), ancak bu bir başlangıç ​​olmalıdır.

Özellik koleksiyonlarının her birindeki noktalar birleştirildi.


7

Bu bir "oneshot" olduğundan, manuel olarak yapabilirsiniz (Düğüm üzerinden de çalışabilirsiniz)

Tarayıcınızda bir JavaScript konsolu açın.

Bir dizi dizi elde etmek için döngüye ihtiyacınız var Feature(çünkü her FeatureCollectionbirinde bir veya daha fazla var Feature)

Ardından, dizi dizisini bir diziye dönüştürmek için flatten işlevini kullanırsınız ( https://stackoverflow.com/a/15030117 adresinden ödünç alınan özyinelemeli bir işlev). )

Tam kod aşağıdadır (dosya içeriği hariç, her şeyi okunabilir tutmak için tam değildir)

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

Sonuç http://geojson.io/#id=gist:anonymous/da10ab9afc9a5941ba66&map=4/19.48/22.32 adresinde görülebilir.

Bazı sonuçların yanlış koordinatlara sahip olduğunu göreceksiniz (0, 0). Orijinal içerik nedeniyle.

Bu demoda GeoJSON'a da dışa aktarabilirsiniz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.