-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathtext_doc.txt
More file actions
114 lines (90 loc) · 8.94 KB
/
Copy pathtext_doc.txt
File metadata and controls
114 lines (90 loc) · 8.94 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
Данное приложение создано на языке Python с использованием библиотеки Folium.
Так же используется библиотека Pandas.
В приложении 3 слоя: 1-й слой это basemap, очертания стран и континентов, 2-й слой это polygon layer,
где цвет указывает на количество населения в той или иной стране, 3-й слой это point layer с точками на карте,
указывающими местоположение вулканов. Карта интерактивная - слои можно включать или выключать при помощи панели.
Так же присутствуют всплывающие окна с названиями вулканов, их высотой и кликабельными
ссылками на них в Google.
Вулканы отмечены разными цветами (зеленый, желтый и красный) в зависимости от высоты.
Создание:
1. Импортируем Folium и создаем объект map класса Map с тремя параметрами (map = folium.Map). стр.25
- location (широта, долгота) - выбираем где будет открыта наша карта,
- zoom_start - выбираем стартовое приближение,
- tiles - ответсвенен за внешний вид 1-го слоя.
* Сохраняем карту в формате html map.save("Map_html_popup_advanced.html") стр.43
2. Добавляем точки на карту.
* Создаем FeatureGroup fgv = folium.FeatureGroup(name="Volcanoes") стр.26
FeatureGroup позволяет добавить множество особенностей (features), таких как: Marker, CircleMarker, GeoJson layer, итд.
FeatureGroup это контейнер для объектов. Все объекты на нашей карте будут помещены в FeatureGroup, так их будет проще
показать или скрыть разом по выбору.
* Используем метод add_child для добавления объекта (точек) к существующему объекту (карта). стр.30
* Используем объект CircleMarker с аргументами (положение, цвет, прозрачность, и т.д.) библиотеки Folium
для создания точек на карте.
! CircleMarker позволяет создавать всплывающие окна при нажатии на точку на карте.
* Делаем map.add_child(fgv) стр.39
3. Добавляем координаты всех вулканов из Volcanoes.txt на карту в виде точек.
* Импортируем библиотеку pandas data = pandas.read_csv("Volcanoes.txt") стр.4
* Используем цикл for для итерации через структуру данных (dataframe).
Для этого создаем 2 списка: lat & lon (работа со списком проще и быстрее, чем с dataframe series). стр. 5, 6
data = pandas.read_csv("Volcanoes.txt")
lat = list(data["LAT"])
lon = list(data["LON"])
* Производим итерации цикла for, каждый раз извлекая широту и долготу каждго из вулканов.
for lt, ln in zip(lat, lon): стр.28
! Функция zip нужна для итерации через 2 списка одновременно.
4. Создаем динамические всплывающие окна (popup windows)
* Создаем 2 дополнительных списка elev & name - высота и названия вулканов. стр. 7,8
* Итерируем через все 4 списка for lt, ln, el, name in zip(lat, lon, elev, name):
5. Применим HTML для всплывающих окон, а так же Google ссылки.
* Разместим ссылки во всплывающем окне. Приведенный ниже код создаст всплывающее окно с названием
вулкана в качестве ссылки, которая при нажатии выполняет поиск Google для данного конкретного вулкана:
html = """
Volcano name:<br>
<a href="https://www.google.com/search?q=%%22%s%%22" target="_blank">%s</a><br>
Height: %s m
"""
!! Символы %s являются заполнителями, в которые будут вставлены переменные класса str.
!! В данном примере, str. переменные name и el вставляются в переменную html:
iframe = folium.IFrame(html=html % (name, name, el) стр.29
* Так выглядит теперь цикл for:
for lt, ln, el, name in zip(lat, lon, elev, name):
iframe = folium.IFrame(html=html % (name, name, el), width=200, height=100)
fg.add_child(folium.Marker(location=[lt, ln], popup=folium.Popup(iframe), icon = folium.Icon(color = "green")))
6. Стилизация маркеров по цвету в зависимости от высоты.
* Так как в библиотеке Folium отсутствует функционал для создания динамических маркеров, мы используем встроенный функционал Pyhton.
* Создадим функцию которая будет возвращать разные цвета в зависимости от высоты.
def color_producer(elevation):
if elevation < 1000:
return 'green'
elif 1000 <= elevation < 3000:
return 'orange'
else:
return 'red'
* Теперь добавим функцию color_producer в цикл for.
for lt, ln, el in zip(lat, lon, elev):
iframe = folium.IFrame(html=html % str(el), width=200, height=100)
fg.add_child(folium.Marker(location=[lt, ln], popup=folium.Popup(iframe), icon = folium.Icon(color=color_producer(el))))
* Изменим внешиний вид точек, показывающих вулканы на карте.
Можно использовать dir(folium) для поиска метода создания круглых маркеров.
После того как нужный метод найден, воспользуемся функцией help для поиска аргументов,
которые передадим методу для стилизации маркеров.
fgv.add_child(folium.CircleMarker(location=[lt, ln], radius=6, popup=folium.Popup(iframe), fill_color=color_producer(el), color='grey', fill_opacity=0.7))
7. Добавление нового слоя на карту.
* В данный момент у нас 2 слоя: базовый слой и слой с маркерами. Добавим слой, отражающий количество населения в разных странах.
* Создадим новую FeatureGroup fgp = folium.FeatureGroup(name="Population") и добавим к ней child fgp.add_child
* Добавим polygon layer с помощью метода GeoJson: folium.GeoJson стр.34
* Данные для GeoJson возьмем из файла world.json
! Не открывайте world.json через Atom, если не уверены, что ваш компьютер это потянет. Используйте редактор "полегче", напр.: Notepad.
* Задаём атрибут data для метода GeoJson, равный: fgp.add_child(folium.GeoJson(data=open('world.json', 'r', encoding='utf-8-sig').read()))
! Метод open нужен для создания файлового объекта Python, далее укажем путь к файлу 'world.json'.
! Метод read() в конце нужен так как новые версии Folium принимают строку, вместо файла, в качестве вводных данных.
8. Разные цвета для стран в зависимости от населения:
* В файле world.json есть информация о населении каждой из стран, которая хранится в атрибуте "POP2005"
* Добавим новый аргумент style_function в GeoJson:
style_function=lambda x: {'fillColor':'green' if x['properties']['POP2005'] < 10000000
else 'orange' if 10000000 <= x['properties']['POP2005'] < 20000000 else 'red'}))
! x['properties']['POP2005'] 'properties' это ключ, 'POP2005' его значение в словаре в файле world.json,
а x означает 'features' в том же файле.
9. Добавим панель переключения слоев:
* Используем класс LayerControl, модуля folium
map.add_child(folium.LayerControl())