• maptalks 开发GIS地图(34)maptalks.three.27- custom-grid


    1. 大数据量的grid栅格。其中使用了d3.min.js 和 turf 的函数。

    2. Grid 数据

     1    const geohashlen = 5;
     2         function Grid(geojson) {
     3             let minLng = Infinity, minLat = Infinity, maxLng = -Infinity, maxLat = -Infinity;
     4             const coordinates = geojson.geometry.coordinates[0];
     5             for (let i = 0, len = coordinates.length; i < len; i++) {
     6                 const [lng, lat] = coordinates[i];
     7                 minLng = Math.min(lng, minLng);
     8                 minLat = Math.min(lat, minLat);
     9                 maxLng = Math.max(lng, maxLng);
    10                 maxLat = Math.max(lat, maxLat);
    11             }
    12             this.minLng = minLng;
    13             this.minLat = minLat;
    14             this.maxLng = maxLng;
    15             this.maxLat = maxLat;
    16             this.count = 0;
    17             this.altitude = 0;
    18             this.radius = 1000;
    19             this.color = '#fff';
    20             this.center = this.getCenter();
    21             const [lng, lat] = this.center;
    22             this.geohash = geohash.encode(lat, lng, geohashlen);
    23         }

    3. 处理 csv 数据。

     1 var bars = [];
     2         function addBars(scene) {
     3             d3.csv('https://gw.alipayobjects.com/os/basement_prod/7359a5e9-3c5e-453f-b207-bc892fb23b84.csv', (error, response) => {
     4                 let minLng = 63.34425210104371, minLat = 13.50923035548422, maxLng = 146.75790830392293, maxLat = 57.69160333787326;
     5 
     6                 for (let i = 0, len = response.length; i < len; i++) {
     7                     let lng = response[i].lng, lat = response[i].lat;
     8                     lng = parseFloat(lng);
     9                     lat = parseFloat(lat);
    10                     // minLng = Math.min(lng, minLng);
    11                     // minLat = Math.min(lat, minLat);
    12                     // maxLng = Math.max(lng, maxLng);
    13                     // maxLat = Math.max(lat, maxLat);
    14                     if (minLng <= lng && lng <= maxLng && lat >= minLat && lat <= maxLat) {
    15                         lnglats.push([lng, lat, geohash.encode(lat, lng, geohashlen)]);
    16                     }
    17                 }
    18                 // minLng = Math.max(minLng, 63.34425210104371);
    19                 // minLat = Math.max(minLat, 13.50923035548422);
    20                 // maxLng = Math.min(maxLng, 146.75790830392293);
    21                 // maxLat = Math.min(maxLat, 57.69160333787326);
    22 
    23                 const center = new maptalks.Coordinate((minLng + maxLng) / 2, (minLat + maxLat) / 2);
    24                 const size = 10000;
    25                 const cells = turf.squareGrid([minLng, minLat, maxLng, maxLat], size / 1000, { unit: '' });
    26                 const grids = [], radius = size / 2;
    27                 for (let i = 0, len = cells.features.length; i < len; i++) {
    28                     const grid = new Grid(cells.features[i]);
    29                     grid.radius = radius;
    30                     gridMap[grid.geohash] = grid;
    31                     grids.push(grid);
    32                 }
    33                 console.log(grids);
    34                 const notfinds = [];
    35 
    36                 for (let i = 0, len = lnglats.length; i < len; i++) {
    37                     let [lng, lat, key] = lnglats[i];
    38                     if (minLng <= lng && lng <= maxLng && lat >= minLat && lat <= maxLat) {
    39                         if (gridMap[key]) {
    40                             gridMap[key].count++;
    41                         } else {
    42                             // notfinds.push(key);
    43                         }
    44                     }
    45                 }
    46 
    47                 // console.log(notfinds);
    48                 const timer = 'time';
    49                 console.time(timer);
    50                 let max = -Infinity;
    51                 const filterGrids = [];
    52                 for (let i = 0, len = grids.length; i < len; i++) {
    53                     if (grids[i].count > 0) {
    54                         const grid = grids[i];
    55                         max = Math.max(max, grid.count);
    56                         const color = getColor(grid.count);
    57                         grid.color = color;
    58                         filterGrids.push(grid);
    59                     }
    60                 }
    61 
    62                 console.timeEnd(timer);
    63                 console.log(max);
    64                 const boxs = new Boxs(filterGrids, { center: center }, material, threeLayer);
    65                 threeLayer.addMesh(boxs);
    66                 console.log(boxs);
    67                 bars.push(boxs);
    68             });
    69 
    70             initGui();
    71             animation();
    72         }

    4. 页面显示

    5. 源码地址

    https://github.com/WhatGIS/maptalkMap/tree/main/threelayer/demo

     
  • 相关阅读:
    Python pymysql
    Zk 集群概念
    k8s教程
    Python 经典类和新式类
    Python 私有属性
    Python 高级面向对象
    Python 面向对象5 多态
    MyBatis学习总结(八)——Mybatis3.x与Spring4.x整合
    MyBatis学习总结(七)——Mybatis缓存
    MyBatis学习总结(六)——调用存储过程
  • 原文地址:https://www.cnblogs.com/googlegis/p/14736095.html
Copyright © 2020-2023  润新知