Python位置,显示距最近其他位置的距离

2023-11-24

我是数据框中的一个位置,位于经纬度列名称下方。我想在单独的数据框中显示距离最近火车站的经纬度有多远。

例如,我有一个经纬度(37.814563 144.970267),并且我有一个其他地理空间点的列表如下。我想找到最近的点,然后找到这些点之间的距离,作为郊区数据框中的额外列。

这是训练数据集的示例

<bound method NDFrame.to_clipboard of   STOP_ID                                          STOP_NAME   LATITUDE  \
0   19970             Royal Park Railway Station (Parkville) -37.781193   
1   19971  Flemington Bridge Railway Station (North Melbo... -37.788140   
2   19972         Macaulay Railway Station (North Melbourne) -37.794267   
3   19973   North Melbourne Railway Station (West Melbourne) -37.807419   
4   19974        Clifton Hill Railway Station (Clifton Hill) -37.788657   

    LONGITUDE TICKETZONE                                          ROUTEUSSP  \
0  144.952301          1                                            Upfield   
1  144.939323          1                                            Upfield   
2  144.936166          1                                            Upfield   
3  144.942570          1  Flemington,Sunbury,Upfield,Werribee,Williamsto...   
4  144.995417          1                                 Mernda,Hurstbridge   

                      geometry  
0  POINT (144.95230 -37.78119)  
1  POINT (144.93932 -37.78814)  
2  POINT (144.93617 -37.79427)  
3  POINT (144.94257 -37.80742)  
4  POINT (144.99542 -37.78866)  >

这是郊区的一个例子

<bound method NDFrame.to_clipboard of       postcode              suburb state        lat         lon
4901      3000           MELBOURNE   VIC -37.814563  144.970267
4902      3002      EAST MELBOURNE   VIC -37.816640  144.987811
4903      3003      WEST MELBOURNE   VIC -37.806255  144.941123
4904      3005  WORLD TRADE CENTRE   VIC -37.822262  144.954856
4905      3006           SOUTHBANK   VIC -37.823258  144.965926>

我试图在郊区列表的新列中展示从经纬度到最近火车站的距离。

使用解决方案得到奇怪的输出,想知道它是否正确?

两种解决方案均已显示,

from sklearn.neighbors import NearestNeighbors
from haversine import haversine

NN = NearestNeighbors(n_neighbors=1, metric='haversine')
NN.fit(trains_shape[['LATITUDE', 'LONGITUDE']])

indices = NN.kneighbors(df_complete[['lat', 'lon']])[1]
indices = [index[0] for index in indices]
distances = NN.kneighbors(df_complete[['lat', 'lon']])[0]
df_complete['closest_station'] = trains_shape.iloc[indices]['STOP_NAME'].reset_index(drop=True)
df_complete['closest_station_distances'] = distances
print(df_complete)

这里的输出,

<bound method NDFrame.to_clipboard of    postcode        suburb state        lat         lon  Venues Cluster  \
1      3040    aberfeldie   VIC -37.756690  144.896259             4.0   
2      3042  airport west   VIC -37.711698  144.887037             1.0   
4      3206   albert park   VIC -37.840705  144.955710             0.0   
5      3020        albion   VIC -37.775954  144.819395             2.0   
6      3078    alphington   VIC -37.780767  145.031160             4.0   

                     #1                    #2             #3  \
1                  Café     Electronics Store  Grocery Store   
2  Fast Food Restaurant                  Café    Supermarket   
4                  Café                   Pub    Coffee Shop   
5                  Café  Fast Food Restaurant  Grocery Store   
6                  Café                  Park            Bar   

                      #4  ...                             #6  \
1            Coffee Shop  ...                         Bakery   
2          Grocery Store  ...             Italian Restaurant   
4         Breakfast Spot  ...                   Burger Joint   
5  Vietnamese Restaurant  ...                            Pub   
6            Pizza Place  ...  Vegetarian / Vegan Restaurant   

                      #7                   #8                         #9  \
1          Shopping Mall  Japanese Restaurant          Indian Restaurant   
2  Portuguese Restaurant    Electronics Store  Middle Eastern Restaurant   
4                    Bar               Bakery                  Gastropub   
5     Chinese Restaurant                  Gym                     Bakery   
6     Italian Restaurant            Gastropub                     Bakery   

                 #10 Ancestry Cluster  ClosestStopId  \
1   Greek Restaurant              8.0          20037   
2  Convenience Store              5.0          20032   
4              Beach              6.0          22180   
5  Convenience Store              5.0          20004   
6        Coffee Shop              5.0          19931   

                                   ClosestStopName  \
1              Essendon Railway Station (Essendon)   
2                Glenroy Railway Station (Glenroy)   
4  Southern Cross Railway Station (Melbourne City)   
5          Albion Railway Station (Sunshine North)   
6          Alphington Railway Station (Alphington)   

                                   closest_station closest_station_distances  
1                Glenroy Railway Station (Glenroy)                  0.019918  
2  Southern Cross Railway Station (Melbourne City)                  0.031020  
4          Alphington Railway Station (Alphington)                  0.023165  
5                  Altona Railway Station (Altona)                  0.005559  
6                Newport Railway Station (Newport)                  0.002375  

还有第二个功能。

def ClosestStop(r):
    # Cartesin Distance: square root of (x2-x2)^2 + (y2-y1)^2
    distances = ((r['lat']-StationDf['LATITUDE'])**2 + (r['lon']-StationDf['LONGITUDE'])**2)**0.5
    
    # Stop with minimum Distance from the Suburb
    closestStationId = distances[distances == distances.min()].index.to_list()[0]
    return StationDf.loc[closestStationId, ['STOP_ID', 'STOP_NAME']]

df_complete[['ClosestStopId', 'ClosestStopName']] = df_complete.apply(ClosestStop, axis=1)

这给出了不同的答案,这很奇怪,让我认为这段代码有问题。 KM 似乎也错了。

完全不确定如何解决这个问题 - 希望在这里得到一些指导,谢谢!


几个关键概念

  1. 在两个数据帧之间进行笛卡尔积以获得所有组合(在两个数据帧之间加入相同值是解决此问题的方法foo=1)
  2. 一旦两组数据在一起,就用两组纬度/经度来计算距离)geopy已用于此目的
  3. 清理列,使用sort_values()找到最小距离
  4. 最后一个groupby() and agg() to get first最短距离值

