네이버지도와 다음지도 데이타를 파일로 저장하기 여행

여기로 가서 파일을 다운로드한다음 적당한 폴더에 압축을 푼다
먼저 네이버지도부터 시작한다. 

ol3_naver_5179.html 파일을 웹브라우저에 띄워보면 네이버지도가 나타난다.

이 파일의 109라인 뒤에 다음과 같은 코드를 추가하면 지도에 격자가 나타난다.

new ol.layer.Tile({
                          source: new ol.source.TileDebug({
                              projection: 'EPSG:5179',
                              tileGrid: new ol.tilegrid.TileGrid({
                                            extent: extent,
                                            origin: [extent[0], extent[1]],
                                            resolutions: resolutions
                                        })
                              })
                        })


위 코드를 추가한 파일을 첨부했는데 이곳에서는 html파일은 첨부가 안되어서 확장자를 txt로 해서 올린거니까 다운로드 받아서 확장자를 html로 바꾸어서 원래있던 곳에 넣어주면 된다.

군산,대전,세종을 포함하는 격자영역은 (2,6,4)로 나타나는데 이 숫자의 의미는 크롬에서 f12를 눌러서 나타나는 창에서 짐작할 수 있다.

크롬화면 밑에 또는 오른쪽에 나타나는 창에서 network를 선택한뒤 새로고침을 해보면 name 항목에 목록이 나타나는데 그곳을 클릭하면 오른쪽에 그림이 나타난다. 대조를 해보면 (2,6,4)에 해당되는 그림의 네이버주소는 다음과 같다.

http://onetile2.map.naver.net/get/149/0/0/3/6/4/bl_vc_bg/ol_vc_an

(2,6,4)가 3/6/4 로 나타났는데 2가 3으로 바뀐것 말고는 다른 것을 똑같다. 여기서 2는 줌레벨이다. 화면을 확대또는 축소해보면서 앞자리 숫자를 살펴보면 확대가 될수록 그 숫자가 커지는것을 알수있다. 0부터 13까지이고 네이버주소상으로는 1부터 14까지가 된다. 격자숫자를 놓고보면 두번째숫자는 x축을 세번째숫자는 y축을 가르킨다고 보면 된다.

이 그림을 다운로드해서 저장할때 8/6/4.png.tile 로 저장할 것이다. 8과 6은 폴더이름이고 4는 파일이름이 된다.
줌레벨2를 8로 바꿔서 저장하는데 이것은 세계지도의 관점에서 보면 그렇다는 것이다. 네이버의 줌레벨0가 세계지도로 보면 줌레벨 6쯤 된다고 생각하면 된다.

이제 지도파일을 다운로드 받는 파이썬 프로그램을 살펴본다.
#은 주석을 나타냄


#-*- encoding: utf8 -*-
#  지도 데이타를 받아옴 
#
import urllib
import os

# 지도형식 
# 왼쪽 아래 격자 z1,x1,y1
# 오른쪽 위 격자 z2,x2,y2

# 왼쪽 아래가 5,51,45
# 오른쪽 위가 7,54,47
# 인 영역의 지도를 줌레벨 7까지 저장할려면
#
# z1 = 5 , z2 = 7 줌레벨 
# x1 = 51, x2 = 54 x축
# y1 = 45, y2 = 47 y축

# 아래에 나오는 좌표값 6개를 변경
z1 = 5
z2 = 7
x1 = 51
x2 = 54
y1 = 45
y2 = 47

#addr1 = 'http://onetile4.map.naver.net/get/171/0/0/'
#addr2 = '/bl_vc_bg/ol_vc_an'
addr1 = 'https://simg.pstatic.net/onetile/get/196/0/0/'
addr2 = '/bl_vc_bg/ol_vc_an'

def mkdir(z1,z2,x1,x2):
    for z in range(z1,z2):
        if z != z1:
            x1 = x1*2
            x2 = x2*2
        for x in range(x1,x2):
            dirx = str(z) + '/' + str(x)
            if not os.path.isdir(dirx):
                os.makedirs(os.path.join(dirx))

def getMap(z1,z2,x1,x2,y1,y2):
    a = (x2 - x1)*(y2 - y1) #초기값
    total = a*(4**(z2 - z1)-1)/3
    count = 0
    for z in range(z1,z2):
        if z != z1:
            x1 = x1 * 2
            x2 = x2 * 2
            y1 = y1 * 2
            y2 = y2 * 2
        for x in range(x1,x2):
            for y in range(y1,y2):
                filename = '/' + str(x) + '/' + str(y)
                urlzoom = str(z-5) + filename
                downzoom = str(z) + filename
                addr = addr1 + urlzoom + addr2
                count += 1
                print('{}/{}\r'.format(count,total)),
                urllib.urlretrieve(addr,downzoom + '.png.tile')        
