获取指定距离/范围内的积分标签 - Python

2024-04-27 04:25:46 发布

您现在位置:Python中文网/ 问答频道 /正文

我想取在指定距离内的点标签

我已经把样本坐标贴在下面了。点A1到A5是区域,点P1到P30是要提取的点,这些点在距离区域10000米的地方。 为了更好的理解,我粘贴了这张图片。你知道吗

坐标将显示在数据帧中。你知道吗

LABEL   X   Y
A1  704178  2359686
A2  670179  2343883
A3  723439  2346826
A4  718530  2377080
A5  679772  2379091

 LABEL  X   Y
P1  675176  2373313
P2  684905  2378956
P3  675002  2352012
P4  675933  2381910
P5  685268  2364044
P6  673324  2377060
P7  684222  2371631
P8  701418  2356943
P9  700891  2362305
P10 706972  2358842
P11 706904  2364451
P12 721197  2347368
P13 726825  2345518
P14 725521  2351631
P15 721214  2353052
P16 700920  2369710
P17 695029  2365463
P18 715987  2376662
P19 721979  2379020
P20 716318  2379221
P21 673892  2345205
P22 689204  2354791
P23 667520  2347603
P24 673688  2348698
P25 666493  2362489
P26 698172  2350498
P27 720295  2381290
P28 681206  2383585
P29 680696  2377118
P30 695803  2359471

enter image description here

我需要的结果是在下面的格式。你知道吗

Label   Zone
P8  A1
P9  A1
P10 A1
P11 A1
P30 A1
P3  A2
P23 A2
P24 A2
P21 A2
P12 A3
P13 A3
P14 A3
P15 A3
P18 A4
P20 A4
P19 A4
P27 A4
P1  A5
P2  A5
P4  A5
P6  A5
P28 A5
P29 A5
P7  A5

Tags: a2区域距离a1labela3a4a5
1条回答
网友
1楼 · 发布于 2024-04-27 04:25:46

假设以下前言(数据初始化,导入的库):

import numpy as np
import pandas as pd
from scipy.spatial.distance import cdist

zone_data = [['A1', 704178, 2359686], ['A2', 670179, 2343883], ['A3', 723439, 2346826],
        ['A4', 718530, 2377080], ['A5', 679772, 2379091]]

points_data = [['P1 ', 675176, 2373313], ['P2', 684905, 2378956],
        ['P3', 675002, 2352012], ['P4', 675933, 2381910],
        ['P5', 685268, 2364044], ['P6', 673324, 2377060],
        ['P7', 684222, 2371631], ['P8', 701418, 2356943],
        ['P9', 700891, 2362305], ['P10', 706972, 2358842],
        ['P11', 706904, 2364451], ['P12', 721197, 2347368],
        ['P13', 726825, 2345518], ['P14', 725521, 2351631],
        ['P15', 721214, 2353052], ['P16', 700920, 2369710],
        ['P17', 695029, 2365463], ['P18', 715987, 2376662],
        ['P19', 721979, 2379020], ['P20', 716318, 2379221],
        ['P21', 673892, 2345205], ['P22', 689204, 2354791],
        ['P23', 667520, 2347603], ['P24', 673688, 2348698],
        ['P25', 666493, 2362489], ['P26', 698172, 2350498],
        ['P27', 720295, 2381290], ['P28', 681206, 2383585],
        ['P29', 680696, 2377118], ['P30', 695803, 2359471]]

zones = pd.DataFrame(data=zone_data, columns=['LABEL', 'X', 'Y'])
points = pd.DataFrame(data=points_data, columns=['LABEL', 'X', 'Y'])

您可以执行以下操作:

zones = pd.DataFrame(data=zone_data, columns=['LABEL', 'X', 'Y'])
points = pd.DataFrame(data=points_data, columns=['LABEL', 'X', 'Y'])
mask = cdist(points[['X', 'Y']].values, zones[['X', 'Y']].values) < 10000


def zone(x):
    return zones[x].LABEL.values[0] if x.any() else ''


result = points.drop(['X', 'Y'], axis=1)
result['zone'] = np.apply_along_axis(zone, 1, mask)

输出

   LABEL zone
0    P1    A5
1     P2   A5
2     P3   A2
3     P4   A5
4     P5     
5     P6   A5
6     P7   A5
7     P8   A1
8     P9   A1
9    P10   A1
10   P11   A1
11   P12   A3
12   P13   A3
13   P14   A3
14   P15   A3
15   P16     
16   P17     
17   P18   A4
18   P19   A4
19   P20   A4
20   P21   A2
21   P22     
22   P23   A2
23   P24   A2
24   P25     
25   P26     
26   P27   A4
27   P28   A5
28   P29   A5
29   P30   A1

其思想是使用cdist计算点和区域之间的距离,然后过滤掉(使用掩码)10000以上的区域,如果有多个区域低于阈值,则选择第一个区域。如果所有区域都高于阈值,则返回空字符串(请参阅zone函数)。你知道吗

相关问题 更多 >