mapbox大数据展示

Mapbox 是一个强大的地图引擎,可以用来展示大数据。以下是使用 Mapbox 展示大数据的基本步骤和示例代码:

  1. 注册 Mapbox 账号并获取访问令牌(Access Token)。
  2. 在 HTML 中引入 Mapbox GL JS 库。
  3. 初始化地图并设置样式。
  4. 使用 GeoJSON 或者其他格式加载数据。
  5. 根据加载的数据添加图层到地图上。
     1 <!DOCTYPE html>
     2 <html>
     3 <head>
     4     <meta charset="utf-8">
     5     <title>Mapbox 大数据展示</title>
     6     <meta name="viewport" content="initial-scale=1,maximum-scale=1,user-scalable=no">
     7     <script src="https://api.mapbox.com/mapbox-gl-js/v2.3.1/mapbox-gl.js"></script>
     8     <link href="https://api.mapbox.com/mapbox-gl-js/v2.3.1/mapbox-gl.css" rel="stylesheet">
     9     <style>
    10         body { margin: 0; padding: 0; }
    11         #map { position: absolute; top: 0; bottom: 0; width: 100%; }
    12     </style>
    13 </head>
    14 <body>
    15 <div id="map"></div>
    16 <script>
    17     mapboxgl.accessToken = 'YOUR_ACCESS_TOKEN'; // 替换为你的访问令牌
    18     var map = new mapboxgl.Map({
    19         container: 'map',
    20         style: 'mapbox://styles/mapbox/streets-v11',
    21         center: [-74.5, 40], // 设置中心点
    22         zoom: 9 // 设置缩放级别
    23     });
    24  
    25     // 加载大数据
    26     map.on('load', function() {
    27         // 添加数据源
    28         map.addSource('large-data-source', {
    29             type: 'geojson',
    30             data: 'https://example.com/path/to/large-data.geojson' // 大数据的 GeoJSON URL
    31         });
    32  
    33         // 添加图层
    34         map.addLayer({
    35             'id': 'large-data-layer',
    36             'type': 'circle',
    37             'source': 'large-data-source',
    38             'paint': {
    39                 'circle-color': '#f00',
    40                 'circle-radius': 5
    41             }
    42         });
    43     });
    44 </script>
    45 </body>
    46 </html>

    在上述代码中,你需要替换 'YOUR_ACCESS_TOKEN' 为你的 Mapbox 访问令牌,并且将 'https://example.com/path/to/large-data.geojson' 替换为你的大数据 GeoJSON 文件的 URL。

    请注意,处理大量数据时,确保 GeoJSON 文件是切片的,或者使用 Mapbox Datasets,这样 Mapbox GL JS 可以优化数据加载和渲染。如果数据量非常大,还可以考虑使用 Mapbox GL JS 的分层数据和视图管理来提高性能。

     1 mapboxgl.accessToken = 'YOUR_MAPBOX_ACCESS_TOKEN'; // 替换为你的Mapbox访问令牌
     2 var map = new mapboxgl.Map({
     3   container: 'map',
     4   style: 'mapbox://styles/mapbox/streets-v11',
     5   center: [0, 0], // 初始中心点坐标
     6   zoom: 1 // 初始缩放级别
     7 });
     8  
     9 // 当地图加载完成后
    10 map.on('load', function() {
    11   // 从后端接口获取数据
    12   fetch('YOUR_BACKEND_ENDPOINT') // 替换为你的后端接口URL
    13     .then(response => response.json())
    14     .then(data => {
    15       // 添加GeoJSON数据源
    16       map.addSource('points-source', {
    17         'type': 'geojson',
    18         'data': data // 假设你的后端返回的是GeoJSON格式的点数据
    19       });
    20  
    21       // 添加图层来展示数据
    22       map.addLayer({
    23         'id': 'points',
    24         'type': 'circle',
    25         'source': 'points-source',
    26         'paint': {
    27           'circle-radius': 5, // 点的半径大小
    28           'circle-color': '#007cbf' // 点的颜色
    29         }
    30       });
    31     });
    32 });
    33 </script>
    34 </body>
    35 </html>

      1 <!DOCTYPE html>
      2 <html xmlns="http://www.w3.org/1999/xhtml">
      3 
      4 <head>
      5     <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
      6     <title>聚类显示</title>
      7     <script include="jquery,papaparse" src="./static/libs/include-lib-local.js"></script>
      8     <script include="" src="./static/libs/include-mapboxgl-local.js"></script>
      9     <link href="./static/demo/mapboxgl/example/style.css" rel="stylesheet" type="text/css" />
     10     <style>
     11         body {
     12             margin: 0;
     13             padding: 0;
     14         }
     15 
     16         #map {
     17             position: absolute;
     18             top: 0;
     19             bottom: 0;
     20             width: 100%;
     21         }
     22     </style>
     23 </head>
     24 
     25 <body>
     26     <div id="map">
     27         <div id="mouse-position">
     28         </div>
     29     </div>
     30     <script>
     31         var tiandituKey = 'f5347cab4b28410a6e8ba5143e3d5a35';
     32         var map = new mapboxgl.Map({
     33             container: 'map',
     34             crs: 'EPSG:4326',
     35             maxBounds: [[-180, -90], [180, 90]],
     36             style: {
     37                 version: 8,
     38                 sources: {
     39                     'tianditu-3857-image': {
     40                         //来源类型为栅格瓦片
     41                         type: 'raster',
     42                         tiles: [
     43                             //来源请求地址,请求天地图提供的全球矢量地图WMTS服务
     44                             'http://t' +
     45                             Math.round(Math.random() * 7) +
     46                             '.tianditu.gov.cn/vec_c/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0' +
     47                             '&LAYER=vec&STYLE=default&TILEMATRIXSET=c&FORMAT=tiles' +
     48                             '&TILECOL={x}&TILEROW={y}&TILEMATRIX={z}' +
     49                             '&tk=' +
     50                             tiandituKey
     51                         ],
     52                         //栅格瓦片的分辨率
     53                         tileSize: 256
     54                     }
     55                 },
     56                 layers: [
     57                     {
     58                         id: 'tianditu-3857-image',
     59                         type: 'raster',
     60                         source: 'tianditu-3857-image',
     61                         minzoom: 0,
     62                         maxzoom: 22
     63                     }
     64                 ],
     65                 glyphs: 'http://develop.smaryun.com:6163/igs/rest/mrms/vtiles/fonts/{fontstack}/{range}.pbf'
     66             },
     67             center: [108.95, 34.25],
     68             zoom: 3
     69         });
     70          79         map.on('load', () => {
     80             $.get('../../static/data/geojson/chinaEarthquake.csv', function (response) {
     81                 var dataObj = Papa.parse(response, {
     82                     skipEmptyLines: true,
     83                     header: true
     84                 });
     85 
     86                 var data = dataObj.data;
     87 
     88                 var geojson = {
     89                     type: 'FeatureCollection',
     90                     features: []
     91                 };
     92 
     93                 for (var i = 0; i < data.length; i++) {
     94                     var item = data[i];
     95                     var date = new Date(item.date);
     96                     var year = date.getFullYear();
     97 
     98                     //2w+地震数据
     99                     if (year > 2000 && year < 2015) {
    100                         var feature = {
    101                             type: 'feature',
    102                             geometry: {
    103                                 type: 'Point',
    104                                 coordinates: []
    105                             },
    106                             properties: {
    107                                 value: parseFloat(item.level)
    108                             }
    109                         };
    110                         feature.geometry.coordinates = [parseFloat(item.X), parseFloat(item.Y)];
    111 
    112                         geojson.features.push(feature);
    113                     }
    114                 }
    115                 addCluster(geojson);
    116             });
    117         });
    118 
    119         function addCluster(geojson) {
    120             // map.add
    121             map.addSource('earthquakes', {
    122                 type: 'geojson',
    123                 data: geojson,
    124                 cluster: true,
    125                 clusterMaxZoom: 14, // 聚合最大级别
    126                 clusterRadius: 50 // 聚合半径
    127             });
    128 
    129             map.addLayer({
    130                 id: 'clusters',
    131                 type: 'circle',
    132                 source: 'earthquakes',
    133                 filter: ['has', 'point_count'],
    134                 paint: {
    135                     'circle-color': ['step', ['get', 'point_count'], '#51bbd6', 100, '#f1f075', 750, '#f28cb1'],
    136                     'circle-radius': ['step', ['get', 'point_count'], 20, 100, 30, 750, 40],
    137                     'circle-stroke-color': '#FFFFFF',
    138                     'circle-stroke-width': 5
    139                 }
    140             });
    141 
    142             map.addLayer({
    143                 id: 'cluster-count',
    144                 type: 'symbol',
    145                 source: 'earthquakes',
    146                 filter: ['has', 'point_count'],
    147                 layout: {
    148                     'text-field': '{point_count_abbreviated}',
    149                     'text-font': ['宋体', '宋体'],
    150                     'text-size': 12
    151                 }
    152             });
    153 
    154             map.addLayer({
    155                 id: 'unclustered-point',
    156                 type: 'circle',
    157                 source: 'earthquakes',
    158                 filter: ['!', ['has', 'point_count']],
    159                 paint: {
    160                     'circle-color': '#11b4da',
    161                     'circle-radius': 4,
    162                     'circle-stroke-width': 1,
    163                     'circle-stroke-color': '#fff'
    164                 }
    165             });
    166         }
    167     </script>
    168 </body>
    169 
    170 </html>

     https://zhuanlan.zhihu.com/p/577015814

     

     

     

posted @ 2024-07-29 09:21  鼓舞飞扬  阅读(35)  评论(0编辑  收藏  举报