У меня есть 2 набора данных. Один с координатами точками различных транспортных средств (vehicledata
) и еще одна с координатами точек, каждый из которых присвоенной области (sublap
данные). Я хочу классифицировать транспортные средства по регионам. Однако есть некоторые координаты транспортных средств, которые не относятся к данным региона. Я хотел бы по-прежнему иметь возможность классифицировать эти точки, назначая область, связанную со следующим ближайшим значением lat/lon, к этим координатам. Любые идеи о том, как это сделать с моим существующим скриптом python?
vehicledata = pd.read_csv('ParkingChargingBlocks.csv')
sublapdata = pd.read_csv('location_to_pnode_sublap.csv')
VID = vehicledata['VID'].values #j
lat_v = vehicledata['lat'].values
lon_v = vehicledata['lon'].values
sublap = sublapdata['sublap'].values #i
lat_s = sublapdata['latitude'].values
lon_s = sublapdata['longitude'].values
with open('locations_with_sublap.csv', 'w') as csvfile:
fieldnames = ['VID', 'lat', 'lon', 'sublap']
writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
writer.writeheader()
for j in range (0, len(lat_v)):
for i in range(0, len(lat_s)):
if lat_v[j] == lat_s[i] and lon_v[j] == lon_s[i]:
print (lat_v[j], lon_v[j], sublap[i])
writer.writerow({"VID": VID[j], "lat": lat_v[j], "lon": lon_v[i], "sublap": sublap[i]})
Использование scipy.spatial.KDTree может быть чрезмерным:
kd-дерево для быстрого поиска ближайших соседей
Этот класс предоставляет индекс в набор k-мерных точек, которые можно использовать для быстрого поиска ближайших соседей любой точки.
import numpy as np
from scipy.spatial import KDTree
VID = ['va', 'vb', 'vc']
lat_v = [1.2, 9.5, 1.4]
lon_v = [3.1, 2.4, 2.2]
sublap = ['a', 'b', 'c']
lat_s = [1, 7, 9]
lon_s = [3, 5, 1]
latlon_v = np.vstack([lat_s, lon_s]).T
findNearestRegion = KDTree(latlon_v).query
dist_idx = [ findNearestRegion(coords) for coords in zip(lat_v, lon_v) ]
for vehicle_id, (distance, index) in enumerate(dist_idx):
print(VID[vehicle_id], sublap[index], distance)
Который дает:
va a 0.22360679774997896
vb c 1.4866068747318506
vc a 0.8944271909999156
Это расстояние до ближайшей станции (или региона).
lat_s
иlon_s
, может быть, он пуст?