ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Geohash
    개발하면서/Algorithm,Data Structure 2014.06.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해서 나온 값은 위도이다.




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


    출처: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.