Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Создание интерактивных карт с Leaflet
Search
fwdays
March 05, 2013
Programming
5.6k
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Создание интерактивных карт с Leaflet
fwdays
March 05, 2013
More Decks by fwdays
See All by fwdays
Symfony best practices и не только Олег Зинченко
fwdays
0
2.2k
Beyond Testing Михаил Боднарчук
fwdays
0
910
Yii2 - на пути от Alpha до GA. Взгляд с практической стороны Александр Бордун
fwdays
0
2k
Laravel 4: простота во всем. Евгений Косинский
fwdays
0
1.1k
Маленькая библиотека для большой компании. Антон Шевчук
fwdays
0
3.9k
Phalcon. Что нового? Александр Торош
fwdays
0
1.3k
Выбираем поисковик умом головы. Андрей Аксенов
fwdays
0
1.6k
Past, Present, and Future: The Evolution of PHP Development. Nate Abele
fwdays
0
960
Функциональный тулчейн Nix
fwdays
1
570
Other Decks in Programming
See All in Programming
難しいけど、読めた。- OSSの入口に立った話。
sts11142
0
130
テストを司るデーモンに会いに行く 〜隔離した仮想マシンでテストを通すまで〜
h1d3mun3
1
600
Augmenting AI with the Power of Jakarta EE
ivargrimstad
0
410
[2026-09-26]空論ジェネリックプロセス~テスト資産とAIで紡ぐ、再現可能なパフォーマンスチューニングの話~
tosite
0
250
re:Inventに行く前に知っておきたい現地参加のノウハウ
nokomoro3
0
340
Verilogで学ぶCPU自作入門.pdf
uyuki234
8
4k
プロダクトコードからライブラリの境界を見つける
elmetal
PRO
0
100
巨大モノリシックアプリ モダン化大作戦
ktcryomm
1
1.3k
Herb in Rails 8.2: Your ERB views, now HTML-aware @ Rails World 2026, Austin, Texas
marcoroth
0
160
マイコン向けの軽量Ruby「PicoRuby」で各種デバイスを制御するネイティブアプリの実現手法
bash0c7
0
470
半永久的に提供し続けられるプライベートクラウドを目指して ― 利用者の認知負荷を抑えるAPI抽象化とハードウェア世代交代の基盤設計
tomokon
0
420
カツオ、ご期待ください
suneo3476
0
140
Featured
See All Featured
The #1 spot is gone: here's how to win anyway
tamaranovitovic
4
1.2k
We Have a Design System, Now What?
morganepeng
55
8.4k
SERP Conf. Vienna - Web Accessibility: Optimizing for Inclusivity and SEO
sarafernandez
2
1.6k
Test your architecture with Archunit
thirion
2
2.4k
What’s in a name? Adding method to the madness
productmarketing
PRO
24
4.2k
AI Search: Implications for SEO and How to Move Forward - #ShenzhenSEOConference
aleyda
1
1.4k
Exploring the relationship between traditional SERPs and Gen AI search
raygrieselhuber
PRO
3
4.3k
Neural Spatial Audio Processing for Sound Field Analysis and Control
skoyamalab
0
540
Why Our Code Smells
bkeepers
PRO
340
58k
<Decoding/> the Language of Devs - We Love SEO 2024
nikkihalliwell
1
340
AI: The stuff that nobody shows you
jnunemaker
PRO
10
1.1k
Breaking role norms: Why Content Design is so much more than writing copy - Taylor Woolridge
uxyall
1
440
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]