我在为工作项目编写代码方面需要帮助。我编写了一个使用熊猫读取 excel 文件的脚本。我编写了一个while循环来遍历每一行并将excel文件中的纬度/经度数据附加到地图上(Folium,Open Street Map)
我遇到的问题与 GPS 数据有关。我下载了一个带有车辆坐标的 CVS 文件。在我正在跟踪的一些车辆上,无论出于何种原因,GPS 都会丢失信号,并且在数百英里内都没有恢复在线。当我使用线图来跟踪地图上的车辆运动时,这会导致问题。由于 Folium 试图在车辆下线之前连接上一个 GPS 坐标,因此我最终会在城市之间穿出长长的直线,一旦车辆重新上线,下一个 GPS 坐标就可用,这可能在数百英里之外,如此处所示. 我认为,如果每次脚本在 GPS 坐标中发现间隙,我可以生成一个新循环,该循环基本上会开始一个全新的线图并将其附加到现有地图。这样,我仍然应该在地图上看到整条车辆路线,但没有试图将断点连接在一起的长线。
我的想法是让我的脚本计算每次经度数据迭代之间的绝对值差。如果每个点之间的差异大于 0.01,我希望我的程序结束循环并开始一个新循环。然后这个新循环需要有新的变量 init。我不知道需要创建多少个新循环,因为无法预测 GPS 将在每辆车中离线/在线多少次。
https://gist.github.com/tapanojum/81460dd89cb079296fee0c48a3d625a7
import folium
import pandas as pd
# Pulls CSV file from this location and adds headers to the columns
df = pd.read_csv('Example.CSV',names=['Longitude', 'Latitude',])
lat = (df.Latitude / 10 ** 7) # Converting Lat/Lon into decimal degrees
lon = (df.Longitude / 10 ** 7)
zoom_start = 17 # Zoom level and starting location when map is opened
mapa = folium.Map(location=[lat[1], lon[1]], zoom_start=zoom_start)
i = 0
j = (lat[i] - lat[i - 1])
location = []
while i < len(lat):
if abs(j) < 0.01:
location.append((lat[i], lon[i]))
i += 1
else:
break
# This section is where additional loops would ideally be generated
# Line plot settings
c1 = folium.MultiPolyLine(locations=[location], color='blue', weight=1.5, opacity=0.5)
c1.add_to(mapa)
mapa.save(outfile="Example.html")
这是我想如何完成此操作的伪代码。
1) Python 读取 csv
2) 将 Long/Lat 转换为十进制度
3)初始化位置1
4) 运行 while 循环以附加坐标
5) 如果 abs(j) >= 0.01,则中断循环
6) 初始化位置(2,3,...)
7) 生成新的 while i < len(lat): loop using location(2,3,...)
9) 在 i < len(lat) 时重复步骤 5-7(重复次数与 abs(j) >= 0.01 的实例一样多))
10) 为每个位置变量创建 (c1, c2, c3,...) = folium.MultiPolyLine(locations=[location], color='blue', weight=1.5, opacity=0.5)
11) 为上面列出的每个 c1,c2,c3... 创建 c1.add_to(mapa)
12)mapa.save
任何帮助将不胜感激!
更新: 工作解决方案
import folium
import pandas as pd
# Pulls CSV file from this location and adds headers to the columns
df = pd.read_csv(EXAMPLE.CSV',names=['Longitude', 'Latitude'])
lat = (df.Latitude / 10 ** 7) # Converting Lat/Lon into decimal degrees
lon = (df.Longitude / 10 ** 7)
zoom_start = 17 # Zoom level and starting location when map is opened
mapa = folium.Map(location=[lat[1], lon[1]], zoom_start=zoom_start)
i = 1
location = []
while i < (len(lat)-1):
location.append((lat[i], lon[i]))
i += 1
j = (lat[i] - lat[i - 1])
if abs(j) > 0.01:
c1 = folium.MultiPolyLine(locations=[location], color='blue', weight=1.5, opacity=0.5)
c1.add_to(mapa)
location = []
mapa.save(outfile="Example.html")