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
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
fwdays
March 05, 2013
Programming
0
5.5k
Создание интерактивных карт с Leaflet
fwdays
March 05, 2013
Tweet
Share
More Decks by fwdays
See All by fwdays
Symfony best practices и не только Олег Зинченко
fwdays
0
2.1k
Beyond Testing Михаил Боднарчук
fwdays
0
820
Yii2 - на пути от Alpha до GA. Взгляд с практической стороны Александр Бордун
fwdays
0
1.9k
Laravel 4: простота во всем. Евгений Косинский
fwdays
0
1k
Маленькая библиотека для большой компании. Антон Шевчук
fwdays
0
3.8k
Phalcon. Что нового? Александр Торош
fwdays
0
1.2k
Выбираем поисковик умом головы. Андрей Аксенов
fwdays
0
1.5k
Past, Present, and Future: The Evolution of PHP Development. Nate Abele
fwdays
0
820
Функциональный тулчейн Nix
fwdays
1
490
Other Decks in Programming
See All in Programming
米国のサイバーセキュリティタイムラインと見る Goの暗号パッケージの進化
tomtwinkle
2
550
ベクトル検索のフィルタを用いた機械学習モデルとの統合 / python-meetup-fukuoka-06-vector-attr
monochromegane
2
380
nilとは何か 〜interfaceの構造とnil!=nilから理解する〜
kuro_kurorrr
3
1.9k
Docコメントで始める簡単ガードレール
keisukeikeda
1
110
AI駆動開発の本音 〜Claude Code並列開発で見えたエンジニアの新しい役割〜
hisuzuya
4
500
ロボットのための工場に灯りは要らない
watany
10
2.6k
どんと来い、データベース信頼性エンジニアリング / Introduction to DBRE
nnaka2992
1
270
Takumiから考えるSecurity_Maturity_Model.pdf
gessy0129
1
140
new(1.26) ← これすき / kamakura.go #8
utgwkk
0
2.2k
文字コードの話
qnighy
44
17k
エンジニアの「手元の自動化」を加速するn8n 2026.02.27
symy2co
0
140
Windows on Ryzen and I
seosoft
0
250
Featured
See All Featured
Winning Ecommerce Organic Search in an AI Era - #searchnstuff2025
aleyda
1
1.9k
The AI Search Optimization Roadmap by Aleyda Solis
aleyda
1
5.4k
Designing for humans not robots
tammielis
254
26k
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
32
2.4k
The SEO Collaboration Effect
kristinabergwall1
0
390
End of SEO as We Know It (SMX Advanced Version)
ipullrank
3
4.1k
Done Done
chrislema
186
16k
Technical Leadership for Architectural Decision Making
baasie
3
280
The untapped power of vector embeddings
frankvandijk
2
1.6k
HU Berlin: Industrial-Strength Natural Language Processing with spaCy and Prodigy
inesmontani
PRO
0
260
Keith and Marios Guide to Fast Websites
keithpitt
413
23k
Large-scale JavaScript Application Architecture
addyosmani
515
110k
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]