Skip to content

Commit a67f1ff

Browse files
committed
Imported Upstream version 0.2
0 parents  commit a67f1ff

File tree

7 files changed

+490
-0
lines changed

7 files changed

+490
-0
lines changed

PKG-INFO

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
Metadata-Version: 1.0
2+
Name: python-geohash
3+
Version: 0.2
4+
Summary: UNKNOWN
5+
Home-page: UNKNOWN
6+
Author: UNKNOWN
7+
Author-email: UNKNOWN
8+
License: UNKNOWN
9+
Description: UNKNOWN
10+
Platform: UNKNOWN

README

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
* python-geohash
2+
python-geohash is a fast, accurate python geohashing library.
3+
4+
** LICENSE
5+
Code is licensed under Apache License 2.0, MIT Licence and NEW BSD License.
6+
You can choose one of the licences above.

geohash.py

Lines changed: 153 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,153 @@
1+
# coding: UTF-8
2+
"""
3+
Copyright (C) 2009 Hiroaki Kawai <[email protected]>
4+
"""
5+
__all__ = ['encode','decode','decode_exactly','bbox', 'neighbors', 'expand']
6+
7+
_base32 = '0123456789bcdefghjkmnpqrstuvwxyz'
8+
_base32_map = {}
9+
for i in range(len(_base32)):
10+
_base32_map[_base32[i]] = i
11+
del i
12+
13+
# def _binstr(b, length=32):
14+
# t = []
15+
# while length>0:
16+
# if b&1:
17+
# t.append('1')
18+
# else:
19+
# t.append('0')
20+
# b=b>>1
21+
# length-=1
22+
#
23+
# t.reverse()
24+
# return ''.join(t)
25+
26+
def _encode_i2c(lat,lon,lat_length,lon_length):
27+
precision=(lat_length+lon_length)/5
28+
if lat_length < lon_length:
29+
a = lon
30+
b = lat
31+
else:
32+
a = lat
33+
b = lon
34+
35+
ret = ''
36+
while precision>0:
37+
c = ((a&4)<<2) + ((b&2)<<2) + ((a&2)<<1) + ((b&1)<<1) + (a&1)
38+
ret += _base32[c]
39+
t = a>>3
40+
a = b>>2
41+
b = t
42+
precision-=1
43+
44+
return ret[::-1]
45+
46+
def encode(latitude, longitude, precision=12):
47+
if latitude > 90.0 or latitude < -90.0:
48+
raise Exception("invalid latitude.")
49+
while longitude < -180.0:
50+
longitude += 360.0
51+
while longitude >= 180.0:
52+
longitude -= 360.0
53+
54+
lat = (latitude+90.0)/180.0
55+
lon = (longitude+180.0)/360.0
56+
57+
lat_length=lon_length=precision*5/2
58+
if precision%2==1:
59+
lon_length+=1
60+
61+
lat = int((1<<lat_length)*lat)
62+
lon = int((1<<lon_length)*lon)
63+
64+
return _encode_i2c(lat,lon,lat_length,lon_length)
65+
66+
def _decode_c2i(hashcode):
67+
lon = 0
68+
lat = 0
69+
bit_length = 0
70+
lat_length = 0
71+
lon_length = 0
72+
for i in hashcode:
73+
t = _base32_map[i]
74+
if bit_length%2==0:
75+
lon = lon<<3
76+
lat = lat<<2
77+
lon += (t>>2)&4
78+
lat += (t>>2)&2
79+
lon += (t>>1)&2
80+
lat += (t>>1)&1
81+
lon += t&1
82+
lon_length+=3
83+
lat_length+=2
84+
else:
85+
lon = lon<<2
86+
lat = lat<<3
87+
lat += (t>>2)&4
88+
lon += (t>>2)&2
89+
lat += (t>>1)&2
90+
lon += (t>>1)&1
91+
lat += t&1
92+
lon_length+=2
93+
lat_length+=3
94+
95+
bit_length+=5
96+
97+
return (lat,lon,lat_length,lon_length)
98+
99+
def decode(hashcode, delta=False):
100+
(lat,lon,lat_length,lon_length) = _decode_c2i(hashcode)
101+
102+
lat = (lat<<1) + 1
103+
lon = (lon<<1) + 1
104+
lat_length += 1
105+
lon_length += 1
106+
107+
latitude = 180.0*lat/(1<<lat_length) - 90.0
108+
longitude = 360.0*lon/(1<<lon_length) - 180.0
109+
if delta:
110+
latitude_delta = 180.0/(1<<lat_length)
111+
longitude_delta = 360.0/(1<<lon_length)
112+
return latitude,longitude,latitude_delta,longitude_delta
113+
114+
return latitude,longitude
115+
116+
def decode_exactly(hashcode):
117+
return decode(hashcode, True)
118+
119+
## hashcode operations below
120+
121+
def bbox(hashcode):
122+
(lat,lon,lat_length,lon_length) = _decode_c2i(hashcode)
123+
124+
ret={}
125+
ret['n'] = 180.0*(lat+1)/(1<<lat_length) - 90.0
126+
ret['s'] = 180.0*lat/(1<<lat_length) - 90.0
127+
ret['e'] = 360.0*(lon+1)/(1<<lon_length) - 180.0
128+
ret['w'] = 360.0*lon/(1<<lon_length) - 180.0
129+
return ret
130+
131+
def neighbors(hashcode):
132+
(lat,lon,lat_length,lon_length) = _decode_c2i(hashcode)
133+
ret = []
134+
tlat = lat
135+
for tlon in (lon-1, lon+1):
136+
ret.append(_encode_i2c(tlat,tlon,lat_length,lon_length))
137+
138+
tlat = lat+1
139+
if not tlat >> lat_length:
140+
for tlon in (lon-1, lon, lon+1):
141+
ret.append(_encode_i2c(tlat,tlon,lat_length,lon_length))
142+
143+
tlat = lat-1
144+
if tlat >= 0:
145+
for tlon in (lon-1, lon, lon+1):
146+
ret.append(_encode_i2c(tlat,tlon,lat_length,lon_length))
147+
148+
return ret
149+
150+
def expand(hashcode):
151+
ret = neighbors(hashcode)
152+
ret.append(hashcode)
153+
return ret

