Я использую leaflet
и folium
для обозначения мест.
Эти места можно отфильтровать, поэтому для них требуется что-то немного динамичное.
Я хочу добиться двух вещей:
Я чувствую, что мою проблему можно решить с помощью fitBounds
, который, согласно документации, автоматически рассчитывает масштаб, чтобы соответствовать прямоугольной области на карте.
Это звучит идеально, и этот пост здесь, похоже, дает ответ на аналогичный вопрос: заранее определить оптимальный уровень масштабирования в фолиуме
Небольшая проблема, я просто не понимаю.
Я думаю, что должен иметь возможность использовать минимальную и максимальную долготу и широту для создания прямоугольной области, на которую ссылается документация листовки.
Но как это отразится на уровнях масштабирования, указанных в буклете?
def function(request):
markers = Model.objects.filter(location_active=True)
#Max latitude & longitude
min_latitude = Model.objects.filter(location_active=True).aggregate(Min('latitude'))['latitude__min']
min_longitude = Model.objects.filter(location_active=True).aggregate(Min('longitude'))['longitude__min']
#Min latitude & longitude
max_latitude = Model.objects.filter(location_active=True).aggregate(Max('latitude'))['latitude__max']
max_longitude = Model.objects.filter(location_active=True).aggregate(Max('longitude'))['longitude__max']
sum_latitude = 0
# sum latitude and longitude
sum_latitude = max_latitude + min_latitude
sum_longitude = max_longitude + min_longitude
#average position for latitude and longitude
average_latitude = sum_latitude/2
print(f'average_latitude - {average_latitude} ')
average_longitude = sum_longitude/2
print(f'average_longitude - {average_longitude} ')
center_location = [average_latitude,average_longitude]
center_zoom_start= 12
tiles_style = 'Stamen Terrain'
#create Folium map
m = folium.Map(location=center_location,zoom_start=center_zoom_start,tiles=tiles_style)
m_access = folium.Map(location=center_location,zoom_start=center_zoom_start,tiles=tiles_style)
context = {'markers':markers,'map_access':m_access._repr_html_,'map':m._repr_html_}
return render(request,'template.html',context)
Ответ был на самом деле простым, оглядываясь назад.
markers = Model.objects.filter(location_active=True)
#Max latitude & longitude
min_latitude = Model.objects.filter(location_active=True).aggregate(Min('latitude'))['latitude__min']
min_longitude = Model.objects.filter(location_active=True).aggregate(Min('longitude'))['longitude__min']
#Min latitude & longitude
max_latitude = Model.objects.filter(location_active=True).aggregate(Max('latitude'))['latitude__max']
max_longitude = Model.objects.filter(location_active=True).aggregate(Max('longitude'))['longitude__max']
#average position for latitude and longitude
average_latitude = sum_latitude/2
print(f'average_latitude - {average_latitude} ')
average_longitude = sum_longitude/2
print(f'average_longitude - {average_longitude} ')
center_location = [average_latitude,average_longitude]
#center_zoom_start= 12
tiles_style = 'Stamen Terrain'
m = folium.Map(location=center_location,tiles=tiles_style) #<-- removed reference to zoom_start=center_zoom_start
m.fit_bounds([[min_latitude, min_longitude], [max_latitude, max_longitude]]) #<-- added this bit. I did not knowwe could call m like that.
m_access = folium.Map(location=center_location,tiles=tiles_style) #<-- removed reference to zoom_start=center_zoom_start