使用GeoJson 文件可视化中国地图

来源:互联网 发布:js定时器导致页面崩溃 编辑:程序博客网 时间:2024/05/20 00:16

                               使 用 G e oJ so n 文 件可视化中国地图              


一. 准备GeoJson文件

首先可以从百度上下载中国的GeoJson文件,一共有34个省市区(包括香港,澳门,台湾)

以下部分为台湾的GeoJson文件
{"type":"Feature","properties":{"id":34,"name":"台湾","density":640.05},"geometry":{"type":"Polygon","coordinates":[[[121.63599694100014,25.222805080000114],[121.71851647200015,25.15200429900011],[121.89283287900003,25.113674221000167],[121.9057723320002,24.95010000200014],[121.82349694100014,24.854925848000164],[121.81495201900032,24.644354559000192],[121.85596764400032,24.550523179000123],[121.78003991000003,24.43268463700008],[121.77271569100003,24.30923086100006],[121.66285241000014,24.193101304000038],[121.60743248800014,24.07684967700004],[121.62891686300009,24.026190497000158],[121.52149498800031,23.658677476000094],[121.46216881600026,23.34300364800015],[121.4088647800001,23.254584052000126],[121.40007571700005,23.145493882000153],[121.29957116000003,22.95917389500019],[121.19027754000001,22.843166408000144],[121.14144941500001,22.741766669000185],[121.02100670700008,22.647894598000136],[120.9482528000002,22.52680084800005],[120.87501061300014,22.289252020000134],[120.87924238400001,22.055812893000052],[120.84156334700009,21.925482489000103],[120.70435631600014,21.98139069200016],[120.69695071700016,22.113226630000156],[120.62126712300017,22.29507070500017],[120.51197350400025,22.42475006700016],[120.33122806100027,22.51972077000019],[120.17554772200015,22.88410065300016],[120.17025800900024,23.013373114000046],[120.05941816500012,23.151027736000174],[120.1301491600002,23.360960244000154],[120.12426153300032,23.520020550000083],[120.18921959700026,23.774807033000116],[120.29224694100003,23.911932684000192],[120.34009850400014,24.02179596600007],[120.4931746750002,24.23065827000005],[120.57081139400032,24.404933986000202],[120.64893639400009,24.48387278900023],[120.70215905000032,24.60700104400013],[120.84750410200013,24.710842190000108],[120.90235436300031,24.836818752000056],[121.05933678500003,25.050238348000164],[121.37875410200007,25.157945054000038],[121.43628991000026,25.24144114800012],[121.53972415500004,25.28742096600007],[121.63599694100014,25.222805080000114]]]}}]}

要想在leftlet地图中使用GeoJson文件,可以将其用js文件表示,china.js如下所示. 数组中包含多个如上图所示的对象
var chinaData={"type":"FeatureCollection","features":[{},{},{},{}]};

二. 地图可视化

为了提高图的实用性,本图增加展示各省市的人口密度功能。数据来源于2016年
<!DOCTYPE html><html><head><title>leftLetDemo</title><meta charset="utf-8"></script><script type="text/javascript" src="js/china.js"></script><script type="text/javascript" src="js/leaflet.js"></script><link rel="stylesheet" type="text/css" href="css/leaflet.css"></script><style type="text/css"> #map{ height:600px; } .info {             padding: 6px 8px;             font: 14px/16px Arial, Helvetica, sans-serif;             background: white;             background: rgba(255,255,255,0.8);             box-shadow: 0 0 15px rgba(0,0,0,0.2);             border-radius: 5px;         }          .info h4 {           margin: 0 0 5px;           color: #777;       }       .legend {    line-height: 18px;    color: #555;}.legend i {    width: 18px;    height: 18px;    float: left;    margin-right: 8px;    opacity: 0.7;}</style></head><body>        <div id="map"></div>        <script type="text/javascript">  var geojson,info; function getColor(d) {//#800026    return d > 3000 ? '#800026' :           d > 1000  ? '#BD0026' :           d > 500  ? '#E31A1C' :           d > 200  ? '#FC4E2A' :           d > 100   ? '#FD8D3C' :           d > 50   ? '#FEB24C' :           d > 10   ? '#FED976' :                      '#FFEDA0';}function style(feature) {//json的每个属性会执行此函数    return {        fillColor: getColor(feature.properties.density),//        weight: 2,        opacity: 1,        color: 'white',        dashArray: '3',        fillOpacity: 0.7    };}function highlightFeature(e) {//当鼠标拂过时高亮显示    var layer = e.target;    layer.setStyle({        weight: 5,        color: '#666',        dashArray: '',        fillOpacity: 0.7    });    if (!L.Browser.ie && !L.Browser.opera && !L.Browser.edge) {        layer.bringToFront();    }    info.update(layer.feature.properties);}function resetHighlight(e) {//当鼠标退出后reset    geojson.resetStyle(e.target);//  geojson要先定义    info.update();}function zoomToFeature(e) {//当点击时显示状态    map.fitBounds(e.target.getBounds());}function onEachFeature(feature, layer) {//遍历每一个数据,也就是为每一个地点加上监听器    layer.on({        mouseover: highlightFeature,        mouseout: resetHighlight,        click: zoomToFeature    });} var mymap = L.map('map').setView([34.76, 113.65], 4); L.tileLayer('http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png',  {    attribution: 'Map data &copy; <a href="http://openstreetmap.org">OpenStreetMap</a> contributors, <a href="http://creativecommons.org/licenses/by-sa/2.0/">CC-BY-SA</a>, Imagery © <a href="http://mapbox.com">Mapbox</a>',    maxZoom: 18}).addTo(mymap);geojson=L.geoJson(chinaData,{ style:style,             onEachFeature: onEachFeature }).addTo(mymap);info = L.control({position: 'topright'});//添加一个组件,也可以使用自己定义的组件,设置监听事件,使用float属性 或者position:absolute info.onAdd = function (mymap) {    this._div = L.DomUtil.create('div', 'info'); // create a div with a class "info"    this.update();    return this._div;};// method that we will use to update the control based on feature properties passedinfo.update = function (props) {    this._div.innerHTML = '<h4>China Population Density</h4>' +  (props ?        '<b>' + props.name + '</b><br />' + props.density + ' people / mi<sup>2</sup>'        : 'Hover over a province');};info.addTo(mymap);//加入图标var legend = L.control({position: 'bottomright'});legend.onAdd = function (map) {//onAdd函数向其中添加组件    var div = L.DomUtil.create('div', 'info legend'),        grades = [0, 10, 50, 100, 200, 500, 1000,3000],        labels = [];    // loop through our density intervals and generate a label with a colored square for each interval    for (var i = 0; i < grades.length; i++) {        div.innerHTML +=            '<i style="background:' + getColor(grades[i] + 1) + '"></i> ' +            grades[i] + (grades[i + 1] ? '–' + grades[i + 1] + '<br>' : '+');    }    return div;};legend.addTo(mymap);//加入显示比例尺        </script></body></html>

三. 结果展示

当鼠标放到不同的省份时,提示栏会显示相应省份及人口密度。




1 0
原创粉丝点击