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)
Exemple #2
0
    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))
Exemple #4
0
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
Exemple #5
0
 def test_geohash_ordinality(self):
     assert pm.interleave_latlng(-40.723471, -73.985361) < pm.interleave_latlng(-40.523471, -73.785361)
Exemple #6
0
 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)
Exemple #7
0
 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))
Exemple #8
0
 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))
Exemple #9
0
 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)
Exemple #10
0
 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)
Exemple #11
0
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))
Exemple #12
0
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)