z1 = z1 + 6
z2 = z2 + 6 + 1
x2 = x2 + 1
y2 = y2 + 1

mkdir(z1,z2,x1,x2)
getMap(z1,z2,x1,x2,y1,y2)

위 코드를 getnaver.py 로 저장한다.


위그림처럼 12개의 격자에 해당되는 그림을 다운받을려면 왼쪽아래쪽의 격자값을 z1,x1,y1에 넣고 오른쪽위쪽 격자값을 z2,x2,y2에 넣는다. 최종 줌레벨은 7로 한다. 이처럼 원하는 지역과 줌레벨을 위 프로그램에 적는다.

파이썬(2.7.x 버전)이 이미 설치되어있다고 치고 s:\ 에 getnaver.py 이 있다고 가정했을때 커맨드창에서 

s:\python getnaver.py 

이렇게 치면 아래와 같은 폴더와 파일이 생긴다.
그림에서는 짤렸는데 13폴더밑에는 16개의 폴더가 있다. 204부터 219까지.


이제 부터는 다음지도 데이타를 받아본다. 네이버와 다를 바가 없다. 그저 주소형식이 약간 다를뿐이다.

ol3_daum_5181.html 을 웹브라우저에서 불러오면 파란화면만 보인다. 그동안에 지도파일의 주소가 바뀐것이다.

다음지도로 간다음 f12를 눌러 지도파일의 주소를 살펴보면 이런식이다.

http://map0.daumcdn.net/map_2d/1810uis/L3/965/1628.png

ol3_daum_5181.html 을 편집기에서 열어서 68라인을 보면 아래와 같이 되어있다.

 return 'http://map' + s + '.daumcdn.net/map_2d/2fso49/L' + z + '/' + y + '/' + x + '.png';

2fso49 를 1810uis 로 바꾼다.

return 'http://map' + s + '.daumcdn.net/map_2d/1810uis/L' + z + '/' + y + '/' + x + '.png';

이렇게 하면 화면에 다음지도가 뜬다. 이제 격자를 넣기 위해서 네이버지도에서 했던것과 거의 유사한 코드를 108라인뒤쪽에 넣는다.
new ol.layer.Tile({
                          source: new ol.source.TileDebug({
                              projection: 'EPSG:5181',
                              tileGrid: new ol.tilegrid.TileGrid({
                                            extent: extent,
                                            origin: [extent[0], extent[1]],
                                            resolutions: resolutions,
                                        })
                              })
                        })


바꾼 전체 코드를 첨부한다. 확장자를 txt에서 html로 바꾼다.

두개의 지도가 격자영역이 약간 다르다. x,y좌표도 다르다. 그래서 다운로드하는 프로그램도 약간 다르다. 물론 주소체계도 약간 다르다

네이버 z/x/y 
다음   Lz/y/x 

프로그램은 다음과 같다.

#-*- encoding: utf8 -*-
#  지도 데이타를 받아옴 
#
import urllib
import os

# 지도형식 
# 왼쪽 아래 격자 z1,x1,y1
# 오른쪽 위 격자 z2,x2,y2

# 왼쪽 아래가 5,12,30
# 오른쪽 위가 5,14,31
# 인 영역의 지도를 줌레벨 7까지 저장할려면
#
# z1 = 5 , z2 = 7 줌레벨 
# x1 = 12, x2 = 14 x축
# y1 = 30, y2 = 31 y축

# 아래에 나오는 값을 변경
z1 = 5
z2 = 7
x1 = 12
x2 = 14
y1 = 30
y2 = 31
# http://map3.daumcdn.net/map_2d/1810uis/L13/2/1.png
addr1 = 'http://map3.daumcdn.net/map_2d/1810uis/L'

def mkdir(z1,z2,x1,x2):
    for z in range(z1,z2):
        if z != z1:
            x1 = x1*2
            x2 = x2*2
        for x in range(x1,x2):
            dirx = str(z) + '/' + str(x)
            if not os.path.isdir(dirx):
                os.makedirs(os.path.join(dirx))

