ABOUT ME

-

인기 태그


kafka elastic_search redis
Today
-
Yesterday
-
Total
-
  • Geohash
    개발하면서/Algorithm,DS,PS 2014. 6. 27. 17:29

    http://en.wikipedia.org/wiki/Geohash

    http://geohash.org/site/tips.html

     

    어느 DB 프로젝트 issue를 보다가 GeoHash dataType 지원할 생각은 없냐는 글을 봤다.

    GeoHash? 처음 들어보는 hash다...공부해보자.

    공부라고 해봤자 wiki를 내 나름대로 정리하자는 거지 뭐...

     

    GeoHash는 Gustavo Niemeyer가 geohash.org 웹서비스를 개발하면서 위도/경도를 표현하기 위해 개발한 geocode라고 한다.

    좌표 2개를 하나로 표현할수있고, 주변의 Geohash값들은 비슷한 값들이 나와 비교가 쉽다는 장점이 있다.

     

    가까운 두 점이라도 Geohash값은 전혀 다른값이 나올수 있다. 위에서는 비슷하다고 해놓고 전혀 다른 값이 나온다고??

    그 이유는 본초 자오선과 적도를 경게로 인접한 지역들은 위도 혹은 경도 값이 크게 달라서 Geohash도 다른 값이 나온다.

     

    예로 적도가 지나가는 인도네시아를 보면 위치는 비슷하지만 Geohash는 전혀 다른 값이 나온다.

    ※ https://www.movable-type.co.uk/scripts/geohash.html

     

    latitude 위도, longitude 경도

    위도는 적도를 기준으로 북 90, 남, 90이라 하고, 경도는 본초자오선(처음들어봄..)을 기준으로 동경 180, 서경 180라 한다.

    Equator 적도, Meridian 자오선

     

    우선 어떻게 진행되는건지 알아보자

    ※ 예제는 Wiki에 있는 것이다. https://en.wikipedia.org/wiki/Geohash

    ezs42라는 Geohash 값이 있다고 하면 아래 표에 의해서 "01101 11111 11000 00100 00010"로 표현이 된다.

    그럼 가장 왼쪽에 있는 0부터 시작해서 두칸씩 오른쪽 이동하면서 concat하면 011...이 나오고 이 값은 경도,

    가장 왼쪽에 있는 0에서 한칸 옆에 있는 1부터 시작해서 두칸씩 오른쪽 이동하면서 concat하면 101...이 나오고 이 값은 위도이다.

     

     

    왼쪽 카드가 위도, 오른쪽 카드가 경도 요런느낌? ㅎㅎㅎ

    출처:http://theknaveofclovers.tumblr.com/post/41608490725/card-shuffle

     

    그럼 경도는 0111110000000, 위도는 101111001001가 된다.

    10진수로 변하고 싶지만 아직 아니다. 왼쪽에서 오른쪽으로 읽어가면서 범위를 좁혀가는 과정을 진행한다.

     

    위도를 예를 들어보자.

    1이면 오른쪽, 0이면 왼쪽을 선택해서 범위를 좁혀가는 것이다.

    위도는 처음 시작할땐 -90 ~ +90이다. 비트값이 0이면 -90 ~ 0, 1이면 0 ~ +90인것이다.

     

     

    오른쪽 마지막까지 가면 소숫점 둘째나 셋째에서 반올림해준다.

     

    인코딩은 거꾸로 하면 되겄지요?

     

    https://github.com/lyokato/libgeohash

    https://github.com/the42/cartconvert

    Go, C로 구현한게 있는데...어렵다. 공부하자

     

    참고로 서울 GeoHash는 wydm99uq이다.

    http://geohash.org/wydm99uq

    댓글 0

Designed by Tistory.