jpgrid.py

Lines changed: 160 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,160 @@
1+
# coding: UTF-8
2+
# Coder for Japanese grid square code. (JIS C 6304 / JIS X 0410)
3+
# 行政管理庁告示第143号 http://www.stat.go.jp/data/mesh/
4+
5+
def _encode_i2c(lat, lon, base1):
6+
t=[]
7+
while base1>80:
8+
t.append(1 + (lat&1)*2 + (lon&1))
9+
lat = lat>>1
10+
lon = lon>>1
11+
base1 = base1>>1
12+
13+
if base1==80:
14+
t.append(lon%10)
15+
t.append(lat%10)
16+
lat = lat/10
17+
lon = lon/10
18+
base1 = base1/10
19+
elif base1==16: # Uni5
20+
t.append(1 + (lat&1)*2 + (lon&1))
21+
lat = lat>>1
22+
lon = lon>>1
23+
base1 = base1>>1
24+
elif base1==40: # Uni2
25+
t.append(5)
26+
t.append(lon%5*2)
27+
t.append(lat%5*2)
28+
lat = lat/5
29+
lon = lon/5
30+
base1 = base1/5
31+
32+
if base1==8:
33+
t.append(lon%8)
34+
t.append(lat%8)
35+
lat = lat>>3
36+
lon = lon>>3
37+
base1 = base1>>3
38+
39+
t.append(lon)
40+
t.append(lat)
41+
t.reverse()
42+
return ''.join([str(i) for i in t])
43+
44+
def encode(latitude, longitude, base1=80):
45+
return _encode_i2c(int(latitude*base1*1.5), int((longitude-100)*base1), base1)
46+
47+
#def _encode_i2c(lat, lon, base1):
48+
def _decode_c2i(gridcode):
49+
base1 = 1
50+
lat = lon = 0
51+
codelen = len(gridcode)
52+
if codelen>0:
53+
lat = int(gridcode[0:2])
54+
lon = int(gridcode[2:4])
55+
56+
if codelen>4:
57+
lat = (lat<<3) + int(gridcode[4:5])
58+
lon = (lon<<3) + int(gridcode[5:6])
59+
base1 = base1<<3
60+
61+
if codelen>6:
62+
if codelen==7:
63+
i = int(gridcode[6:7])-1
64+
lat = (lat<<1) + i/2
65+
lon = (lon<<1) + i%2
66+
base1 = base1<<1
67+
else:
68+
lat = lat*10 + int(gridcode[6:7])
69+
lon = lon*10 + int(gridcode[7:8])
70+
base1 = base1*10
71+
72+
if codelen>8:
73+
if gridcode[8:]=='5':
74+
lat = lat>>1
75+
lon = lon>>1
76+
base1 = base1>>1
77+
else:
78+
for i in gridcode[8:]:
79+
i = int(i)-1
80+
lat = (lat<<1) + i/2
81+
lon = (lon<<1) + i%2
82+
base1 = base1<<1
83+
84+
return (lat, lon, base1)
85+
86+
def decode_sw(gridcode, delta=False):
87+
(lat, lon, base1) = _decode_c2i(gridcode)
88+
89+
lat = lat/(base1*1.5)
90+
lon = lon/float(base1) + 100.0
91+
92+
if delta:
93+
return (lat, lon, 1.0/(base1*1.5), 1.0/base1)
94+
else:
95+
return (lat, lon)
96+
97+
def decode(gridcode):
98+
(lat, lon, base1) = _decode_c2i(gridcode)
99+
100+
lat = (lat<<1) + 1
101+
lon = (lon<<1) + 1
102+
base1 = base1<<1
103+
return (lat/(base1*1.5), lon/float(base1) + 100.0)
104+
105+
def bbox(gridcode):
106+
(a,b,c,d) = decode_sw(gridcode, True)
107+
return {'w':a, 's':b, 'n':b+d, 'e':a+c}
108+
109+
110+
## short-cut methods
111+
def encodeLv1(lat, lon):
112+
return encode(lat,lon,1)
113+
114+
def encodeLv2(lat, lon):
115+
return encode(lat,lon,8)
116+
117+
def encodeLv3(lat, lon):
118+
return encode(lat,lon,80)
119+
120+
def encodeBase(lat,lon):
121+
return encodeLv3(lat,lon)
122+
123+
def encodeHalf(lat,lon):
124+
return encode(lat,lon,160)
125+
126+
def encodeQuarter(lat,lon):
127+
return encode(lat,lon,320)
128+
129+
def encodeEighth(lat,lon):
130+
return encode(lat,lon,640)
131+
132+
def encodeUni10(lat,lon):
133+
return encodeLv2(lat,lon)
134+
135+
def encodeUni5(lat, lon):
136+
return encode(lat,lon,16)
137+
138+
def encodeUni2(lat, lon):
139+
return encode(lat,lon,40)
140+
141+
142+
def neighbors(gridcode):
143+
(lat,lon,base1)=_decode_c2i(gridcode)
144+
ret = []
145+
for i in ((0,-1),(0,1),(1,-1),(1,0),(1,1),(-1,-1),(-1,0),(-1,1)):
146+
tlat=lat+i[0]
147+
tlon=lon+i[1]
148+
if tlat<0 or tlat>(90*base1):
149+
continue
150+
if tlon<0 or tlon>(100*base1):
151+
continue
152+
153+
ret.append(_encode_i2c(tlat,tlon,base1))
154+
155+
return ret
156+
157+
def expand(gridcode):
158+
ret = neighbors(gridcode)
159+
ret.append(gridcode)
160+
return ret

0 commit comments

Comments
 (0)