특정 GeoJSON 파일을 올바른 형식으로 포맷


9

json 파일 을 사용하고 싶습니다. 아직 GeoJSON 파일이 아니지만 여러 기능이 포함되어 있으며 혼란 스러울 수 있습니다. 모든 Features / 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

파이썬으로 데이터를 처리하는 간단한 스크립트를 작성할 수 있습니다.

import json
from itertools import chain

파일을 열고 파이썬 사전으로 데이터를 읽습니다.

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

points 객체는 기능 모음의 목록 일 뿐이므로 Python 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)

그런 다음 flatten 함수를 사용하여 배열 배열을 배열로 변환합니다 ( 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.