def getMap(z1,z2,x1,x2,y1,y2):
    a = (x2 - x1)*(y2 - y1) #초기값
    total = a*(4**(z2 - z1)-1)/3
    count = 0
    for z in range(z1,z2):
        if z != z1:
            x1 = x1 * 2
            x2 = x2 * 2
            y1 = y1 * 2
            y2 = y2 * 2
        for x in range(x1,x2):
            for y in range(y1,y2):
                urlzoom = str(20-z) + '/' + str(y) + '/' + str(x) + '.png'
                downzoom = str(z) + '/' + str(x) + '/' + str(y)
                addr = addr1 + urlzoom 
                count += 1
                print('{}/{}\r'.format(count,total)),
                urllib.urlretrieve(addr,downzoom + '.png.tile')        
z1 = z1 + 6
z2 = z2 + 6 + 1
x2 = x2 + 1
y2 = y2 + 1

mkdir(z1,z2,x1,x2)
getMap(z1,z2,x1,x2,y1,y2)

네이버와 비교하면 폴더만드는 것은 완전히 같고 주소만드는 방식이 달라 두어줄이 달라졌다. 

[2019.4.26 추가]

특정영역을 하나의 그림파일로 만들기.

네이버지도의 특정영역 

(12,6711,5957) 에서 (12,6720,5964)까지를 다운로드 받은 후 몽땅 합쳐 한장의 png파일로 만들어본다.

각각의 지도는 줌레벨이 같기 때문에 한장의 파일만 만들어진다. 


00. 위 영역을 받아서 임의의 폴더에 넣는다 (여기서는 s:\naver01 )

01. mobac(MObile Atlas Creator) 를 받아온다. 
   
    mobile atlas creator 2.0.1.zip 을 받는다. 최신버전은 앞으로 우리가 해야할 작업에서 약간 오동작한다. 

02. 압축을 푼다. 설치같은거 필요없으나  java가 깔려있지 않으면 동작하지 않는다.
    
03. 아래와 같은 내용의 xml 파일을 하나 만든다. (여기서는 naver.xml)

<?xml version="1.0" encoding="UTF-8"?>
<localTileFiles>
   <name>naver</name>
   <sourceType>DIR_ZOOM_X_Y</sourceType>
   <sourceFolder>s:/naver01</sourceFolder>
   <invertYCoordinate>true</invertYCoordinate>
   <backgroundColor>#000000</backgroundColor>
</localTileFiles>

참고 naver.xml.txt (파일이름은 naver.xml로 바꾼다)

04. 압축을 풀은 폴더밑의 mapsources 폴더밑에 naver.xml을 넣는다.


.05. Mobile Atlas Creator.exe 를 실행한다.

     나타나는 창에서 적당한 이름(여기서는 naver map)를 주고 atlas format에는 [OziExplorer]를 선택한뒤 [확인]을 누른다.



06. Map Source에서 naver를 선택하고 zoom level 에서 18을 체크표시한다. 오른쪽 화면에는 아직 지도가 보이지 않는다.



07. 왼쪽패널에서 탭타이틀을 클릭하면 세부내용이 숨겨지고 제목만 남는다. 딴건 다 숨기고 제일 밑의 [Selection Coordinates..]에서 [Fmt]박스를 열어 [Tile..]을 선택한다.

08. 오른쪽 X 표시가 된 곳중 아무데나 마우스로 클릭하면 왼쪽에 그곳의 타일번호와 줌레벨이 나타난다.

09. 동서남북의 숫자를 바꾼다.

   지도의 영역이 아래와 같은데 이것을 다음과 같이 적는다.

   [12,6711,5957] -> [12,6720,5964]

   네이버 줌레벨 12가 여기서는 z18이다. 

   W : 6711 / z18
   E : 6720 / z18
   S : 2의18승 - 5957 - 1 = 262144 - 5957 - 1 = 256186 / z18
   N : 2의 18승 - 5964 - 1 = 262144 - 5964 - 1 = 256179 / z18

이렇게 계산을 하면 남쪽의 타일값이 북쪽보다 더 커지는데 이건 네이버지도와 반대이다.

위와 같이 적은다음 [Select entered coordinates]버튼을 누르면 오른쪽 화면에 옅은 빨간박스로 덮힌 지도가 나타난다.

왼쪽화면의 [Atlas Content]탭에서 [Add selection]을 누르면 Layer 18이 나타난다. 
   
오른쪽의 지도영역에서 마우스 오른쪽 버튼을 누른채 지도 오른쪽 끝으로 드래그를 하면 위그림처럼 선택안된 영역이 나타나는데 이건 mobac 의 오류일듯..