有两个数据框可供使用

  1. dfdist包含所有组合和距离
  2. dfnearest其中包含结果
dfstat = pd.DataFrame({'STOP_ID': ['19970', '19971', '19972', '19973', '19974'],
 'STOP_NAME': ['Royal Park Railway Station (Parkville)',
  'Flemington Bridge Railway Station (North Melbo...',
  'Macaulay Railway Station (North Melbourne)',
  'North Melbourne Railway Station (West Melbourne)',
  'Clifton Hill Railway Station (Clifton Hill)'],
 'LATITUDE': ['-37.781193',
  '-37.788140',
  '-37.794267',
  '-37.807419',
  '-37.788657'],
 'LONGITUDE': ['144.952301',
  '144.939323',
  '144.936166',
  '144.942570',
  '144.995417'],
 'TICKETZONE': ['1', '1', '1', '1', '1'],
 'ROUTEUSSP': ['Upfield',
  'Upfield',
  'Upfield',
  'Flemington,Sunbury,Upfield,Werribee,Williamsto...',
  'Mernda,Hurstbridge'],
 'geometry': ['POINT (144.95230 -37.78119)',
  'POINT (144.93932 -37.78814)',
  'POINT (144.93617 -37.79427)',
  'POINT (144.94257 -37.80742)',
  'POINT (144.99542 -37.78866)']})
dfsub = pd.DataFrame({'id': ['4901', '4902', '4903', '4904', '4905'],
 'postcode': ['3000', '3002', '3003', '3005', '3006'],
 'suburb': ['MELBOURNE',
  'EAST MELBOURNE',
  'WEST MELBOURNE',
  'WORLD TRADE CENTRE',
  'SOUTHBANK'],
 'state': ['VIC', 'VIC', 'VIC', 'VIC', 'VIC'],
 'lat': ['-37.814563', '-37.816640', '-37.806255', '-37.822262', '-37.823258'],
 'lon': ['144.970267', '144.987811', '144.941123', '144.954856', '144.965926']})

