2016-12-15 4 views
0

Возможно ли в Python bokeh построить объект глифа Circle() в холсте GMapPlot с динамическим размером на основе масштабирования? Я хочу отобразить область круга, где у меня есть центральная точка и радиус в метрах. И я хочу, чтобы этот круг отображался в меньших и больших размерах, основываясь на масштабировании Карты Google.Python bokeh Размер динамического глифа Google Maps на основе масштабирования

Может ли это быть достигнуто в некотором роде?


UPDATE: я могу построить исправить размера круги со следующим кодом:

from bokeh.document import Document 
from bokeh.embed import file_html 
from bokeh.resources import INLINE 
from bokeh.models import (GMapPlot, GMapOptions, ColumnDataSource, 
    Circle, DataRange1d, PanTool, WheelZoomTool, BoxSelectTool) 

map_options = GMapOptions(lat=30.29, lng=-97.73, map_type="roadmap", zoom=11) 

plot = GMapPlot(x_range=DataRange1d(), y_range=DataRange1d(), map_options=map_options, 
    title="Austin", api_key=GOOGLE_API_KEY) 

source = ColumnDataSource(data=dict(lat=[30.29, 30.20, 30.29], 
    lon=[-97.70, -97.74, -97.78],)) 

circle = Circle(x="lon", y="lat", size=15, fill_color="blue", fill_alpha=0.8, 
    line_color=None) 

plot.add_glyph(source, circle) 

plot.add_tools(PanTool(), WheelZoomTool(), BoxSelectTool()) 

# Save HTML file  
doc = Document() 
doc.add_root(plot) 

filename = './google_maps_test.html' 

with open(filename, "w") as f: 
    f.write(file_html(doc, INLINE, 'Google Maps plot')) 

Здесь size=15 означает пиксели или некоторый фиксированный размер, который не меняется, когда я прокрутки диаграммы ... Я мог бы иметь radius в моем ColumnDataSource объекте, где значениями будут радиус в метрах (например, 50, 75, 100). И я бы использовал size=radius ...

Спасибо!

+0

Что вы уже пробовали? – bigreddot

+0

Я обновил свой вопрос с примера кода ... – ragesz

ответ

1

Глиф Circle (один из) и size и radius. По умолчанию size находится в «единицах экрана» (в пикселях, в основном). Вот почему они остаются одинакового размера, независимо от уровня масштабирования. Если вы хотите, чтобы круги масштабировались с уровнем масштабирования, лучше указать значение radius, так как по умолчанию radius интерпретируется как «единицы пространства данных». То есть в этом случае он будет в метрах (поскольку единицы оси GMapPlot находятся в метрах).

circle = Circle(x="lon", 
       y="lat", 

       # corresponds to 15 meters, so scales accordingly with zoom 
       radius=15,   

       fill_color="blue", 
       fill_alpha=0.8, 
       line_color=None) 
+0

Спасибо, он отлично работает !!!!! – ragesz

+0

В моем реальном коде я хотел использовать «CircleX», но у него нет атрибута «radius»: ((«AttributeError: неожиданный атрибут« радиус »для CircleX' Конечно,« Круг »также выполнит мою работу ... – ragesz

+0

Справа, только «Circle» имеет «радиус» (для поддержки пузырьков), все остальные маркеры являются «разбросанными» маркерами и поддерживают только «размер». – bigreddot

Смежные вопросы