2016-09-22 8 views
0

Мне нужна помощь в написании кода для рабочего проекта. Я написал скрипт, который использует pandas для чтения файла excel. У меня есть цикл while, написанный для повторения каждой строки и добавления данных широты/долготы из файла excel на карту (Folium, Open Street Map)Нужна помощь при написании кода, который автоматически напишет больше кода?

Проблема, с которой я столкнулся, связана с данными GPS , Я загружаю файл CVS с координатами автомобиля. На некоторых транспортных средствах, которые я отслеживаю, GPS теряет сигнал по любой причине и не возвращается в сети на сотни миль. Это вызывает проблемы, когда я использую линейные графики для отслеживания движения транспортного средства на карте. В конечном итоге я получаю длинные прямые линии, проходящие по городам, так как Folium пытается подключить последнюю координату GPS до того, как автомобиль перейдет в автономный режим, со следующей координатой GPS, доступной после того, как автомобиль снова подключен к сети, который может находиться на расстоянии в сотни миль от shown here. Я думаю, что если каждый раз, когда скрипт находит пробел в 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) Преобразование Длинные/Lat в десятичных градусах

3) Иниц LOCATION1

4) проходит в то время как петля для добавления Coords

5) Если абс (j)> = 0,01, петля разрыва

6) Место начала (2,3, ...)

7) Создает новый, пока я < Len (лат): цикл с использованием местоположения (2,3, ...)

9) Повтор шаг 5-7, а я < Len (лат) (Повторить столько раз, сколько есть экземпляры abs (j)> = 0,01))

10) Creats (c1, c2, c3, ...) = folium.MultiPolyLine (location = [location], color = 'blue', weight = 1,5, непрозрачность = 0,5) для каждой переменной местоположения

11) Создает c1.add_to (MAPA) для каждого c1, c2, c3, ..., перечисленных выше

12) mapa.save

Любая помощь будет чрезвычайно оценена!

UPDATE: Рабочий раствор

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") 
+0

Вы должны переместить свой код на вопрос. А также фрагменты кода предпочтительно хранятся в [Gist Github] (https://gist.github.com/) –

+0

Пожалуйста, разместите код в вопросе. В противном случае, когда вы удаляете код из Github, этот вопрос становится бесполезным для всех остальных. – CAB

+0

Это кажется невозможным, как указано. Если GPS отключен, у вас нет промежуточных точек, с помощью которых можно объединить маршрут? Ваш второй цикл будет слеп к любым реальным данным. Если вы используете OSM, используйте graphhopper или что-то подобное, чтобы заполнить пробелы? Вы останетесь с предположением, что водитель прошел через все узлы маршрута графического купега – roganjosh

ответ

0

Ваш цикл в то время как выглядит шатким. Вы устанавливаете 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), ..... ] 
+0

А, это так много! Единственное, чего не хватает, это вторая часть. Для каждого сегмента мне нужна линейный выход с указанием: графа [сегмент] = folium.MultiPolyLine (места = [местоположение [сегмент]], цвет = 'синяя', вес = 3, непрозрачность = 0,5) I» я собираюсь попробовать эту вторую часть сейчас, но все же готов принять помощь! Еще раз спасибо за помощь. Я нашел себя в новой работе, работающей с кодом, хотя у меня есть 0 CS-фона. Попытка обернуть мою голову обо всем этом. – Tappy

+0

Я не знаком с фолиевым, но я замечаю, что у них есть как полилиния, так и методы multipolyline.Я думаю, что «multipolyline» может делать именно то, что вам нужно, – CAB

+0

Да, вы правы в мультиполилинии. Я обновил сообщение, чтобы показать рабочее решение. – Tappy