Карта покрытия 3g - визуализируйте широту, длину, данные пинга - PullRequest
4 голосов
/ 09 февраля 2012

Предположим, что я ехал по заданному маршруту с 3g модемом и GPS на своем ноутбуке, в то время как мой компьютер дома записывает задержку пинга. Я связал пинг с широтой / долготой GPS, и теперь я хотел бы визуализировать эти данные.

У меня есть около 80 000 точек данных в день, и я хотел бы показать стоимость за несколько месяцев. Меня особенно интересует отображение областей, в которых время пинга постоянно истекает (т. Е. Пинг == 1000).

Точечный график

Моя первая попытка была с точечной диаграммой, с одной точкой на ввод данных. Я увеличил размер точки в 5 раз, если это был тайм-аут, поэтому было очевидно, где находятся эти области. Я также снизил альфа до 0,1, чтобы грубо увидеть наложенные точки.

# Colour
c = pings 
# Size
s = [2 if ping < 1000 else 10 for ping in pings]
# Scatter plot
plt.scatter(longs, lats, s=s, marker='o', c=c, cmap=cm.jet, edgecolors='none', alpha=0.1)

Scatter plot

Очевидная проблема с этим состоит в том, что он отображает один маркер для каждой точки данных, что является очень плохим способом отображения больших объемов данных. Если я дважды проезжал одну и ту же область, данные первого прохода просто отображаются поверх второго прохода.

Интерполяция по четной сетке

Затем я попытался использовать numpy и scipy для интерполяции по четной сетке.

# Convert python list to np arrays
x = np.array(longs, dtype=float)
y = np.array(lats, dtype=float)
z = np.array(pings, dtype=float)

# Make even grid (200 rows/cols)
xi = np.linspace(min(longs), max(longs), 200)
yi = np.linspace(min(lats), max(lats), 200)

# Interpolate data points to grid
zi = griddata((x, y), z, (xi[None,:], yi[:,None]), method='linear', fill_value=0)

# Plot contour map
plt.contour(xi,yi,zi,15,linewidths=0.5,colors='k')
plt.contourf(xi,yi,zi,15,cmap=plt.cm.jet)

С этот пример

Это выглядит интересно (много цветов и форм), но оно экстраполирует слишком далеко вокруг областей, которые я не исследовал. Вы не можете видеть маршруты, которые я прошел, только красные / синие пятна.

Если я проехал большую кривую, он будет интерполироваться для области между (см. Ниже):

Interpolation problems

интерполировать по неровной сетке

Затем я попытался использовать meshgrid (xi, yi = np.meshgrid(lats, longs)) вместо фиксированной сетки, но мне сказали, что мой массив слишком большой.

Есть ли простой способ создать сетку из моих точек?


Мои требования:

  • Обработка больших наборов данных (80 000 x 60 = ~ 5 м точек)
  • Отображение дублированных данных для каждой точки путем усреднения (я полагаю, что интерполяция сделает это) или путем принятия минимального значения для каждой точки.
  • Не экстраполировать слишком далеко от точек данных

Я доволен точечной диаграммой (вверху), но мне нужен какой-то способ усреднения данных перед их отображением.

(извинения за изворотливые рисунки MSPaint, я не могу загрузить фактические данные)


Решение:

# Get sum
hsum, long_range, lat_range = np.histogram2d(longs, lats, bins=(res_long,res_lat), range=((a,b),(c,d)), weights=pings)
# Get count
hcount, ignore1, ignore2 = np.histogram2d(longs, lats, bins=(res_long,res_lat), range=((a,b),(c,d)))
# Get average
h = hsum/hcount
x, y = np.where(h)
average = h[x, y]
# Make scatter plot
scatterplot = ax.scatter(long_range[x], lat_range[y], s=3, c=average, linewidths=0, cmap="jet", vmin=0, vmax=1000)

Ответы [ 2 ]

2 голосов
/ 10 февраля 2012

Чтобы упростить ваш вопрос, у вас есть два набора точек, один для пинга <1000, один для пинга> = 1000.Так как количество точек очень велико, вы не можете построить их напрямую с помощью scatter ().Я создал несколько примеров данных:

longs = (np.random.rand(60, 1) + np.linspace(-np.pi, np.pi, 80000)).reshape(-1)
lats = np.sin(longs) + np.random.rand(len(longs)) * 0.1

bad_index = (longs>0) & (longs<1)
bad_longs = longs[bad_index]
bad_lats = lats[bad_index]

(longs, lats) - это точки для ping <1000, (bad_longs, bad_lats) - это точки для ping> 1000

. Вы можете использовать numpy.histogram2d () для подсчета очков:

ranges = [[np.min(lats), np.max(lats)], [np.min(longs), np.max(longs)]]
h, lat_range, long_range = np.histogram2d(lats, longs, bins=(400,400), range=ranges)
bad_h, lat_range2, long_range2 = np.histogram2d(bad_lats, bad_longs, bins=(400,400), range=ranges)

h и bad_h - это количество очков в каждой маленькой области скрипа.

Затем вы можете выбрать множество методов для их визуализации.Например, вы можете построить его с помощью scatter ():

y, x = np.where(h)
count = h[y, x]
pl.scatter(long_range[x], lat_range[y], s=count/20, c=count, linewidths=0, cmap="Blues")

count = bad_h[y, x]
pl.scatter(long_range2[x], lat_range2[y], s=count/20, c=count, linewidths=0, cmap="Reds")

pl.show() 

Вот полный код:

import numpy as np
import pylab as pl

longs = (np.random.rand(60, 1) + np.linspace(-np.pi, np.pi, 80000)).reshape(-1)
lats = np.sin(longs) + np.random.rand(len(longs)) * 0.1

bad_index = (longs>0) & (longs<1)
bad_longs = longs[bad_index]
bad_lats = lats[bad_index]

ranges = [[np.min(lats), np.max(lats)], [np.min(longs), np.max(longs)]]
h, lat_range, long_range = np.histogram2d(lats, longs, bins=(300,300), range=ranges)
bad_h, lat_range2, long_range2 = np.histogram2d(bad_lats, bad_longs, bins=(300,300), range=ranges)

y, x = np.where(h)
count = h[y, x]
pl.scatter(long_range[x], lat_range[y], s=count/20, c=count, linewidths=0, cmap="Blues")

count = bad_h[y, x]
pl.scatter(long_range2[x], lat_range2[y], s=count/20, c=count, linewidths=0, cmap="Reds")

pl.show()

Выходное значение:

enter image description here

1 голос
/ 09 февраля 2012

Библиотеки GDAL , включая Python API и связанные с ними утилиты, в частности gdal_grid , должны работать для вас. Он включает в себя ряд методов и опций интерполяции и усреднения для создания сеточных данных из рассеянных точек. Вы должны иметь возможность манипулировать размером ячейки сетки, чтобы получить приятное разрешение.

GDAL обрабатывает несколько форматов данных, но вы должны иметь возможность передавать свои координаты и значения ping как CSV и возвращать PNG или JPEG без особых проблем.

Имейте в виду, что данные широты / долготы не являются плоской системой координат. Если вы намереваетесь объединить свои результаты с другими данными карты, вам необходимо выяснить, какую проекцию карты, единицы измерения и т. Д. Использовать.

...