вот решение для проверки: идея состоит в том, чтобы перехватить все точки над линией.Вы выбираете значение P, чтобы выбрать правильную линию.
from random import uniform
import matplotlib.pyplot as plt
def newpoint(lon_min = -180.0, lon_max = 180.0, lat_min = -90.0, lat_max = 90.0 ):#long,lat
return uniform(lon_min, lon_max), uniform(lat_min, lat_max)
lon_min = 23.568626549485927; lon_max = 23.71481685393929
lat_min = 66.27832887852133; lat_max = 66.37098470528755
p = 0.25 # i have taken this value for sample, for your case i think a value nearer from 0.75
# i generate 10 points for sample
n=10
points = (newpoint(lon_min, lon_max, lat_min, lat_max) for x in range(n))
points = [x for x in points]
Lon = [x for x,y in points]
Lat = [x for y,x in points]
df = pd.DataFrame({'Lat': Lat, 'Lon': Lon})
print(df)
#equation of the line using points A and B -> y=m*x + z
m = (lat_max - lat_min)/(lon_max - lon_min)
z = lat_min - m * (lon_min + p * (lon_max - lon_min))
xa = lon_min + p * (lon_max - lon_min)
xb = lon_max
#you could uncomment to display result
#df['calcul'] = df['Lon'] * m + z
#select only points above the line
df = df[df['Lon'] * m + z < df['Lat']]
print(df)
#plot to show result
plt.plot([xa, xb] , [m * xa + z, m * xb + z])
plt.plot(df.Lon, df.Lat, 'ro')
plt.show()
Начальный выход:
Lat Lon
0 66.343486 23.674008
1 66.281614 23.678554
2 66.359215 23.637975
3 66.303976 23.659128
4 66.302640 23.589577
5 66.313877 23.634785
6 66.309733 23.683281
7 66.365582 23.667262
8 66.344611 23.688108
9 66.352028 23.673376
окончательный результат: точки индекса 1, 3 и 6 были сняты (они находятся ниже линии)
Lat Lon
0 66.343486 23.674008
2 66.359215 23.637975
4 66.302640 23.589577
5 66.313877 23.634785
7 66.365582 23.667262
8 66.344611 23.688108
9 66.352028 23.673376