微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在python中根据纬度和经度选择分布在整个城市的位置

如何解决在python中根据纬度和经度选择分布在整个城市的位置

我有一个包含多个 locationid、经度和纬度的数据框。我想选择彼此相距较远且分布在整个城市的位置。可重现的示例数据如下:

{'id': {1: 12,2: 1607,3: 1759,5: 1,6: 2,9: 16,10: 7,12: 9,16: 14,17: 15,19: 18,20: 19,21: 20,22: 21,23: 22,25: 24,26: 25,27: 26,28: 27,29: 28,30: 29,31: 30,33: 32,34: 6,36: 845,37: 846,43: 853,44: 854,51: 1060,53: 1062,60: 1574,62: 1576,63: 1577,65: 1579,68: 1601,70: 1603,74: 1608,75: 1609,76: 1610,77: 1611,78: 1612,79: 1613,80: 1614,81: 1615,82: 1616,83: 1617,84: 1618,85: 1619,86: 1620,87: 1621,88: 1622,89: 1623,90: 1624,92: 1653,95: 1656,96: 1658,99: 1661},'latitude': {1: 28.537524400000002,2: 28.568355600000004,3: 28.5376,5: 28.5511732,6: 28.5379173,9: 28.5511732,10: 28.6105489,12: 28.631106,16: 28.6297086,17: 28.6310136,19: 28.6314418,20: 28.6308021,21: 28.537524400000002,22: 28.541709499999996,23: 28.630070399999997,25: 28.542203499999996,26: 28.629385499999998,27: 28.5430387,28: 28.629774800000003,29: 28.544867,30: 28.54481,31: 28.5415443,33: 28.544763800000002,34: 28.6111946,36: 28.5925185,37: 28.592497499999997,43: 28.544905699999997,44: 28.544905699999997,51: 28.5686,53: 28.551540000000003,60: 28.5464447,62: 28.5479141,63: 28.546475399999995,65: 28.547717100000003,68: 28.563814899999997,70: 28.5639125,74: 28.5686848,75: 28.5687414,76: 28.568806899999995,77: 28.5679726,78: 28.568387100000006,79: 28.568836199999996,80: 28.568733899999998,81: 28.569007300000003,82: 28.5690386,83: 28.569073600000003,84: 28.568445899999997,85: 28.568298300000002,86: 28.568497600000004,87: 28.568802299999998,88: 28.5687321,89: 28.568242200000004,90: 28.568854700000003,92: 28.520415399999997,95: 28.520749100000003,96: 28.5278675,99: 28.527873200000002},'longitude': {1: 77.15372909999999,2: 77.2212948,3: 77.153729,5: 77.1652323,6: 77.1540886,9: 77.1652323,10: 77.0834744,12: 77.0823147,16: 77.0770394,17: 77.0814372,19: 77.08025529999999,20: 77.0797685,21: 77.15372909999999,22: 77.15557209999999,23: 77.07934159999999,25: 77.1563913,26: 77.0770105,27: 77.156637,28: 77.07920490000001,29: 77.15894870000001,30: 77.15843690000001,31: 77.1556093,33: 77.1586489,34: 77.0837583,36: 77.04122790000001,37: 77.0412577,43: 77.0610428,44: 77.0610428,51: 77.22032,53: 77.16503,60: 77.2501738,62: 77.2533776,63: 77.2502077,65: 77.2525809,68: 77.2500703,70: 77.25016740000001,74: 77.2238873,75: 77.2231794,76: 77.2211078,77: 77.2196691,78: 77.21839399999999,79: 77.2220327,80: 77.2209478,81: 77.21944470000001,82: 77.2184585,83: 77.21694120000001,84: 77.2218328,85: 77.2207949,86: 77.2192157,87: 77.2160817,88: 77.21834040000002,89: 77.2208473,90: 77.2225785,92: 77.1659981,95: 77.16558959999999,96: 77.151374,99: 77.1509815}}

我尝试了各种选择:

  1. 创建上述数据帧的副本并将其与自身合并,并计算半正弦距离。计算距离后,获取彼此之间距离最大的站点

在这里,如果有一个站点与其他站点相距很远,我必须选择所有彼此距离较近但距离该特定站点较远的站点

def haversine(lon1,lat1,lon2,lat2):
        lon1,lat2 = map(radians,[lon1,lat2])
        dlon = lon2 - lon1 
        dlat = lat2 - lat1 
        a = sin(dlat/2)**2 + cos(lat1) * cos(lat2) * sin(dlon/2)**2
        c = 2 * asin(sqrt(a)) 
        r = 6378 # Radius of earth in kilometers
        return c * r
  1. 我还尝试获得位置之间的 ckdNearest 距离,并通过它们的接近程度消除它们,但得到了相同的结果。

     def ckdnearest(gdfA,gdfB,gdfB_cols=['id']):
             gdfA = gdfA.reset_index(drop=True)
             gdfB = gdfB.reset_index(drop=True)
             A = np.concatenate([np.array(geom.coords) for geom in gdfA.geometry.to_list()])
             B = [np.array(geom.coords) for geom in gdfB.geometry.to_list()]
             B_ix = tuple(itertools.chain.from_iterable([itertools.repeat(i,x) for i,x in enumerate(list(map(len,B)))]))
             B = np.concatenate(B)
             ckd_tree = cKDTree(B)
             dist,idx = ckd_tree.query(A,k=1)
             idx = itemgetter(*idx)(B_ix)
             gdf = pd.concat([gdfA,gdfB.loc[idx,gdfB_cols].reset_index(drop=True),pd.Series(dist,name='dist')],axis=1)
             return gdf
    

    gdf1 = gpd.GeoDataFrame(df1,geometry=gpd.points_from_xy(df1.longitude,df1.latitude)) gdf2 = gpd.GeoDataFrame(df2,geometry=gpd.points_from_xy(df2.longitude,df2.latitude)) #gdf1的副本 nn = ckdnearest(gdf1,gdf2)

如何选择遍布整个城市的地点?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?