python - 如何检查一个点是否在给定半径内?

标签 python pandas geopy

我有以下代码,需要很长时间才能执行。 pandas DataFrames dfdf_plants 非常小(小于 1Mb)。我想知道是否有任何方法可以优化这段代码:

import pandas as pd
import geopy.distance
import re

def is_inside_radius(latitude, longitude, df_plants, radius):
    if (latitude != None and longitude != None):
        lat = float(re.sub("[a-zA-Z]", "", str(latitude)))
        lon = float(re.sub("[a-zA-Z]", "", str(longitude)))
        for index, row in df_plants.iterrows():
            coords_1 = (lat, lon)
            coords_2 = (row["latitude"], row["longitude"])
            dist = geopy.distance.distance(coords_1, coords_2).km
            if dist <= radius:
                return 1
    return 0

df["inside"] = df.apply(lambda row: is_inside_radius(row["latitude"],row["longitude"],df_plants,10), axis=1)

我使用正则表达式来处理 df 中的纬度和经度,因为这些值包含一些应该删除的错误(字符)。

函数 is_inside_radius 验证 row[latitude]row[longitude] 是否位于任意点 10 公里半径范围内在df_plants中。

最佳答案

你能试试这个吗?

import pandas as pd
from geopy import distance
import re

def is_inside_radius(latitude, longitude, df_plants, radius):
  if (latitude != None and longitude != None):
    lat = float(re.sub("[a-zA-Z]", "", str(latitude)))
    lon = float(re.sub("[a-zA-Z]", "", str(longitude)))
    coords_1 = (lat, lon)

    for row in df_plants.itertuples():
      coords_2 = (row["latitude"], row["longitude"])
      if distance.distance(coords_1, coords_2).km <= radius:
        return 1
  return 0

df["inside"] = df.map(
                    lambda row: is_inside_radius(
                      row["latitude"],
                      row["longitude"],
                      df_plants,
                      10),
                    axis=1)

来自https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.iterrows.html#pandas-dataframe-iterrowspandas.DataFrame.itertuples()返回值的命名元组,通常比pandas.DataFrame.iterrows()更快,并在返回的行之间保留数据类型。

关于python - 如何检查一个点是否在给定半径内?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52807071/

相关文章:

python - 如何更改 Keras 优化器代码

python - 完全混淆了 GTK、GTK+、GTK+3、PyGobject 等

python - 创建一个 Pandas 表

python - np.argsort 排除零值

python - 我可以在 Python 中使用 geopy 获得海拔高度吗? (带经度/纬度)

python - paramiko 无法打开 SFTP 连接

python - 将数字字符串转换为上标

python - 在 python 中使用 pandas 将关键字与数据框列映射

python - 按道路名称交叉点进行地理编码

python - 自己的 Nominatim 服务器无法与 geopy 一起使用