Định dạng tệp GeoJSON cụ thể thành định dạng chính xác


9

Tôi muốn sử dụng tệp json này, đây chưa phải là tệp GeoJSON nhưng tôi nhận thấy rằng nó chứa một số Tính năng và không phải là một tính năng mà tôi thấy khó hiểu. Tôi muốn hỏi bạn có biết một số công cụ mà tôi có thể hợp nhất tất cả các Tính năng / Tính năng thành một tệp GeoJSON hợp lệ để tôi có thể sử dụng nó cho như D3.js không? Tệp gốc ở đây và tôi đã loại bỏ những thứ không cần thiết cho Geojson.

Đây là một đoạn trích của GeoJson, nó khá lớn nên tôi chỉ là một đoạn trích

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

Bạn có một số ý tưởng làm thế nào để giải quyết vấn đề này và có được một tệp GeoJSON thích hợp không?

Câu trả lời:


10

Bạn có thể viết một tập lệnh đơn giản bằng (ví dụ) Python sẽ xử lý dữ liệu cho bạn.

import json
from itertools import chain

Mở tệp và đọc dữ liệu vào từ điển Python:

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

Đối tượng điểm chỉ là một danh sách các bộ sưu tập tính năng, vì vậy bạn có thể sử dụng itertoolsthư viện python để giúp xâu chuỗi các tính năng trong các bộ sưu tập đó lại với nhau:

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

Và cuối cùng viết một bộ sưu tập tính năng mới với tất cả 2818 tính năng ra một tệp.

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

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

Và điều đó sẽ có thể được tải lên thành một hệ thống bạn chọn. Nhìn vào dữ liệu Bạn có thể cũng phải thực hiện một số thao tác làm sạch thủ công (một số vị trí "tổng cộng" và một vài điểm không có vị trí), nhưng đó phải là một sự khởi đầu.

Các điểm từ mỗi bộ sưu tập tính năng, được hợp nhất.


7

Vì là "oneshot", bạn có thể thực hiện thủ công (cũng có thể chạy qua Node)

Mở bảng điều khiển JavaScript trong trình duyệt của bạn.

Bạn cần lặp để có được một mảng các mảng Feature(vì mỗi mảng FeatureCollectioncó một hoặc nhiều Feature)

Sau đó, bạn sẽ sử dụng hàm flatten để chuyển đổi mảng của mảng thành một mảng (một hàm đệ quy được mượn từ https://stackoverflow.com/a/15030117 )

Mã đầy đủ bên dưới (ngoại trừ nội dung tệp, không đầy đủ để giữ cho mọi thứ có thể đọc được)

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

Kết quả có thể được nhìn thấy tại http://geojson.io/#id=gist:anonymous/da10ab9afc9a5941ba66&map=4/19.48/22.32

Bạn sẽ thấy một số kết quả có tọa độ sai (0, 0). Đó là do nội dung ban đầu.

Từ bản demo này, bạn cũng có thể xuất sang GeoJSON.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.