지도의 아무곳이나 클릭하면 희미한 빨간박스가 사라지면서 선택이 해제되고 그곳의 타일값이 화면왼쪽에 나타난다.


10. [Atlas Content]탭의 [Layer 18]을 선택한 뒤 마우스 오른쪽 버튼을 누르면 나타나는 창에서 [Display selected areas]를 선택한다. 

11. 지도의 선택영역이 희미한 노란색으로 나타난다. 마우스 오른쪽버튼을  누른채 드래그하여 지도의 전체영역이 올바르게 선택되어있는지 확인한다. 

Atlas Content의 Layer 18 글자위에 마우스를 가져다 놓으면 (클릭하지 않음) 정보창이 열리는데 [Maximum tiles to download]을 보면 숫자가 80이다. 80개의 이미지 파일을 선택했다는 뜻인데 s:\naver01 폴더밑에 있는 파일의 갯수를 헤아려보면  

18폴더안에 6711 부터 6720 까지 폴더의 갯수가 10개이고 각각의 폴더에 8개의 파일이 있으니까 총 80개의 이미지 파일이 있음을 알수가 있다. 



12. Create Atlas 를 누른다. 

13. 다음과 같은 창이 열리면서 지도가 만들어진다. [Open Atlas Folder]를 클릭하여 최종 완성본을 확인한다.

    아래의 창에는 0% done 이니 0 bytes ..같은 정보가 있어서 불완전한 지도가 만들어 진 것 같은 기분이 드는데 그건 전혀 그렇지가 않다. 여기서는 이미 받아둔 하드디스크 안에 있는 조각난 지도파일을 대상으로 오프라인 작업을 했기 때문에 이런 정보가 보이는 것이지 만약 직접 온라인을 통해서 지도를 다운로드 받으면서 작업할 경우에는 해당정보들이 다 채워진다. 여기서는 신경쓰지 말자. 


14  Layer 18.png 가 최종결과물이다. Layer 18.map파일은 무시. gps정보를 완전히 무시한 채 작업을 했기때문이다.


.끝..

핑백

  • 일상사 : 네이버지도나 다음지도로 mbtiles 파일만들기 2018-12-25 01:35:56 #

    ... 발톱님 만세!! 2018년 11월 현재 osmAndMapCreator 를 통해서 지도파일을 받을수 없습니다. 그래서 지도데이타를 받는 부분만 따로 게시물로 만들었습니다. 이곳을 참조하시길 바랍니다. * 필요한 소프트웨어01. 자바설치02. osmAndMapCeator03. qgis04. gdal_mergedirs 05. mob ... more