import geopy.distance
# cartesian product so we get all combinations
dfdist = (dfsub.assign(foo=1).merge(dfstat.assign(foo=1), on="foo")
    # calc distance in km between each suburb and each train station
     .assign(km=lambda dfa: dfa.apply(lambda r: 
                                      geopy.distance.geodesic(
                                          (r["LATITUDE"],r["LONGITUDE"]), 
                                          (r["lat"],r["lon"])).km, axis=1))
    # reduce number of columns to make it more digestable
     .loc[:,["postcode","suburb","STOP_ID","STOP_NAME","km"]]
    # sort so shortest distance station from a suburb is first
     .sort_values(["postcode","suburb","km"])
    # good practice
     .reset_index(drop=True)
)
# finally pick out stations nearest to suburb
# this can easily be joined back to source data frames as postcode and STOP_ID have been maintained
dfnearest = dfdist.groupby(["postcode","suburb"])\
    .agg({"STOP_ID":"first","STOP_NAME":"first","km":"first"}).reset_index()

print(dfnearest.to_string(index=False))
dfnearest

output

postcode              suburb STOP_ID                                         STOP_NAME        km
    3000           MELBOURNE   19973  North Melbourne Railway Station (West Melbourne)  2.564586
    3002      EAST MELBOURNE   19974       Clifton Hill Railway Station (Clifton Hill)  3.177320
    3003      WEST MELBOURNE   19973  North Melbourne Railway Station (West Melbourne)  0.181463
    3005  WORLD TRADE CENTRE   19973  North Melbourne Railway Station (West Melbourne)  1.970909
    3006           SOUTHBANK   19973  North Melbourne Railway Station (West Melbourne)  2.705553

一种减少测试组合大小的方法

# pick nearer places,  based on lon/lat then all combinations
dfdist = (dfsub.assign(foo=1, latr=dfsub["lat"].round(1), lonr=dfsub["lon"].round(1))
          .merge(dfstat.assign(foo=1, latr=dfstat["LATITUDE"].round(1), lonr=dfstat["LONGITUDE"].round(1)), 
                 on=["foo","latr","lonr"])
    # calc distance in km between each suburb and each train station
     .assign(km=lambda dfa: dfa.apply(lambda r: 
                                      geopy.distance.geodesic(
                                          (r["LATITUDE"],r["LONGITUDE"]), 
                                          (r["lat"],r["lon"])).km, axis=1))
    # reduce number of columns to make it more digestable
     .loc[:,["postcode","suburb","STOP_ID","STOP_NAME","km"]]
    # sort so shortest distance station from a suburb is first
     .sort_values(["postcode","suburb","km"])
    # good practice
     .reset_index(drop=True)
)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python位置,显示距最近其他位置的距离 的相关文章

