def calculate_Geohash(mbr: Rectangle) -> int: try: import pymorton as pm except ImportError: raise RuntimeError("Please install pymorton to calculate geohashes: pip install pymorton") x, y = mbr.centroid() return pm.interleave_latlng(y, x)
def test_pymorton(self): # Test standard hashing assert (pm.interleave(100, 50) == pm.interleave2(100, 50)) assert (pm.interleave(10, 50, 40) == pm.interleave3(10, 50, 40)) assert ((100, 30) == pm.deinterleave2(pm.interleave(100, 30))) assert (pm.deinterleave2(pm.interleave(100, 30)) == (100, 30)) assert (pm.deinterleave3(pm.interleave(100, 30, 50)) == (100, 30, 50)) # Test geo-hashing lat, lng = 40.712014, -74.008164 latlng_morton = pm.interleave_latlng(lat, lng) assert('03023211232311330231120312032231' == \ latlng_morton) assert(pm.deinterleave_latlng(latlng_morton) == \ (40.712013971060514, -74.00816400535405))
def test_pymorton(self): # Test standard hashing assert(pm.interleave(100, 50) == pm.interleave2(100, 50)) assert(pm.interleave(10, 50, 40) == pm.interleave3(10, 50, 40)) assert((100, 30) == pm.deinterleave2(pm.interleave(100, 30))) assert(pm.deinterleave2(pm.interleave(100,30)) == (100, 30)) assert(pm.deinterleave3(pm.interleave(100, 30, 50)) == (100, 30, 50)) # Test geo-hashing lat, lng = 40.712014, -74.008164 latlng_morton = pm.interleave_latlng(lat, lng) assert('03023211232311330231120312032231' == \ latlng_morton) assert(pm.deinterleave_latlng(latlng_morton) == \ (40.712013971060514, -74.00816400535405))
def convert_to_1D(location): ''' Map any store address to a single number! ''' if location.has_key('address'): formatted_address, lat, lon = geo(location['address']) lat = float(lat) lon = float(lon) elif location.has_key('lat') and location.has_key('lon'): lat = float(location['lat']) lon = float(location['lon']) else: return None # Next, convert lat and long each into a positive int. code = interleave_latlng(lat, lon) # Now, turn the lat/long pair into a single number if location.has_key('address'): return {'id': code, 'lat': lat, 'lon': lon} else: return code
def test_geohash_ordinality(self): assert pm.interleave_latlng(-40.723471, -73.985361) < pm.interleave_latlng(-40.523471, -73.785361)
def test_invalid_negative_latitude(self): lat, lng = -220.712013, -74.008164 assert pm.deinterleave_latlng(pm.interleave_latlng(lat, lng)) == (round(lat + 180.0, 6), lng)
def test_invalid_negative_longitude(self): lat, lng = -40.712013, -190.008164 assert pm.deinterleave_latlng(pm.interleave_latlng(lat, lng)) == (lat, round(lng + 180.0, 6))
def test_invalid_positive_longitude(self): lat, lng = 40.712013, 190.008164 assert pm.deinterleave_latlng(pm.interleave_latlng(lat, lng)) == (lat, round(lng - 180.0, 6))
def test_standard_geohashing(self): lat, lng = 40.712014, -74.008164 latlng_morton = pm.interleave_latlng(lat, lng) assert '03023211232311330231120312032231' == latlng_morton assert pm.deinterleave_latlng(latlng_morton) == (40.712014, -74.008164)
def test_ordering(self): assert pm.interleave_latlng(-40.723471, -73.985361) < \ pm.interleave_latlng(-40.523471, -73.785361) assert pm.interleave_latlng(40.723471, 40.734567) > \ pm.interleave_latlng(40.723271, 40.734367)
def Zorder_auto(filename, m, N): ori = [] sample = [] with open(filename, 'r', encoding='utf8') as f: for i in f: ori = json.loads(i) for index, i in enumerate(ori): i['id'] = index geo_hash_dict = {} geo_hash = [] s_set = set() datasets = {} for index, i in enumerate(ori): geohash = pm.interleave_latlng(i['lng'], i['lat']) geo_hash_dict[str(index)] = geohash datasets[str(index)] = [geohash] geo_hash.append(geo_hash) s_set.add(geohash) # print(geo_hash) # print(len(geo_hash)) # print(len(s_set)) a1 = sorted(geo_hash_dict.items(), key=lambda x: x[1], reverse=True) aa = 20000 num = N num1 = math.floor(aa / num) if (aa - num * num1) % num1 == 0: num += math.floor((aa - num * num1) / num1) else: num += math.floor((aa - num * num1) / num1) + 1 sample_list = [] z_lsit = [] attribute_dict = {} attribute_list = [] x = np.zeros([num, 1]) for i in range(num): if abs(aa - 1 - i * num1) < num1: b = a1[i * num1:aa] else: b = a1[i * num1:(i + 1) * num1] z_lsit.append(b) # print(b, i) c = random.sample(b, 1) sample_list.append(c[0][0]) A = [{ "lng": ori[int(d)]['lng'], "lat": ori[int(d)]['lat'], "value": ori[int(d)]["value"], 'id': ori[int(d)]['id'], 'type': ori[int(d)]['type'] } for d in sample_list] m.fit(A) transform = [m.type_idx(i) for i in range(len(A))] with open("./z-order/order_crime_output_{}.json".format(m.k), mode='w', encoding='utf8') as f: res = [] for i in range(len(A)): neighbors = m.neighbors[i] res.append({ 'id': A[i]['id'], "type": transform[i], "lat": A[i]["lat"], "lng": A[i]["lng"], "value": A[i]["value"], "mx": m.score[i][0], "my": m.score[i][1], "neighbors": neighbors }) json.dump(res, f) with open('./z-order/order_crime_output_{}.json'.format(m.k), 'r', encoding='utf-8') as f: for i in f: RecomputingPoints = json.loads(i) oriData = A correct = 0 mean = 0 for i in range(len(oriData)): mean += RecomputingPoints[i]['value'] if RecomputingPoints[i]['type'] == ori[RecomputingPoints[i] ['id']]['type']: correct += 1 return A, correct, RecomputingPoints, mean / (len(oriData))
def Zorder_auto_voting(filename, m, N, alpha, dirname, outputname): ori = [] sample = [] with open(filename, 'r', encoding='utf8') as f: ori = json.load(f) for index, i in enumerate(ori): i['id'] = index geo_hash_dict = {} geo_hash = [] s_set = set() datasets = {} for index, i in enumerate(ori): geohash = pm.interleave_latlng(i['lng'], i['lat']) geo_hash_dict[str(index)] = geohash datasets[str(index)] = [geohash] geo_hash.append(geo_hash) s_set.add(geohash) # print(geo_hash) # print(len(geo_hash)) # print(len(s_set)) a1 = sorted(geo_hash_dict.items(), key=lambda x: x[1], reverse=True) aa = len(ori) num = math.floor(aa * float(N)) num1 = math.floor(aa / num) if (aa - num * num1) % num1 == 0: num += math.floor((aa - num * num1) / num1) else: num += math.floor((aa - num * num1) / num1) + 1 sample_list = [] z_lsit = [] x = np.zeros([num, 1]) for i in range(num): if abs(aa - 1 - i * num1) < num1: b = a1[i * num1:aa] else: b = a1[i * num1:(i + 1) * num1] z_lsit.append(b) # print(b, i) c = random.sample(b, 1) sample_list.append(c[0][0]) with open("../../../storage/zorder_temp.json", mode='w', encoding='utf8') as f: obj = [] for g in z_lsit: obj.append([int(e[0]) for e in g]) json.dump(obj, f) # z_list包含每个分组,统计每个分组的中心点,类比泊松盘,找到10个邻近分组。并获取每个分组内高低值的点分布 grouping_number = len(z_lsit) center_list = [] c_list = [] diskCoverPoints = [] M_list = [] A_list = [] for i in z_lsit: x = 0 y = 0 H_list = [] L_list = [] HH, HL, LL, LH = [], [], [], [] NH = [] NL = [] for j in i: if ori[int(j[0])]['type'] == 'HH' or ori[int( j[0])]['type'] == 'HL': H_list.append(int(j[0])) if ori[int(j[0])]['type'] == 'HH': HH.append(int(j[0])) else: HL.append(int(j[0])) elif ori[int(j[0])]['type'] == 'LL' or ori[int( j[0])]['type'] == 'LH': L_list.append(int(j[0])) if ori[int(j[0])]['type'] == 'LL': LL.append(int(j[0])) else: LH.append(int(j[0])) if ori[int(j[0])]['type'] == 'HH' or ori[int( j[0])]['type'] == 'LH': NH.append(int(j[0])) elif ori[int(j[0])]['type'] == 'LL' or ori[int( j[0])]['type'] == 'HL': NL.append(int(j[0])) x += ori[int(j[0])]['lat'] y += ori[int(j[0])]['lng'] center_list.append([x / len(i), y / len(i)]) c_list.append([H_list, L_list]) M_list.append([HH, HL, LL, LH]) A_list.append([NH, NL]) # print(c_list) # 找到邻接分组 nearbyM = {} for i in range(grouping_number): temp = {} for j in range(grouping_number): if i == j: continue else: temp[str(j)] = math.sqrt( (center_list[j][0] - center_list[i][0])**2 + (center_list[j][1] - center_list[i][1])**2) a1 = sorted(temp.items(), key=lambda x: x[1], reverse=False) a1 = [int(d[0]) for d in a1[0:8]] nearbyM[str(i)] = a1 # 找到相邻盘中包含自己的盘 bynearM = {} # print(grouping_number) for i in range(grouping_number): temp = [] for j in nearbyM: if i == int(j): continue else: if i in nearbyM[j]: temp.append(int(j)) bynearM[str(i)] = temp # print(bynearM) with open(dirname + '\\nearbyM.json', 'w', encoding='utf8') as f: f.write(json.dumps(nearbyM)) with open(dirname + '\\bynearM.json', 'w', encoding='utf8') as f: f.write(json.dumps(bynearM)) # nearbyM = [] # bynearM = [] # with open('./z-order/nearbyM.json', 'r', encoding='utf8') as f: # for i in f: # nearbyM = json.loads(i) # with open('./z-order/bynearM.json', 'r', encoding='utf8') as f: # for i in f: # bynearM = json.loads(i) with open(dirname + '\\nearbyM1.json', 'w', encoding='utf8') as f: f.write(json.dumps(M_list)) # print(M_list) a = update2(ori, c_list, nearbyM, bynearM, M_list, A_list, alpha) A = [{ "lng": d['lng'], "lat": d['lat'], "value": d["value"], 'id': d['id'], 'type': d['type'] } for d in a] m.fit(A) transform = [m.type_idx(i) for i in range(len(A))] with open(outputname, mode='w', encoding='utf8') as f: res = [] for i in range(len(A)): neighbors = m.neighbors[i] res.append({ 'id': A[i]['id'], "type": transform[i], "lat": A[i]["lat"], "lng": A[i]["lng"], "value": A[i]["value"], "mx": m.score[i][0], "my": m.score[i][1], "neighbors": neighbors }) json.dump(res, f) with open(outputname, 'r', encoding='utf-8') as f: for i in f: RecomputingPoints = json.loads(i) oriData = A correct = 0 mean = 0 for i in range(len(oriData)): mean += RecomputingPoints[i]['value'] if RecomputingPoints[i]['type'] == ori[RecomputingPoints[i] ['id']]['type']: correct += 1 return A, correct, RecomputingPoints, ori, mean / len(oriData)