Web GIS系列:
1.搭建簡易Web GIS網站:使用GeoServer+PostgreSQL+PostGIS+OpenLayers3
2.使用GeoServer+QGIS釋出WMTS服務
3.使用GeoServer+OpenLayers釋出和呼叫WMTS、Vector Tile向量切片服務
4.Leaflet入門:新增點線面並匯入GeoJSON資料
OpenLayers與Leaflet都是開源WebGIS元件中的佼佼者。之前的WebGIS系列部落格中,重點以OpenLayers為JavaScript庫,獲得了廣大GISer的關注。本文將對Leaflet進行詳細介紹。所有程式碼都會整理並上傳到GitHub上,歡迎Star和Fork!
本篇文章主要參考了Leaflet官方的入門介紹。
Quick Start
Using GeoJSON
第一幅地圖
首先是初始化地圖並載入底圖,其中setView可以設定檢視的中心點和縮放層級。對於底圖,可以呼叫OSM的切片地圖,也可以呼叫Mapbox的切片地圖。對於Mapbox的地圖,需要申請API key之後才能呼叫。不同風格的地圖可以參考:https://studio.mapbox.com/tilesets/
初始化地圖程式碼如下:
// Init the map
var mymap = L.map('mapid').setView([51.505, -0.09], 13);
// Load the tiled layer
L.tileLayer('https://api.tiles.mapbox.com/v4/mapbox.streets/{z}/{x}/{y}.png?access_token={YOUR_TOKEN}', {
attribution: 'Map data © <a href="https://www.openstreetmap.org/">OpenStreetMap</a> contributors, <a href="https://creativecommons.org/licenses/by-sa/2.0/">CC-BY-SA</a>, Imagery © <a href="https://www.mapbox.com/">Mapbox</a>',
maxZoom: 18,
id: 'mapbox.streets',
accessToken: '{YOUR_TOKEN}',
}).addTo(mymap);
初始化地圖後效果如下圖所示。
接下來可以分別新增點(Marker)線和麵。
// Add markers
var marker = L.marker([51.5, -0.09]).addTo(mymap);
// Add circles
var circle = L.circle([51.508, -0.11], {
color: 'red',
fillColor: '#f03',
fillOpacity: 0.5,
radius: 500
}).addTo(mymap);
// Add polygons
var polygon = L.polygon([
[51.509, -0.08],
[51.503, -0.06],
[51.51, -0.047]
]).addTo(mymap);
效果如下圖所示。
對於具體的要素和圖層,點選後可以跳出對話方塊,具體效果如下。
// Add popups for features
marker.bindPopup("<b>Hello world!</b><br>I am a popup.").openPopup();
circle.bindPopup("I am a circle.");
polygon.bindPopup("I am a polygon.");
// Add popups for layer
var popup = L.popup()
.setLatLng([51.5, -0.09])
.setContent("I am a standalone popup.")
.openOn(mymap);
接下來,如果想要滑鼠點選地圖則顯示具體的經緯度,可以新增事件。滑鼠點選地圖時執行該事件。
// Add events
function onMapClick(e) {
popup
.setLatLng(e.latlng)
.setContent("You clicked the map at " + e.latlng.toString())
.openOn(mymap);
}
mymap.on('click', onMapClick);
全部程式碼請檢視tutorial.js檔案。
載入GeoJSON要素
接下來將要介紹載入GeoJSON資料的方法。
GeoJSON是一種常見的GIS資料格式,即利用JSON檔案儲存地理資料。
我們首先定義一個GeoJSON資料。
// Define geojson features
var geojsonFeature = {
"type": "Feature",
"properties": {
"name": "Coors Field",
"amenity": "Baseball Stadium",
"popupContent": "This is where the Rockies play!"
},
"geometry": {
"type": "Point",
"coordinates": [-104.99404, 39.75621]
}
};
接下來載入入地圖中。
// Add the geojson features to the map layer
L.geoJSON(geojsonFeature).addTo(mymap2);
顯示效果如下圖。
類似的,可以新增線和麵,並設定其樣式。
// Define line features
var myLines = [{
"type": "LineString",
"coordinates": [[-100, 40], [-105, 45], [-110, 55]]
}, {
"type": "LineString",
"coordinates": [[-105, 40], [-110, 45], [-115, 55]]
}];
// Define the style of the lines
var myStyle = {
"color": "#ff7800",
"weight": 5,
"opacity": 0.65
};
// Add to the layer
L.geoJSON(myLines, {
style: myStyle
}).addTo(mymap2);
// Define polygon features including styles
var states = [{
"type": "Feature",
"properties": {"party": "Republican"},
"geometry": {
"type": "Polygon",
"coordinates": [[
[-104.05, 48.99],
[-97.22, 48.98],
[-96.58, 45.94],
[-104.03, 45.94],
[-104.05, 48.99]
]]
}
}, {
"type": "Feature",
"properties": {"party": "Democrat"},
"geometry": {
"type": "Polygon",
"coordinates": [[
[-109.05, 41.00],
[-102.06, 40.99],
[-102.03, 36.99],
[-109.04, 36.99],
[-109.05, 41.00]
]]
}
}];
// Add to layer
L.geoJSON(states, {
style: function(feature) {
switch (feature.properties.party) {
case 'Republican': return {color: "#ff0000"};
case 'Democrat': return {color: "#0000ff"};
}
}
}).addTo(mymap2);
此外,還可以設定一些屬性,如顯示與否等。全部程式碼請檢視GitHub中tutorial.js檔案.
效果如下圖:
如果需要呼叫外部檔案資料,而不是構造點線面要素的geoJSON,可以使用AJAX+jQuery進行呼叫。方法是設定AJAX讀取檔案格式為json,在回撥函式中將資料顯示出來。具體程式碼如下:
// Load data
var loadData = function (){
$.ajax("data/MegaCities.geojson", {
dataType: "json",
success: function(response){
geojsonFeature = response;
var geojsonMarkerOptions = {
radius: 8,
fillColor: "#ff7800",
color: "#000",
weight: 1,
opacity: 1,
fillOpacity: 0.8
};
L.geoJSON(response, {
pointToLayer: function (feature, latlng){
return L.circleMarker(latlng, geojsonMarkerOptions);
},
onEachFeature: onEachFeature
}).addTo(mymap);
}
});
}
loadData();
最終效果如下圖:
所有的程式碼請參見github: https://github.com/kkyyhh96/WebGIS
其中Leaflet資料夾下的index.html檔案。歡迎Star和Fork!
1.搭建簡易Web GIS網站:使用GeoServer+PostgreSQL+PostGIS+OpenLayers3
2.使用GeoServer+QGIS釋出WMTS服務
3.使用GeoServer+OpenLayers釋出和呼叫WMTS、Vector Tile向量切片服務
4.Leaflet入門:新增點線面並匯入GeoJSON資料