1

我有一个 4 列的数据框(点名称、纬度、经度和角度)。我正在绘制底图 wrt lat & long 值中的所有点。我编写了一个函数来计算给定点到数据框中所有点的距离,然后过滤掉一定公里半径内的单元格并用不同的颜色突出显示它们。我有以下代码。

import pandas as pd
import numpy as np
import os
      
from mpl_toolkits.basemap import Basemap
import matplotlib.pyplot as plt
margin=0.5
def draw_map(lat_centre, lon_centre,lat, lon, lat1,lon1, marker1, color1, marker2, color2, marker3, color3):
    #margin = 2 # buffer to add to the range
    lat_min = min(lat) - margin
    lat_max = max(lat) + margin
    lon_min = min(lon) - margin
    lon_max = max(lon) + margin

    # create map using BASEMAP
    m = Basemap(llcrnrlon=lon_min,
                llcrnrlat=lat_min,
                urcrnrlon=lon_max,
                urcrnrlat=lat_max,
                lat_0=(lat_max - lat_min)/2,
                lon_0=(lon_max-lon_min)/2,
                projection='merc',
                resolution = 'h',
                area_thresh=10000.,)
    m.drawcoastlines()
    m.drawcountries()
    m.drawstates()
    m.drawmapboundary(fill_color='#46bcec')
    m.fillcontinents(color = 'white',lake_color='#46bcec')
    
    # convert lat and lon to map projection coordinates
   
    
    
    lons, lats = m(lon, lat)
    # plot points as red dots
    m.scatter(lons, lats, marker = marker2, color=color2, zorder=5)
    #print('hi')
    #plt.show()
    #print('hi1')
    lons1, lats1 = m(lon1, lat1)
    # plot filtered points as green dots
    m.scatter(lons1, lats1, marker = marker3, color=color3, zorder=5)

    lons, lats = m(lon_centre, lat_centre)
    # plot centre point as blue dots
    m.scatter(lons, lats, marker = marker1, color=color1, zorder=5)
    
    plt.show()
    



rr=os.getcwd()
df1=pd.read_csv(rr+'\\siteDB.csv')
df=df1[['Parent_Fdn_EUtranCellFDD','Lat','Long']]
df=df.drop_duplicates()
df.index=df.Parent_Fdn_EUtranCellFDD
print(df.index)
import math
def distance_calc(lon1, lat1, lon2, lat2):
    #print(lon1[0], lon2[0])
    lon1, lat1, lon2, lat2 = map(np.radians, [lon1, lat1, lon2, lat2])
    
    dlon = lon2 - lon1
    dlat = lat2 - lat1

    a = np.sin(dlat / 2.0) ** 2 + np.cos(lat1) * np.cos(lat2) * np.sin(dlon / 2.0) ** 2

    c = 2 * np.arcsin(np.sqrt(a))
    km = 6367 * c
    
    return km
def get_distance(lat_1, lng_1, lat_2, lng_2): 
    d_lat = lat_2 - lat_1
    d_lng = lng_2 - lng_1 

    temp = (  
         math.sin(d_lat / 2) ** 2 
       + math.cos(lat_1) 
       * math.cos(lat_2) 
       * math.sin(d_lng / 2) ** 2
    )

    return 6373.0 * (2 * math.atan2(math.sqrt(temp), math.sqrt(1 - temp)))

import time

lat = df['Lat'].values
lon = df['Long'].values
g=len(lat)
def dist(orig, dest=None, ftr_km=None, greater_than=False):
    t1=time.time()
    if dest==None:
        
        d = distance_calc(np.full((g), df.loc[orig, 'Long']), np.full((g), df.loc[orig, 'Lat']), lon, lat)
        if ftr_km !=  None:
            
            df['d'] = pd.Series(d, index=df.index)
            #print (df['Long'],df['Lat'],df['d'])
            if greater_than:
                df1=df[df['d'] > ftr_km]
                t2=time.time()
                print(t2-t1)
                df1.to_excel(rr+'\\{}.xlsx'.format(orig), index=False)
            else:
                
                df1=df[df['d'] < ftr_km]
                t2=time.time()
                print(t2-t1)
                draw_map(df.loc[orig, 'Lat'],df.loc[orig, 'Long'], df['Lat'].values, df['Long'].values,df1['Lat'].values, df1['Long'].values,
                         marker1 = 'o', color1='b', marker2 = '*', color2='y', marker3 = '*', color3='g')
                df1.to_excel(rr+'\\{}.xlsx'.format(orig), index=False)
                
        else:
            df1=df.copy(deep=True)
            df1['d'] = pd.Series(d, index=df.index)
            #print (df1['Long'],df1['Lat'],df1['d'])
            t2=time.time()
            print(t2-t1)
            df1.to_excel(rr+'\\{}.xlsx'.format(orig), index=False)
    else:
        print(df.loc[orig, 'Lat'])
        d = get_distance(df.loc[orig, 'Lat'], df.loc[orig, 'Long'],df.loc[dest, 'Lat'], df.loc[dest, 'Long'])
        
        t2=time.time()
        print(t2-t1)
        

现在我想以某个角度添加一个锥形楔形物,以给定点为中心点,直到我在函数内部给出的相同公里半径。

如果我执行 dist('POINTA', ftr_km=3),我从上面的代码得到的实际结果是

在此处输入图像描述

但我想要一个从蓝点开始的锥形楔形,以一定的角度,比如

在此处输入图像描述

我是 matplotlib 的新手,在此之前我可以找到一些方法来做,此后我被困在我现有的代码中添加楔形。有人可以帮助我如何做到这一点。

或者任何人都可以为我提供解决方案,让我根据 lat long 从输入文件中获取楔形区域下突出显示的所有单元格?

4

0 回答 0