달력

072018  이전 다음

  • 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
  • 31
  •  
  •  
  •  
  •  

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

Posted by 오산돌구