일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- VSCode
- Windows10
- golang
- Sysinternals
- macos
- Python
- HLS
- docker
- nginx-media-server
- kubectl
- service
- ebpf
- android studio
- Shell script
- spring cloud config
- namespace
- Flutter
- dart
- ffmpeg
- deployment
- Java
- Kubernetes
- RTMP
- 행정구역분류
- aws cli
- wireshark
- Pod
- configmap
- Android
- aws
- Today
- Total
woonizzooni
대한민국 행정동 경계 좌표 추출 #2 - python > GeoJSON 본문
대한민국 행정동 경계 좌표 추출 #1 - GeoJSON
위 글에서 QGiS로 WGS84 GeoJSON형식의 좌표를 추출해봤다. (원본 좌표계 값 그대로인 상태(UTM-K))
hp파일을 java, python등을 이용해서 경계 좌표 변환 & 추출 해보려고 한다.
편의상 python을 선택했다.
결론부터 말하면 python만으로의 행정동 좌표계 편환 추출은 할게 못된다 -_-
일단 모든 경우의 수에 대한 시도는 못해봤다.
각종(?) geometry library연동 등의 방법이 존재할 수 있겠으나 ... 일단 모르겠다. 안할란다. -_-
ogs2ogr를 이용해서 좌표계 변환된 ESRI shapefile로 만들고,
이를 python으로 json추출하는 방향으로 해보니 이 정도는 뭐 쓸만하....다.
1. QGiS 설치 후 PATH경로 추가
- ogr2org, cs2cs 등 명령어 실행 위함
- 환경변수 PATH 경로 추가 : C:\OSGeo4W64\bin
- 기타 : GDAL_DATA 환경변수 추가 & 값 설정 (선택)
변수 이름 : GDAL_DATA
변수 값 : C:\OSGeo4W64\share\gdal
2. 좌표계 변환 shape 파일 생성
- (소스) EPSG:5181 (국가공간정보포털 제공 데이터)
+proj=tmerc +lat_0=38 +lon_0=127 +k=1 +x_0=200000 +y_0=500000 +ellps=GRS80 +units=m +no_defs
- (대상타켓) WGS84 (EPSG:4326)
+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs
ogr2ogr -s_srs "+proj=tmerc +lat_0=38 +lon_0=127 +k=1 +x_0=200000 +y_0=500000 +ellps=GRS80 +units=m +no_defs" -t_srs "+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs" -f "ESRI Shapefile" -skipfailures 변환된.shp Z_SOP_BND_ADM_DONG_PG.shp --config SHAPE_ENCODING "EUC-KR" (설명) ogr2ogr \ -s_srs "+proj=tmerc +lat_0=38 +lon_0=127 +k=1 +x_0=200000 +y_0=500000 +ellps=GRS80 +units=m +no_defs" \ -t_srs "+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs" \ -f "ESRI Shapefile" \ -skipfailures \ 변환된.shp <--- 타켓 Z_SOP_BND_ADM_DONG_PG.shp <-- 원본소스 --config SHAPE_ENCODING "EUC-KR" <-- 원본이 EUC-KR (한글 깨짐 방지) |
[참고] proj.4 파라미터 관련
http://proj.maptools.org/gen_parms.html
3. python 코드 작성 & 실행 : 값 추출 & GeoJSON 파일 생성
- transfromToWGS84() :
국가공간정보포털이 제공하는 shp의 좌표계는 UTM-K이니 이를 WGS84로 변환해야 해서 해본건데
절대 하면 안된다!!!! 너무 너어무 너어어어어무 느리다. 쓸게 못된다.
허긴... 방대한 데이터를(?) 이렇게 루핑 처리한다는 것 자체가 느리긴 느릴테지...
다른 방식의, 효과적인 방식이 있는지 모르겠는데(geopandas, fiona, gdal 연동?),
아직 깊게(?) 들어가진 말자. 암튼 의도는 이러하고(?) 쓰지 말자.
- 프로퍼티에 OBJECTID등을 포함시키고자하면 zip으로 묶는 dict구조에 해당 파라미터를 포함시키면 된다.
# -*- coding: utf-8 -*-
from pyproj import Proj, transform
import numpy as np
import pandas as pd
import shapefile
from json import dumps
# shapefile 읽기
reader = shapefile.Reader("E:\Geo\센서스경계)행정동경계\Z_SOP_BND_ADM_DONG_PG\변환된.shp", encoding="euc-kr")
fields = reader.fields[1:]
field_names = [field[0] for field in fields]
buffer = []
# 좌표계 변환 (skip)
proj_UTMK = Proj(init='epsg:5181')
proj_WGS84 = Proj(init='epsg:4326')
def transformToWGS84(shape):
shape_type = shape.__geo_interface__["type"]
coords_utmk = shape.__geo_interface__["coordinates"]
coords_wgs84 = []
i = 0
for cds in coords_utmk:
for p in cds:
coords_wgs84.append([transform(proj_UTMK, proj_WGS84, p[0], p[1])])
if shape_type == "Polygon":
return dict(type=shape_type, coordinates=[coords_wgs84])
elif shape_type == "MultiPolygon":
return dict(type=shape_type, coordinates=[[coords_wgs84]])
# geojson 데이터 구성
for sr in reader.shapeRecords():
print(sr.record[2])
atr = dict(zip(field_names, sr.record))
geom = sr.shape.__geo_interface__
#geom = transformToWGS84(sr.shape)
buffer.append(dict(type="Feature", properties=atr, geometry=geom))
# GeoJSON 생성 (ensure_ascii=False : 한글깨짐 방지)
geojson = open("filename.geojson", "w")
geojson.write(dumps({"type": "FeatureCollection", "features": buffer}, indent=2, ensure_ascii=False) + "\n")
geojson.close()
4. 추출 결과 (GeoJSON)
- 행정동 코드, 행정동명,
{
"type": "FeatureCollection",
"features": [
{
"type": "Feature",
"properties": {
"BASE_YEAR": "2018",
"ADM_DR_CD": "1101053",
"ADM_DR_NM": "사직동"
},
"geometry": {
"type": "Polygon",
"coordinates": [
[
[
126.96893892002558,
37.57814630501477
],
[
126.96895512144755,
37.577935265875205
],
[
126.96921284490557
[ ....
],
[
126.96893892002558,
37.57814630501477
]
]
]
}
},
{
"type": "Feature",
"properties": {
"BASE_YEAR": "2018",
"ADM_DR_CD": "1101054",
"ADM_DR_NM": "삼청동"
},
"geometry": {
"type": "Polygon",
"coordinates": [
[
[
126.97713556993105,
37.597683560300666
],
[....
....
],
....
{
"type": "Feature",
"properties": {
"BASE_YEAR": "2018",
"ADM_DR_CD": "3902062",
"ADM_DR_NM": "예래동"
},
"geometry": {
"type": "MultiPolygon",
"coordinates": [
[
[
[
126.37313696693445,
33.22901600038364
],
[
126.37312154153095,
33.22901295010255
],
[
...
],
[
126.46328170099486,
33.3596931869656
],
[
126.46396143346223,
33.3598578961412
]
]
]
]
}
}
]
}
'Programming > Python' 카테고리의 다른 글
[Python] 대한민국 행정동 데이터 MySQL DB 테이블 생성 예시 (1) | 2019.09.05 |
---|---|
PyQt5 설치 (Windows 환경에서) (0) | 2019.08.24 |
[PyProj] Proj executable not found. Please set PROJ_DIR variable. (0) | 2019.08.22 |
[python] RuntimeError: maximum recursion depth exceeded while getting the str of an object (0) | 2019.07.27 |
python 코드 실행 시간 측정 (0) | 2019.07.25 |