Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Создание интерактивных карт с Leaflet
Search
fwdays
March 05, 2013
Programming
0
5.3k
Создание интерактивных карт с Leaflet
fwdays
March 05, 2013
Tweet
Share
More Decks by fwdays
See All by fwdays
Symfony best practices и не только Олег Зинченко
fwdays
0
1.9k
Beyond Testing Михаил Боднарчук
fwdays
0
660
Yii2 - на пути от Alpha до GA. Взгляд с практической стороны Александр Бордун
fwdays
0
1.7k
Laravel 4: простота во всем. Евгений Косинский
fwdays
0
860
Маленькая библиотека для большой компании. Антон Шевчук
fwdays
0
3.7k
Phalcon. Что нового? Александр Торош
fwdays
0
970
Выбираем поисковик умом головы. Андрей Аксенов
fwdays
0
1.2k
Past, Present, and Future: The Evolution of PHP Development. Nate Abele
fwdays
0
670
Функциональный тулчейн Nix
fwdays
1
380
Other Decks in Programming
See All in Programming
Kotlin Multiplatform at Stable and Beyond (Android Makers 2024)
zsmb
0
290
GitHub Copilotのススメ
marcy731
1
200
Prepare for Jakarta EE 11 - Performance and Developer Productivity
ivargrimstad
0
810
冗長なエラーログを削減し、スタックトレースを手に入れる / Reducing Verbose Error Logs and Obtaining Stack Traces
upamune
0
770
FigmaとPHPで作る1ミリたりとも表示崩れしない最強の帳票印刷ソリューション
ttskch
43
19k
2 週間で Twitter Bot を作ってみた
contour_gara
0
530
Compose-View Interop in Practice (mDevCamp 2024)
stewemetal
0
140
PHPはいつから死んでいるかの調査
chiroruxx
1
400
Zero Waste, Radical Magic, and Italian Graft – Quarkus Efficiency Secrets
hollycummins
0
230
検証も兼ねて個人開発でHonoとかと向き合った話
hanetsuki
1
1.1k
Fragment Composition of GraphQL
quramy
7
1k
Elm Form Validation
bkuhlmann
0
510
Featured
See All Featured
Into the Great Unknown - MozCon
thekraken
10
990
Understanding Cognitive Biases in Performance Measurement
bluesmoon
7
1k
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
25
2.3k
Bootstrapping a Software Product
garrettdimon
PRO
302
110k
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
34
8.9k
We Have a Design System, Now What?
morganepeng
43
6.8k
jQuery: Nuts, Bolts and Bling
dougneiner
59
7.1k
Stop Working from a Prison Cell
hatefulcrawdad
266
19k
Building Adaptive Systems
keathley
31
1.9k
Making Projects Easy
brettharned
108
5.5k
Design by the Numbers
sachag
274
18k
The Language of Interfaces
destraynor
151
23k
Transcript
Владимир Агафонкин 03.2013 создание интерактивных карт с
agafonkin.com
agafonkin.com
agafonkin.com /mourner
rain.in.ua
leafletjs.com
None
None
None
None
None
None
open source
• 2.5 года разработки
• 2.5 года разработки • 6335 строки кода
• 2.5 года разработки • 6335 строки кода • 2081
коммита от 109 разных человек
• 2.5 года разработки • 6335 строки кода • 2081
коммита от 109 разных человек • 3935 stars, 690 forks
• 2.5 года разработки • 6335 строки кода • 2081
коммита от 109 разных человек • 3935 stars, 690 forks • issues: 167 открытых, 1310 закрытых
• 2.5 года разработки • 6335 строки кода • 2081
коммита от 109 разных человек • 3935 stars, 690 forks • issues: 167 открытых, 1310 закрытых • pull requests: 25 открытых, 480 закрытых
простота
скорость отзывчивость легковесность
(min, gzip) JS 28KB CSS 2KB PNG 7KB
современные мобильные старые (доступно) поддержка браузеров
количество возможностей Images Markers Popups Vectors XYZ tiles GeoJSON WMS
Layer groups Inertial pan Scroll zoom Dblclick zoom Box zoom Keyboard nav Pinch zoom Dbltap zoom Marker drag Pan anim Zoom anim Zoom buttons Attribution Layer switcher Scale Map rotation Fractional zoom WebGL renderer TMS WMTS TileCache MapGuide MapServer KaMap KaMapCache MultiMap Google Yahoo WorldWind Virtual Earth Bing Zoomify UTFGrid OSM ArcGIS ArcIMS GML GeoRSS KML WFS WFST ArcXML Atom CQL SLD GPX OSM XML OWS Context WKT XLS XML Drawing Editing Graticule Measure Pan control Minimap Permalink Clustering
качество возможностей XYZ tiles WMS Images Markers Popups Vectors GeoJSON
Layer groups Inertial pan Scroll zoom Dblclick zoom Box zoom Keyboard nav Pinch zoom Dbltap zoom Marker drag Pan anim Zoom anim Zoom buttons Attribution Layer switcher Scale + сторонние плагины
var map = L.map('map') .setView([51.505, -0.09], 13); L.tileLayer( 'http://{s}.tile.osm.org/{z}/{x}/{y}.png') .addTo(map);
L.marker([51.5, -0.09]) .addTo(map) .bindPopup('Hello World!') .openPopup(); максимально простой API
None
<div id="map"></div> инициализация карты
<div id="map"></div> body { padding: 0; margin: 0; } html,
body, #map { height: 100%; } инициализация карты
var map = new L.Map('map'); map.setView(new L.LatLng(51.505, -0.09), 13); инициализация
карты
var map = L.map('map') .setView([51.505, -0.09], 13); синтаксический сахар
var map = L.map('map') .setView([51.505, -0.09], 13); •фабрики классов синтаксический
сахар
var map = L.map('map') .setView([51.505, -0.09], 13); •фабрики классов •методы
по цепочке синтаксический сахар
var map = L.map('map') .setView([51.505, -0.09], 13); •фабрики классов •методы
по цепочке •координаты массивами синтаксический сахар
L.tileLayer( 'http://{s}.tile.osm.org/{z}/{x}/{y}.png' ).addTo(map); добавляем слой карты
L.tileLayer( 'http://{s}.tile.osm.org/{z}/{x}/{y}.png', { attribution: '(c) OSM contributors' }).addTo(map); указываем копирайт
None
• таскание карты с инерцией (мышью и пальцами)
• таскание карты с инерцией (мышью и пальцами) • зум
скроллом мыши
• таскание карты с инерцией (мышью и пальцами) • зум
скроллом мыши • зум двойным кликом
• таскание карты с инерцией (мышью и пальцами) • зум
скроллом мыши • зум двойным кликом • зум к области (shift-drag)
• таскание карты с инерцией (мышью и пальцами) • зум
скроллом мыши • зум двойным кликом • зум к области (shift-drag) • зум жестами пальцев
• таскание карты с инерцией (мышью и пальцами) • зум
скроллом мыши • зум двойным кликом • зум к области (shift-drag) • зум жестами пальцев • навигация клавиатурой
• таскание карты с инерцией (мышью и пальцами) • зум
скроллом мыши • зум двойным кликом • зум к области (shift-drag) • зум жестами пальцев • навигация клавиатурой • анимации
• таскание карты с инерцией (мышью и пальцами) • зум
скроллом мыши • зум двойным кликом • зум к области (shift-drag) • зум жестами пальцев • навигация клавиатурой • анимации • кнопки зума
• таскание карты с инерцией (мышью и пальцами) • зум
скроллом мыши • зум двойным кликом • зум к области (shift-drag) • зум жестами пальцев • навигация клавиатурой • анимации • кнопки зума • строка копирайта
http://{s}.tile.osm.org/{z}/{x}/{y}.png тайлы
None
проекции
меркатор
var map = L.map('map', { crs: L.CRS.EPSG3857 }); системы привязки
координат
var map = L.map('map', { crs: L.CRS.EPSG3857 }); • EPSG
3857 (Spherical Mercator) системы привязки координат
var map = L.map('map', { crs: L.CRS.EPSG3857 }); • EPSG
3857 (Spherical Mercator) • EPSG 3395 (True Mercator) системы привязки координат
var map = L.map('map', { crs: L.CRS.EPSG3857 }); • EPSG
3857 (Spherical Mercator) • EPSG 3395 (True Mercator) • EPSG 4326 (Equirectangular) системы привязки координат
var map = L.map('map', { crs: L.CRS.EPSG3857 }); • EPSG
3857 (Spherical Mercator) • EPSG 3395 (True Mercator) • EPSG 4326 (Equirectangular) • Simple (flat maps) системы привязки координат
var map = L.map('map', { crs: L.CRS.EPSG3857 }); • EPSG
3857 (Spherical Mercator) • EPSG 3395 (True Mercator) • EPSG 4326 (Equirectangular) • Simple (flat maps) • ... (Proj4Leaflet plugin) системы привязки координат
var map = L.map('map', {crs: L.CRS.EPSG4326}); var bluemarble = L.tileLayer.wms(
'http://maps.opengeo.org/geowebcache/service/wms', { layers: 'bluemarble', attribution: '(c) NASA Blue Marble' }).addTo(map); WMS-слой
None
L.marker([51.504, -0.159]) .addTo(map); маркеры
None
L.marker([51.504, -0.159]) .addTo(map) .bindPopup('Очень серьёзное место') .openPopup(); маркеры с попапом
None
None
свои иконки для маркеров var greenIcon = L.icon({ iconUrl: 'leaf-green.png',
shadowUrl: 'leaf-shadow.png', iconSize: [38, 95], shadowSize: [50, 64], iconAnchor: [22, 94], shadowAnchor: [4, 62], popupAnchor: [-3, -76] }); L.marker([51.504, -0.159], {icon: greenIcon}) .addTo(map);
HTML-иконки var icon = L.divIcon({ html: '<div><span>' + num +
'</span></div>', className: 'marker-cluster-' + size, iconSize: [40, 40] });
группы var group = L.layerGroup(); marker1.addTo(group); marker2.addTo(group); group.addTo(map);
L.control.layers({ "Minimal": minimal, "Night View": midnight }, { "Motorways": motorways,
"Cities": cities }) .addTo(map); control.layers
None
Leaflet.markercluster var group = L.markerClusterGroup(); marker1.addTo(group); marker2.addTo(group); ... group.addTo(map);
None
None
векторные слои
L.polygon([ [51.509, -0.08], [51.503, -0.06], [51.51, -0.047] ]).addTo(map); векторные слои
векторные слои • SVG
векторные слои • SVG • Canvas
векторные слои • SVG • Canvas • VML
векторные слои • SVG • Canvas • VML • клиппинг
векторные слои • SVG • Canvas • VML • клиппинг
• упрощение
mourner.github.com/simplify-js
L.polygon([...], { weight: 2, opacity: 1, color: 'white', dashArray: '3',
fillOpacity: 0.7, fillColor: '#FC4E2A' }).addTo(map); векторные слои
var geojsonFeature = { "type": "Feature", "properties": { "name": "Coors
Field", "amenity": "Baseball Stadium" }, "geometry": { "type": "Point", "coordinates": [-104.99404, 39.75621] } }; L.geoJson(geojsonFeature).addTo(map); GeoJSON
function style(feature) { return { fillColor: getColor(feature.properties.density) }; } L.geoJson(statesData,
{ style: style }).addTo(map); GeoJSON
function addInteraction(feature, layer) { layer.on({ mouseover: highlightFeature, mouseout: resetHighlight, click:
zoomToFeature }); } L.geoJson(statesData, { style: style onEachFeature: addInteraction }).addTo(map); GeoJSON
события L.Map: click dblclick mousedown mouseup mouseover mouseout mousemove contextmenu
focus blur preclick load viewreset movestart move moveend dragstart drag dragend zoomstart zoomend autopanstart layeradd layerremove baselayerchange locationfound locationerror popupopen popupclose
события map.on('click', function (e) { console.log(e.latlng); });
Leaflet.draw
leafletjs.com/plugins.html 48 плагинов
Спасибо! Вопросы? Владимир Агафонкин
[email protected]