随机推荐

  • 将数组排序到索引数组指定的容器中的最有效方法?

    任务举例 data np array 1 2 3 4 5 6 7 8 9 idx np array 2 0 1 1 2 0 1 1 2 预期结果 binned np array 2 6 3 4 7 8 1 5 9 限制条件 应该很快 应该O
  • 如何防止 MFMailComposeViewController 取消时崩溃?

    某处 if MFMailComposeViewController canSendMail MFMailComposeViewController email vc MFMailComposeViewController alloc ini
  • 使用 parsley.js 异步提交表单

    我正在尝试创建一个使用 Parsley js 验证前端并异步提交的表单 该表单称为 contactForm 提交按钮是 sendData 当我在空或无效表单上点击 提交 时 就会出现错误 我希望看到来自无效表单数据的 错误 警报 但它只是继
  • 如何测试另一个安装是否已在进行中?

    假设我正在尝试在 Windows 上自动安装某些内容 并且我想在尝试安装之前尝试测试是否正在进行另一个安装 我无法控制安装程序 必须在自动化框架中执行此操作 有没有更好的方法来做到这一点 一些 win32 api 而不只是测试 msiexe
  • 如何使用 Typescript 的声明与从模块导入的接口合并?

    https www typescriptlang org docs handbook declaration merging html 上面的链接提供了有关声明与接口合并的信息 我希望能够使用具有通用组件的界面来做到这一点 我目前正在使用
  • .NET 中的全局与单例

    我这里有一个很常见的情况 多年来 我一直没有发现我所做的事情是否符合行业标准 考虑一个连接到数据库的应用程序 但连接字符串不是存储在某些文件 设置中 而是作为命令行参数传递在启动时或在应用程序启动时浏览数据库 那么有必要将该连接字符串保存在
  • AppBarLayout 与嵌套片段中的 recyclerView

    由于图像总是比文字更好 我向您展示我当前的布局 工具栏 选项卡位于带有 viewPager 的 Activity xml 中 而 recyclerView 位于 viewPager 内的片段内 因此您可以向右 向左滑动来查看其他内容 我的问
  • 如何确定二进制字符串的统计随机性?

    如何确定二进制字符串的统计随机性 因此 我如何编写自己的测试 并返回与统计随机性相对应的单个值 即 0 到 1 0 之间的值 0 不是随机的 1 0 是随机的 该测试需要适用于任何大小的二进制字符串 当您使用笔和纸执行此操作时 您可能会探索
  • 什么时候调用临时的析构函数

    我想知道 C 03 和 C 11 何时调用临时的析构函数 假设我有以下情况 foo method foo f return foo void doSomething foo f method 假设我正在使用标志 fno elide cons
  • 如何以编程方式添加导航控制器?

    我使用下面的代码 但它没有加载 UIStoryboard storyboard UIStoryboard storyboardWithName Main bundle nil self mapViewController storyboar
  • 删除所有项目后组合框尺寸问题

    我的应用程序包含一个组合框 用户可以从中删除项目 当程序启动时 它会从配置文件中读取的字符串列表填充组合框 这是添加项目的代码 version list is an array of strings foreach string versi
  • 解释 Haskell 中的类型类

    我是一名 C Java 程序员 我在日常编程中碰巧使用的主要范例是 OOP 在某些线程中 我读到一条评论说 Type 类本质上比 OOP 更直观 有人可以用简单的语言解释类型类的概念 以便像我这样的 OOP 人员能够理解它吗 首先 我总是对
  • ExtJs手动触发Click事件,按钮参数与鼠标单击不同

    所以 我有一个登录控制器 你可以用鼠标单击登录或按 Enter 键 如下所示 Ext define My controller Login extend Ext app Controller init function applicatio
  • 使用节点将Token保存在本地存储中

    我正在使用智威汤逊 jsonwebtoken 5 4 0 与快递4和翡翠 我能够创建正确的令牌 但是如何在每次调用中传递此令牌 我必须在哪里存储这个令牌 在标头中还是在本地存储中 现在我将 CURL 与 Postman 一起使用 并在标头中
  • 有什么方法可以知道 Jersey @__Param fromString 处理程序中正在解析哪个参数?

    我正在使用的 API 决定接受 UUID 作为 Base32 编码字符串 而不是标准的十六进制 破折号分隔的格式UUID fromString 期望 这意味着我不能简单地写 QueryParam UUID myUuid作为方法参数 因为转换
  • 从多个位置创建脚本包

    假设我们的应用程序处于离线状态 即我们无法使用第 3 方 CDN 因此我们正在创建自己的 CDN 我想将所有供应商脚本托管在一个单独的 父级 Web 应用程序中 然后将它们包含在其他几个 MVC 应用程序的捆绑包中 e g http loc
  • 达到 MaximumFileSize 时的 log4net 滚动文件附加器文件名格式

    我们使用 log4net 滚动文件附加器 并且对日志文件有以下要求 每天开始时的新日志文件 文件名中包含日期 最大日志文件大小为 500KB 我们遇到的问题是当文件达到 500KB 时的文件命名策略 它们被重命名为 1后缀 这是有问题的 因
  • 以编程方式启用/禁用连接

    在 Windows 7 上 我可以通过网络连接管理器面板 在系统设置中 启用和禁用连接 我如何在 C 中以编程方式执行此操作 谢谢 您可以通过利用 WMI 和 Win32 NetworkAdapter WMI 类在 C 中实现此目的 Win
  • 为什么变异风格被弃用?

    0 13 和 0 14 中的文档都警告说变异样式已被弃用 但没有提及原因 不推荐在渲染之间重用和改变样式对象 如果我想对基于 css 类的动画无法处理的元素执行依赖于状态的动画 我该怎么办 每次都克隆对象 新反应 非常感谢帮助和建议 您可以
  • Python位置,显示距最近其他位置的距离

    我是数据框中的一个位置 位于经纬度列名称下方 我想在单独的数据框中显示距离最近火车站的经纬度有多远 例如 我有一个经纬度 37 814563 144 970267 并且我有一个其他地理空间点的列表如下 我想找到最近的点 然后找到这些点之间的