0

我在为工作项目编写代码方面需要帮助。我编写了一个使用熊猫读取 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")
4

1 回答 1

0

您的 while 循环看起来很不稳定。您只设置 j 一次,在循环之外。另外,我认为您想要一个线段列表。你想要这样的东西吗?

i = 0
segment = 0
locations = []
while i < len(lat):
    locations[segment] = []  # start a new segment

    # add points to the current segment until all are 
    # consumed or a disconnect is detected
    while i < len(lat):
        locations[segment].append((lat[i], lon[i]))
        i += 1
        j = (lat[i] - lat[i - 1])
        if abs(j) > 0.01:
            break
    segment += 1

完成locations后将是一个段列表,例如;

 [ segment0, segment1, ..... ]

每个段将是一个点列表,例如;

 [ (lat,lon), (lan,lon), ..... ]
于 2016-09-22T19:22:46.793 回答