Вызов метода Javascript из оболочки Google Карт Bokeh (fitBounds ()) - PullRequest
0 голосов
/ 20 июня 2019

У меня есть боке-график карт Google с несколькими точками данных Lat / Lng, и я хотел бы использовать метод fitBounds () API Карт Google v3 для установки уровня масштабирования.

У меня естьGoogle Maps готовится к работе, отображается на моем сайте и показывает точки данных, но мне нужно установить масштаб вручную.

import bokeh.io
import bokeh.models
import bokeh.plotting
import pandas as pd

data = {
    'Latitude [deg]': [18.46, 25.7, 32.3],
    'Longitude [deg]': [-66, -80.2, -64.8],
}
data_frame = pd.DataFrame.from_dict(data)
data_source = bokeh.models.ColumnDataSource(data_frame)
mean_lat = data_frame['Latitude [deg]'].mean()
mean_lng = data_frame['Longitude [deg]'].mean()
gmap_options = bokeh.models.GMapOptions(lat=mean_lat, lng=mean_lng, zoom=10, map_type='satellite')
xy_gmap = bokeh.plotting.gmap('SuPeRSeCrEtAPIkey', gmap_options)
xy_gmap.circle(x='Longitude [deg]', y='Latitude [deg]', source=data_source, color="red")

# A callback like this? Could make the call in JavaScript after the page is loaded, and update map zoom??
# xy_gmap.fitBounds(x='Longitude [deg]', y='Latitude [deg]', source=data_source)

bokeh.io.show(xy_gmap)

Я бы хотел, чтобы границы карты включали все точки в моем фрейме данныхпри минимально возможном увеличении (как это делается в Javascript функцией fitBounds ()).В настоящее время карта может только увеличивать масштаб до уровня, установленного вручную.

Ответы [ 2 ]

1 голос
/ 20 июня 2019

Начиная с Bokeh 1.2, нет встроенного способа сделать это.Единственное предложение, которое я могу предложить, это заметить, что на стороне JavaScript есть глобальный Bokeh.index, и в этом GMapPlotView для соответствующего GmapPlot, который вы сделали.Это представление имеет атрибут .map, который является фактическим объектом карты Google.Вы можете вызвать метод fitBounds для этого из кода JavaScript.Объекты Bokeh GMapPlot следуют указаниям Google по построению границ, поэтому, если они обновляются, должны реагировать оси и т. Д.

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

0 голосов
/ 23 июня 2019

Начало ответа для обоих методов, описанных bigreddot (с использованием интеграции JS Bokeh.index и Python)

Bokeh.index

В консоли Javascript вы можете использовать следующие команды (должны быть понятны, чтобы включить это в некоторый код JS)

> var gmapPlotView;
> for (var property in Bokeh.index) { if (Bokeh.index[property].constructor.name == 'GMapPlotView') {gmapPlotView = Bokeh.index[property];} }    // Get the correct object, in the case that you have multiple plots, but only one map plot
> var bounds = gmapPlotView.map.getBounds();                  // To start from existing bounds
> var bounds = google.maps.LatLngBounds();                    // To start with fresh bounds
> var place = new google.maps.LatLng(45.5983128 ,8.9172776);  // Coordinates of place to put bounds, repeat for all points
> bounds.extend(place);                                       // Add each place to the bounds object
> gmapPlotView.map.fitBounds(bounds);                         // Set the maps new bounds

Обратите внимание, что реализация Google Bokeh карт отображает ваши данные не на слое данных Google Maps, а на холсте bokeh над картой (поэтому при панорамировании карты между плитками карты и вашими графиками существует задержка).

Интеграция с Python

В процессе ....

...