代码之家  ›  专栏  ›  技术社区  ›  ScalaBoy

如何检查点是否在给定半径内?

  •  0
  • ScalaBoy  · 技术社区  · 6 年前

    我有以下代码需要很长时间才能执行。熊猫数据帧 df df_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)
    

    因为这些值包含一些应该删除的错误(字符)。

    is_inside_radius 验证是否 row[latitude] row[longitude] 在距离地球上任何一个点10公里的半径范围内 df\U工厂 .

    2 回复  |  直到 6 年前
        1
  •  2
  •   Dominique    6 年前


    想象:
    有一个圆,由Mx和My(中心坐标)以及R(半径)定义。
    有一个点,由X和Y坐标定义。


    function is_inside(X,Y,Mx,My,R):
      if (abs(Mx-X) >= R) OR (abs(My-Y) >= R)
      then return false
      else:
        // and only here you perform the floating point calculation
    
        2
  •  1
  •   yoonghm    5 年前

    你能试试这个吗?

    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-iterrows pandas.DataFrame.itertuples() pandas.DataFrame.iterrows() ,并跨返回的行保留数据类型。