덧글

  • SRK 2019/04/24 00:07 # 삭제 답글

    정말 감사합니다. 지도 화면마다 캡쳐해서 이어 붙이고 있었는데 이렇게 쉽게 타일마다 다운로드 할 수 있는 방법이 있었네요. 혹시 개별 다운로드된 타일들을 위치에 맞게 병합하여 하나의 이미지로 만드는 코드도 부탁드릴 수 있을지요?
  • with_duke 2019/04/24 22:55 # 답글

    코드를 만드는건 좀 그렇고 ... gps좌표정보가 들어가 있지 않은 커다란 이미지파일을 만들려면 위에서 받은 지도 이미지를 가공하지 않은 상태로 mobac 에서 읽어들여 지도형식을 oziexplorer 로 선택한뒤 만들기를 하면 줌레벨별로 이미지파일을 만들어줍니다. 혹시라도 제말이 뜬구름잡는것 처럼 느껴진다면 만들고 싶은 영역의 좌표와 줌레벨을 알려주시면 별도의 게시물을 만들어서 설명드리겠습니다.
  • SRK 2019/04/25 23:29 # 삭제

    답변 감사합니다.
    (12,6711,5957) 에서 (12,6720,5964) 까지입니다. :)
  • with_duke 2019/04/26 05:31 # 답글

    따로 게시물을 만들려고 했으나 게시물의 연속성을 고려해서 본문끝에 추가했습니다. 한번 읽어보시길 바랍니다.
  • SRK 2019/04/28 01:01 # 삭제

    정말 감사합니다. 많은 도움이 되었습니다. 추가해주신 내용으로 차근차근 따라해 보았고 성공적이었습니다. 다만, 알려주신 MAC 의 좌표변환에서 동쪽과 남쪽끝 타일이 한줄씩 선택이 덜 되었습니다. 알려주신 변환식에서 East 는 x2 / z18 => x2+1 / z18 로, SOUTH 는 2^18 - y1 -1 / z18 에서 2^18 - y1 / z18 로 각각 변경하여 해결하였습니다. 다시한번 정말 감사드립니다! :)
  • 깡통 2019/11/14 10:14 # 삭제 답글

    좋은 정보 정말 감사드립니다.
    그런데 혹시.. 지금은 위 방법대로 타일을 다운받을수 없는건가요...?
    열심히 따라 했는데 브라우저에 지도 표시까지는 되고 맵 타일은 다운이 되지 않는것 같던데요...
  • with_duke 2019/11/20 17:15 #

    여기에서 사용되는 python 프로그램은 python 2.7.x 버전에서 동작을 합니다.
    3.x 버전에서 동작시킬려면
    urllib 을 urllib.request 로 바꿔주시면 됩니다.
    두군데 있습니다.
    import urllib ==> import urllib.request
    urllib.urlretrieve ==> urllib.request.urlretrieve
  • 가라구요 2020/01/19 17:10 # 삭제 답글

    안녕하세요
    혹시 궁금해서 그러는데요
    다운로드 받으면서 구글 타일 형식으로 아예 바꾸어서
    다운로드 되게 하는 방법이 없으까요 ?
    제가 문외한이라서요
    혹 죄송한데 010-사육오육으로 공팔일칠로 연락 부탁드려 될런지요
  • with_duke 2020/01/22 07:06 # 답글

    이곳을 http://wharak.egloos.com/1287121 참조하시길 바랍니다.
  • 2020/01/31 13:59 # 삭제 답글 비공개

    비공개 덧글입니다.
  • with_duke 2020/02/10 02:09 #

    다음지도의 타일맵 조각하나가 구글지도의 타일맵 조각하나와 같지않습니다. 그래서 단순한 1:1 변환은 되지않고 좀 복잡한 변환을 해야됩니다.

    이곳을 http://wharak.egloos.com/1260316 참조하시길 바랍니다.
  • 깡통 2020/02/06 13:48 # 삭제 답글

    친절한 답글 너무 감사드립니다.
    한동안 잊고있다가 다시 찾아와봤는데 친절한 댓글에
    들뜬 마음으로 다시 작업해보려 했는데 이번엔 격자부분에서 말썽이..ㅠㅠ
    격자부분 코드를 넣으면 화면에 아무것도 안나오는 현상이 발생하네요..
    암것도 모르는 깡통이 이 어려운걸 따라하기만 하니 뭐가 뭔지 도통 모르겠고 ㅎ
    아무래도 포기 해야 하나봐요.
    님의 친절한 답변에 감동과 감사를 전합니다.
  • aga211 2020/02/29 20:48 # 삭제 답글

    v월드 제외하고 지도가 안나옵니다.(확대 축소버튼은 나오는데 지도이미지가 안나옵니다.)
  • 원군이 2020/05/04 15:47 # 삭제 답글

    감사합니다! 혹시 "key" 엔티티가 참조되었지만 선언되지 않았다고 뜨는건 어떻게 해결하나요?
    <?xml version="1.0" encoding="UTF-8"?>
    <customMapSource>
    <name>Smart</name>
    <minZoom>0</minZoom>
    <maxZoom>8</maxZoom>
    <tileType>png</tileType>
    <tileUpdate>None</tileUpdate>
    <url>http://map.seoul.go.kr/smgis/apps/mapsvr.do?cmd=getTileMap&key;ea061e94268b45c0b4ac9859a7b591af&URL=http://smjd3:7070/MapAppServer/Service?timg=dawul_kor_air/{$z}/{$x}/{$y}/13492_11863.png</url>
    <backgroundColor>#000000</backgroundColor>
    </customMapSource>
  • 코린이 2020/09/14 08:15 # 삭제 답글

    선생님 안녕하세요, 혹시 다음 SKYVIEW를 다운로드 받으려면 어떻게 해야 할까요?
    지형도 아닌 위성 사진을 가져오고 싶습니다.
    여러가지 시도했는데 아직 해결책을 못 찾아서 질문 드립니다.
  • 준희아방 2021/01/04 19:43 # 삭제 답글

    덕분에 오프라인 이미지로 잘사용하고 있습니다.
    다름이 아니라 다음 지도를 다운받아서 확인해보니 좌표가 엉뚱한곳으로 가는데 5181좌표로 변화하려면 어떻게 해야되나요?
댓글 입력 영역