본문 바로가기
딴짓/어학연수

구글맵의 '목록'으로 '지도'만들기 가능???

by 바른생활머시마 2023. 10. 3.
728x90
반응형

 오랜만의 가족 여행이라 첫째에게 가족 일에 주도적으로 참여 해 볼 기회도 줄 겸, 가볼만한 곳 목록을 한번 만들어 보라고 하였고, 정말 오랜(?) 시간이 걸려서 목록을 만들어 왔습니다.(휴대폰 바꿔준다는 동기부여가 없었더라면 불가능한..ㅋㅋ) 그런데, 그냥 텍스트로 목록을 적어서 보냈길래, 잘했지만 구글맵으로 장소를 공유 하도록 해보라고 하였고, 한창 휴대폰 뭘 살 것인지 논의하는 중이라 그런지 번개같이 처리를 해 왔습니다.ㅋㅋ

 

 아... 스티브잡스 미워...ㅋㅋ

나는 애플이 우리나라 사용자 홀대 하는게 싫어서 아이폰 싫은데, 애들은 그런게 없나봅니다.

 

예전에는 해외 여행 가서 새로운 도시에 도착하면 가장 먼저 하는 일이 그 도시의 다양한 지도를 모으는 것이었습니다.  휴대폰 로딩은 비싸고 에그 같은거도 제한적으로 쓰고 뭐 그렇고, 구글맵을 다운로드 받아서 다니기도 하고... 그래서 그냥 종이 지도를 가지고 다니는 것이 훨씬 편했습니다.  요즘은 해외 여행을 가도 인터넷 대체로 다 잘 되고, 유심도 이전보다 싼 가격에 사용 할 수 있으니 휴대폰으로 이런 자료 보관하는게 좋죠. 이전에는 e-ticket을 인정해 주지 않아서 따로 돈을 더 내야하는 경우도 있어서, 그래도 종이 티켓은 가급적 준비하는 것이 마음이 놓이기도 하구요. 휴대폰으로 이제 다 되는 세상이 되기 때문에 지도도 구글맵을 더 많이 쓰게 됩니다.

 

 첫째가 보내준 방문할 곳은, '목록' 형태로 되어 있었습니다.

 뭐 목록을 공유하라고 했으니, 아빠 말을 충실히 따른거죠. 그런데, 저와 아내는 여행 갈 때 '목록' 보다는 '구글맵'의 '지도' 만들기 기능을 이용해서, 방문할 곳이 표시 된 '지도'를 함께 공유하는 것이 더 편리했습니다. 레이어를 이용해서 카테고리 구분도 되고, 레이어별로 아이콘도 설정 할 수 있어서 보기 편리하기 때문이죠.  

그래서, 첫째가 만들어준 '목록'으로 '지도'를 만드는 방법이 당연히 있겠거니 하고 이것저것 막 살펴봤는데... 찾기가 쉽지 않네요. 노가다를 하는 방법도 있는데, 괜한 개발자의 고집같은거도 있고, 방법을 계속 찾아봤는데, 데이터 내보내기 기능을 쓰면 될 것 같았습니다. 그런데, 저장되는 형식이 KML은 안되고, GeoJSON만 되는 것 같은데, 문제는 '지도'에서 불러들이는 데이터 형식이 CSV, XLSX 등 표 형식 데이터라서 GeoJSON은 바로 읽을 수 없었습니다.

 구글 드라이브 내에서 GeoJSON을 처리 해 줄 수 있다면 이것을 표로 만들어 '지도'에서 불러들일 수 있지 않을까 싶어, 드라이브에서 해당 파일을 한번 열어봤는데, 기본적으로는 텍스트 뷰어로 열렸습니다.

사용 가능한 연결앱을 검색 해 보니 GeoJSON 뷰어가 있는데, 이게 구글드라이브 위에서 돌아가는게 아니고 별도 웹 서비스로 링크를 해주는 형식인 것 같아서, 볼 수만 있을 뿐, 가공에는 활용 할 수 있는 부분이 없었습니다. 이런 상황이면 어느 용자께서 GeoJSON to CSV/XLSX 같은 것을 만들어 두셨을  법도 한데 말이죠...

 

 검색을 해 보니 한 용자님을 찾을 수 있었고, python을 돌릴 수 없는 일반 사용자들을 위하여 GUI 기반으로 만들어 보겠노라는 계획을 적어 두셨네요. 저도 비슷한 생각을 하고 있었는데, 사실 코드로 JSON을 가공하는 것은 어려운 일이 아닌데, 일반 사용자들에게는 코드를 실행하는 환경을 만드는 것이 완전히 다른 세상의 일이니까 쉽지 않죠. 

