จัดรูปแบบไฟล์ GeoJSON เฉพาะเป็นรูปแบบที่ถูกต้อง


9

ฉันต้องการใช้ไฟล์ jsonนี้มันไม่ใช่ไฟล์ GeoJSON แต่ฉันสังเกตเห็นว่ามันมีคุณสมบัติหลายอย่างและไม่ใช่ไฟล์ที่ฉันสับสน ฉันอยากถามว่าคุณรู้จักเครื่องมือบางอย่างที่ฉันสามารถรวมคุณสมบัติ / FeatureCollections ทั้งหมดไว้ในไฟล์ GeoJSON ที่ถูกต้องไฟล์เดียวหรือไม่เพื่อที่ฉันจะสามารถใช้มันได้เช่น D3.js ไฟล์ต้นฉบับอยู่ที่นี่และฉันได้กำจัดสิ่งที่ไม่จำเป็นสำหรับ geojson ไปแล้ว

นี่คือข้อความที่ตัดตอนมาจาก GeoJson มันค่อนข้างใหญ่ดังนั้นฉันจึงเป็นแค่ข้อมูลโค้ด

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

คุณมีความคิดบางอย่างในการแก้ปัญหานี้และรับไฟล์ GeoJSON ที่เหมาะสมหรือไม่

คำตอบ:


10

คุณสามารถเขียนสคริปต์อย่างง่ายใน Python ที่จะประมวลผลข้อมูลสำหรับคุณ

import json
from itertools import chain

เปิดไฟล์และอ่านข้อมูลในพจนานุกรม Python:

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

วัตถุที่จุดเป็นเพียงรายการของคอลเลกชันคุณสมบัติดังนั้นคุณสามารถใช้itertoolsห้องสมุดหลามเพื่อช่วยโยงคุณสมบัติในคอลเลกชันเหล่านั้นเข้าด้วยกัน:

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

และในที่สุดก็เขียนคอลเลกชันคุณสมบัติใหม่ที่มีคุณสมบัติทั้งหมด 2818 ออกไปยังไฟล์

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

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

และนั่นควรจะสามารถโหลดเข้าสู่ระบบที่คุณเลือกได้ ดูข้อมูลที่คุณอาจต้องทำความสะอาดด้วยตนเองเช่นกัน (บางตำแหน่ง "รวม" และบางจุดที่ไม่มีตำแหน่ง) แต่ควรเป็นการเริ่มต้น

คะแนนจากการรวบรวมคุณสมบัติแต่ละอย่างรวมกัน


7

เพราะมันเป็น "oneshot" คุณสามารถทำได้ด้วยตนเอง (อาจเป็นไปได้ที่จะเรียกใช้ผ่านโหนด)

เปิดคอนโซล JavaScript ในเบราว์เซอร์ของคุณ

คุณต้องวนซ้ำเพื่อรับอาร์เรย์ของอาร์เรย์Feature(เพราะแต่ละอันFeatureCollectionมีอย่างน้อยหนึ่งค่าFeature)

จากนั้นคุณจะใช้ฟังก์ชันแบนเพื่อแปลงอาร์เรย์ของอาร์เรย์ให้เป็นอาร์เรย์ (ฟังก์ชันเรียกซ้ำที่ยืมมาจากhttps://stackoverflow.com/a/15030117 )

รหัสเต็มอยู่ด้านล่าง (ยกเว้นเนื้อหาไฟล์ไม่สมบูรณ์เพื่อให้สามารถอ่านได้)

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

สามารถดูผลลัพธ์ได้ที่http://geojson.io/#id=gist:anonymous/da10ab9afc9a5941ba66&map=4/19.48/22.32

คุณจะเห็นว่าผลลัพธ์บางอย่างมีพิกัดที่ไม่ถูกต้อง (0, 0) มันเป็นเพราะเนื้อหาต้นฉบับ

จากตัวอย่างนี้คุณสามารถส่งออกไปยัง GeoJSON

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.