https://github.com/Bohdan2505/geojson-to-xlsx/

 

GitHub - Bohdan2505/geojson-to-xlsx: Python script convert geojson to table format (as xlsx or other popular)

Python script convert geojson to table format (as xlsx or other popular) - GitHub - Bohdan2505/geojson-to-xlsx: Python script convert geojson to table format (as xlsx or other popular)

github.com

일반 사용자들의 접근이 쉬운, 웹 기반의 변환기도 인터넷에 있는데, 세부 정보가 들어있는 부분이 그냥 JSON 문자열의 한 컬럼으로 들어가 있어서, 구글맵에서 바로 쓸 수가 없었습니다. 목록 중 하나의 데이터는 아래와 같이 구성되는데,  모든 Depth를 다 풀어도 크게 문제가 없을 것 같아 보입니다.

    },
    {
      "geometry": {
        "coordinates": [
          101.6958419,
          3.1452820
        ],
        "type": "Point"
      },
      "properties": {
        "date": "2018-01-13T10:57:44Z",
        "google_maps_url": "http://maps.google.com/?cid=16008810172553428742",
        "location": {
          "address": "34, First Floor, Jalan Hang Kasturi, City Centre, 50050 Kuala Lumpur, Wilayah Persekutuan Kuala Lumpur, Malaysia",
          "country_code": "MY",
          "name": "SPOT ON 90236 Zigzag Travellers Home"
        }
      },
      "type": "Feature"
    },
    {

용자님의 코드를 사용하면 어떻게 변환이 되는지 한번 돌려보도록 하겠습니다. 이를 위해 geojson, shapely, pandas를 pip로 설치하였습니다.

import geojson
from shapely import wkt
from shapely.geometry import shape
from pandas import read_excel, DataFrame, to_numeric, isnull

with open('myfile.geojson') as f:
    geojson_content = geojson.load(f)

geojson_features = geojson_content['features']

df = DataFrame()

for x in geojson_features:
    
    row = geojson_features.index(x)
    geometry_feature = x['geometry']
    geometry_shape = shape(geometry_feature)
    wkt_geometry = wkt.loads(geometry_shape.wkt)
    df.at[row, 'WKT'] = wkt_geometry
    properties_feature = x['properties']
    for i in properties_feature:
        if properties_feature[i] == None:
            df.at[row, i] = ''
        else: df.at[row, i] = properties_feature[i]
        
df.to_excel('geojson_convert_result.xlsx', index=False)        
df.to_csv('geojson_convert_result.csv', index=False)

 실행을 해 보면, 먼저 인코딩 문제로 파일을 읽을 수 없다는 에러가 뜹니다. 소스 파일 읽을 때 utf-8로 읽도록 인코딩을 지정 해 주고, 다시 읽으면 파싱 과정에서 문제가 생기는 것 같아요. 에러 로그를 보면, 위치가 없는 데이터, 즉 적절하지 못한 데이터가 있을 때의 예외 처리가 되지 않은 것 같습니다. 이 코드를 바탕으로 간단한 변환기를 한번 만들어 보도록 하죠.

 

 

받은 목록을 내 목록으로 저장하기

목록을 링크로 받게 되는데, 정확히 말하면 받은 목록을 볼 수 있는 링크를 받은 것이지 목록 자체를 받은 것이 아닙니다. 그래서, 그 목록 데이터를 내가 직접 어떻게 할 수는 없는 상태 입니다. 그런데, 이 목록을 내 데이터로 저장을 할 수 있습니다. 아래와 같은 과정으로 받은 목록을 내 목록에 추가를 할 수 있습니다. (PC나 휴대폰 모두 가능)

 

열린 목록이 보이는 상태에서 '저장'을 누릅니다.

그러면, '저장 된 장소'라고 표시가 바뀝니다. 일단, 여기까지 하면 데이터를 내 목록에 저장하는 것은 된 것 입니다.

그 후, '지도 보기'를 해 봅니다.

 

지도에서 어떻게 보이는지 확인 해 보기 위해, 지도에서 '저장'을 눌러봅니다.

그러면, 내 기본 목록 외에 추가 된 목록을 볼 수 있습니다.

 

Google 지도의 내 데이터

이것이 이런 기능인지 몰랐네요. 분명히 요긴한 기능이고, 다양한 데이터를 구글 플랫폼 상에서 가공하고 소통 시킬 수 있게 해주는 중요한 기능인데, 아마도 이렇게 해서 구글에 대한 의존성을 더 높히려는 것 같네요. 기왕이면 자기 시스템들간 연동도 좀 더 잘 되게 해주면 좋겠구만...

나와 관련 된 여러가지 데이터에 대한 현황을 보여주고 그 아래 데이터 내보내는 매뉴가 보입니다.

이렇게 데이터를 내보내는 것이, 서비스 상으로는 구글계정 서비스의 하위에서 구글 테이크아웃이라는 이름으로 되어 있군요. My Data로도 확장 될 수 있을까 싶고, 사용자들이 콘텐츠에 기여한 것에 대한 보상을 해 줄 수 있는 바탕이면 좋겠군요. 어짜피 보상을 해준다고 해도 구글에서 많이 떼먹을 것이니 구글이 이기는 게임일 것이고...

이 중, 다른 것은 다 선택 해제하고, 가장 마지막 데이터만 체크 합니다.

다음 단계를 누르면 받을 방법을 지정하게 되는데, 저장 할 경로를 설정하거나 메일로 받는 방법을 선택 할 수 있습니다. 데이터가 많으면 메일로 받는 것이 기다리지 않아도 되서 좋을 것 같네요. 이 예의 경우는 데이터 양이 많지 않으므로 그냥 구글 드라이브에 저장하도록 하겠습니다. 주기적 백업을 할 목적이 아니므로 한번만 하고...

그 후 내보내기 생성을 누르면, 이전의 진행 이력이나 현재 진행 중인 상태, 완료 된 작업의 결과물 받는 링크 등이 보입니다.

드라이브에서 열기를 누르면, 해당 파일을 구글 드라이브에서 연 화면이 보입니다. 이 예의 경우, 앞에서 zip파일로 선택했기 때문에 zip파일의 내부 목록이 보이는 화면이 보여지게 됩니다.

압축을 풀어 보면 아래와 같이 저장 된 것을 볼 수 있습니다. 리뷰는 내가 특정 장소에 남긴 댓글 목록입니다. 우리는 '저장한 장소.json'을 쓰면 됩니다. 그런데 폴더 이름과 파일 이름도 언어 설정에 따라 달라지니 좋기도 한데, 해당 파일 처리하는 입장에서는 좀 번거롭겠네요. 사용자의 언어 설정을 모르니, 사용자보고 파일 이름을 rename 하라고 하거나, 파일 이름을 직접 입력하라고 하거나, 특정 폴더에 넣거나 등등... GUI를 사용하게 되면 file select UI를 쓰면 되겠고, 아니면 실행 파일과 같은 경로 내에 json 파일이 하나만 있으면 그것을 쓰도록 해도 되겠고... 암튼, 그런건 나중의 일이니 일단 패스~

 

저장한 장소 확인

저장 하는 과정에서 특정 목록을 선택하는 과정이 없었기 때문에 모든 목록의 데이터가 저장 됩니다. 애초에 이 기능의 목적이 필요한 목록 데이터 내보내기 목적이 아니기 때문에 그런 것 같습니다. 일종의 계정 백업용 기능이므로 내보낼 내용을 너무 세부적으로 설정 할 수 있는 기능은 아니겠죠.(그렇게 보면 목록 내보내기 기능을 따로 만들어 줘야 될텐데...)

 

이전 여행 때 기록해두었던 데이터도 보이네요.

데이터의 필터링은 엑셀 상태에서 하는 것이 편리하기도 하고, 프로그래밍과 거리가 먼 사람들도 각자의 필요에 따라 필터링을 하는 것이 좋을테니, 더더욱 엑셀에서 엑셀 기능으로 필터링을 하는게 좋겠네요. 혹은 GUI가 있으면 기본적인 필터링 옵션은 화면에서 설정해도 좋을 것 같습니다.

 

 한 가지 중요한 사항은, 전달받아 저장한 목록의 데이터가 포함되어 있는가를 확인하는 것이므로, 한번 확인 해 보겠습니다.

목록 중, '문화과학궁전'을 JSON에서 찾아보기 위해,

'문화'라고 검색을 해보니, '문화'가 들어간 항목은 하나 뿐이고, 그것도 다른 것이었습니다.

아마도, 원래 이름으로 검색을 해야 되겠죠? 위의 목록에 보이는 한글 화면은 화면에 보여질 언어 설정에 따른 것이고, 백업 되는 원본은 원래 이름 혹은 영문으로 되어 있을 것 같습니다. 문화과학궁전의 원래 이름을 확인하고

검색을 해보니...어찌 된 영문인지 보이지 않네요.

출력 된 데이터의 국가 코드만 정리해서 보니, 이번에 추가한 데이터는 포함되지 않았네요.(헝가리/슬로베니아/체코 등)

"country_code": "ZA",
  남아공
"country_code": "MN",
  몽골
"country_code": "VN",
  베트남
"country_code": "MY",
  말레이지아
"country_code": "TH",
  태국
"country_code": "SG",
  싱가폴
"country_code": "KR",
  한국
"country_code": "JP",
  일본
"country_code": "NL",
  네델란드

이상하네요.

...

 

혹시 백업이라는 형식으로 저장하는 것이라 하루 뒤면 될까 싶어 다음 날 해봐도 마찬가지였습니다.

그러다가, 가만히 보니...앗앗!! 

"별표" 표시 된 장소만 된다는 뜻??? 이게 맞다면 정말 황당한데... 왜 별표만 되는건지 모르겠네요.

 

별표 목록에 부다페스트의 몇 곳을 추가한 후, 똑같이 확인 해 보겠습니다.

별표 표시를 한 것을 테스트 해 보려고 하니, 이제야 여기 저기 곳곳에 숨은 '별'들이 보이네요. 잘 읽어봤다면 좀 더 일찍 알 수 있었겠지만, 다른 목록과 달리 특별히 별표시만 내보내야 할 이유가 납득이 되지 않으니 예상하기 어려웠던 점도 있는 것 같아요. 

이렇게 해서 내려받아 보니 잘 되는군요.

그럼 문제는 전달 받은 다른 사람의 목록을 나의 별표 표시 목록에 쉽게 넣을 수 있느냐가 문제인데, 딱히 방법은 없는 것 같습니다.  다른 사람에게 받은 목록을 보고 내가 별표 표시를 하면, 위와 같은 방법으로 Export하고, 파싱을 해서 CSV 등으로 맵에서 읽을 수 있는 형식으로 저장하여 맵에 넣으면 되겠습니다.

 

가장 좋은 방법은!!!!

그냥 처음부터 준비 하는 사람이 맵을 만들고 그 맵 안에 지점들 목록을 만들고, 그 맵을 공유하는 것이 가장 좋은 방법인 것 같습니다. 또, 목록을 전달 받았더라도 목록의 개수가 대단히 많지 않다면, 내가 맵을 만들고 목록을 하나씩 추가하는게 효율적이고 정신 건강에 유리한 것 같습니다.

 

저도, 첫째가 보내준 목록을 열어놓고, 다른 브라우져를 하나 더 띄워 '내 지도'를 새로 만들고, 항목 이름을 복사해서 '내지도' 화면에서 검색하여 추가를 했습니다. 그랬더니, 뭐 그다지 오래 걸리지 않고 잘 정리가 되었고, 거기에 '내지도'의 기능들을 이용해서 부가적인 정보까지 더 올려서 가족들과 '편집 가능한 권한의 링크'로 공유를 했습니다.

아직 여행까지 시간이 좀 남았는데 함께 만들어 가면 좋...겠다고 기대하는 것은 아빠의 과한 바램이겠네요.ㅋㅋ

 

728x90
반응형

댓글