国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

cesium實現(xiàn)大批量POI點位聚合渲染優(yōu)化方案

這篇具有很好參考價值的文章主要介紹了cesium實現(xiàn)大批量POI點位聚合渲染優(yōu)化方案。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

cesium primitive聚合,Cesium,javascript,前端

前言

cesium目前只提供了entityCluster這個聚合類,使打點聚合更方便快捷的實現(xiàn),但是一般在真正做項目的時候,大家會經(jīng)常碰到成千上萬個甚至幾十萬個點位需要聚合打點,那這時候你如果還是用entity去實現(xiàn)的話,怕是要被用戶按在地上瘋狂摩擦,摩擦。。。??

思考

我們可以通過模擬entityCluster這個類的實現(xiàn)方式,利用源碼中的算法,改成primitive的實現(xiàn)方式;

開發(fā)

拉下cesium的源碼,搜EntityCluster關(guān)鍵字,我們可以找到EntityCluster.js這個文件,那么這個代碼就是實現(xiàn)聚合的核心邏輯,接下來我們可以復(fù)制一份出來,將EntityCluster全部改為PrimitiveCluster,接著getScreenSpacePositions這個方法里將entity的邏輯刪除,否則會因為item.id為entity對象為空導(dǎo)致報錯

function getScreenSpacePositions(
  collection,
  points,
  scene,
  occluder,
  entityCluster
) {
  if (!defined(collection)) {
    return;
  }

  const length = collection.length;
  for (let i = 0; i < length; ++i) {
    const item = collection.get(i);
    item.clusterShow = false;

    if (
      !item.show ||
      (entityCluster._scene.mode === SceneMode.SCENE3D &&
        !occluder.isPointVisible(item.position))
    ) {
      continue;
    }

    // const canClusterLabels =
    //   entityCluster._clusterLabels && defined(item._labelCollection);
    // const canClusterBillboards =
    //   entityCluster._clusterBillboards && defined(item.id._billboard);
    // const canClusterPoints =
    //   entityCluster._clusterPoints && defined(item.id._point);
    // if (canClusterLabels && (canClusterPoints || canClusterBillboards)) {
    //   continue;
    // }

    const coord = item.computeScreenSpacePosition(scene);
    if (!defined(coord)) {
      continue;
    }

    points.push({
      index: i,
      collection: collection,
      clustered: false,
      coord: coord,
    });
  }
}

好了,源碼大體就是改這么多了,接下來就是怎么用;

使用

import PrimitiveCluster from "@/utils/cesiumCtrl/primitiveCluster";

// 初始化標(biāo)簽實例
const billboardsCollectionCombine = new Cesium.BillboardCollection();
// 初始化實體
const primitives = viewer.scene.primitives.add(
  new Cesium.PrimitiveCollection()
);

getGeojson("/json/schools.geojson").then(({ res }) => {
    // 先獲取點位數(shù)據(jù)
    console.log(res);
    const { features } = res;
    formatClusterPoint(features);
  });
// 整理聚合數(shù)據(jù)
const formatClusterPoint = (features) => {
  var scene = viewer.scene;
  var primitivecluster = new PrimitiveCluster();

  //與entitycluster相同設(shè)置其是否聚合 以及最大最小值
  primitivecluster.enabled = true;
  primitivecluster.pixelRange = 60;
  primitivecluster.minimumClusterSize = 2;
  // primitivecluster._pointCollection = pointCollection;
  // primitivecluster._labelCollection = labelCollection;

  for (let i = 0; i < features.length; i++) {
    const feature = features[i];
    const coordinates = feature.geometry.coordinates;
    const position = Cesium.Cartesian3.fromDegrees(
      coordinates[0],
      coordinates[1]
    );

    // 帶圖片的點
    billboardsCollectionCombine.add({
      image: "/images/mark-icon.png",
      width: 32,
      height: 32,
      position,
    });
  }
  // 將數(shù)據(jù)傳給primitivecluster的標(biāo)簽屬性
  primitivecluster._billboardCollection = billboardsCollectionCombine;
  // 初始化
  primitivecluster._initialize(scene);
  // 將標(biāo)簽數(shù)據(jù)添加到實體中
  primitives.add(primitivecluster);

  // 監(jiān)聽相機縮放
  primitivecluster.clusterEvent.addEventListener(
    (clusteredEntities, cluster) => {
      // 關(guān)閉自帶的顯示聚合數(shù)量的標(biāo)簽
      cluster.label.show = false;
      cluster.billboard.show = true;
      cluster.billboard.verticalOrigin = Cesium.VerticalOrigin.BOTTOM;

      // 根據(jù)聚合數(shù)量的多少設(shè)置不同層級的圖片以及大小
      cluster.billboard.image = combineIconAndLabel(
        "/images/school-icon.png",
        clusteredEntities.length,
        64
      );
      // cluster.billboard.image = "/images/school-icon.png";
      cluster.billboard._imageHeight = 60;
      cluster.billboard._imageWidth = 60;
      cluster.billboard._dirty = false;
      cluster.billboard.width = 40;
      cluster.billboard.height = 40;
    }
  );
  return primitivecluster;
};
/**
 * @description: 將圖片和文字合成新圖標(biāo)使用(參考Cesium源碼)
 * @param {*} url:圖片地址
 * @param {*} label:文字
 * @param {*} size:畫布大小
 * @return {*} 返回canvas
 */
function combineIconAndLabel(url, label, size) {
  // 創(chuàng)建畫布對象
  let canvas = document.createElement("canvas");
  canvas.width = size;
  canvas.height = size;
  let ctx = canvas.getContext("2d");

  let promise = new Cesium.Resource.fetchImage(url).then((image) => {
    // 異常判斷
    try {
      ctx.drawImage(image, 0, 0);
    } catch (e) {
      console.log(e);
    }

    // 渲染字體
    // font屬性設(shè)置順序:font-style, font-variant, font-weight, font-size, line-height, font-family
    ctx.fillStyle = Cesium.Color.BLACK.toCssColorString();
    ctx.font = "bold 20px Microsoft YaHei";
    ctx.textAlign = "center";
    ctx.textBaseline = "middle";
    ctx.fillText(label, size / 2, size / 2);

    return canvas;
  });
  return promise;
}

ok,以上就是完整的使用方法,主要是如何使用,不然會造成canvas相關(guān)方面的報錯等等;

開源

詳細源碼細節(jié)可以查看:鏈接: primitive實現(xiàn)聚合源碼 ,此開源項目集合了目前常用的一些三維動畫場景,還在不斷更新中;文章來源地址http://www.zghlxwxcb.cn/news/detail-706003.html

到了這里,關(guān)于cesium實現(xiàn)大批量POI點位聚合渲染優(yōu)化方案的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • elasticsearch刪除大批量數(shù)據(jù)方法

    一般回用如下: 示例: 如果刪除任務(wù)完成了,返回如下: 數(shù)據(jù)查詢?nèi)蝿?wù):

    2024年02月12日
    瀏覽(27)
  • Python 大批量寫入數(shù)據(jù) 百萬級別

    方案二 方案一

    2024年02月11日
    瀏覽(90)
  • MySQL---使用索引優(yōu)化、大批量插入數(shù)據(jù)優(yōu)化

    MySQL---使用索引優(yōu)化、大批量插入數(shù)據(jù)優(yōu)化

    1. 使用索引優(yōu)化 索引是數(shù)據(jù)庫優(yōu)化最常用也是最重要的手段之一 , 通過索引通??梢詭椭脩艚鉀Q大多數(shù)的 MySQL 的性能優(yōu)化問題: 1.1?避免索引失效應(yīng)用-全值匹配 該情況下,索引生效,執(zhí)行效率高。 1.2?避免索引失效應(yīng)用-最左前綴法則 1.3?避免索引失效應(yīng)用-其他匹配原則

    2024年02月07日
    瀏覽(24)
  • Jmeter(三十一):制造大批量的用戶數(shù)據(jù)數(shù)據(jù)

    Jmeter(三十一):制造大批量的用戶數(shù)據(jù)數(shù)據(jù)

    需求:因測試需要,要造100w用戶數(shù)據(jù),通過用戶名、手機號、密碼可新增用戶,其中用戶名和電話號碼要求100w用戶不能重復(fù) 要點: 1、通過Bean shell Sampler實現(xiàn)用戶名和手機號的足夠隨機。 符合我們常用規(guī)則的手機號:第一位為1,第二位為3-9,后面的9位為0-9即可。 phone=${_

    2024年02月10日
    瀏覽(25)
  • 如何使用python快速將大批量圖片合成為視頻?

    如何使用python快速將大批量圖片合成為視頻?

    由于CSDN大批量導(dǎo)入圖片容易出現(xiàn)亂序,本程序?qū)⒅螆D片轉(zhuǎn)為視頻,便于用視頻的方式展示文件內(nèi)容。 由于圖片名稱復(fù)雜多樣,為便于統(tǒng)一化處理,增強程序的通用性,使用改名程序可以降低手動調(diào)整的復(fù)雜度。 改名之后的效果: 注意此部分的圖片大小仍需要手動修改或輸

    2024年02月04日
    瀏覽(21)
  • 遠程運維大批量IT設(shè)備?向日葵批量部署、分組授權(quán)與安全功能解析

    遠程運維大批量IT設(shè)備?向日葵批量部署、分組授權(quán)與安全功能解析

    數(shù)字化轉(zhuǎn)型的不斷推進,給予了企業(yè)全方位的賦能,但任何發(fā)展都伴隨著成本與代價,比如在數(shù)字化轉(zhuǎn)型過程中企業(yè)內(nèi)部辦公與外部業(yè)務(wù)所需的不斷增加的IT設(shè)備數(shù)量,就為日常的運維工作提出了更大的挑戰(zhàn)。 針對企業(yè)面對海量IT設(shè)備時的運維難、效率低、容易出錯等問題,

    2024年02月14日
    瀏覽(22)
  • 使用postman做接口測試傳入大批量動態(tài)參數(shù)的方法

    使用postman做接口測試傳入大批量動態(tài)參數(shù)的方法

    postman是一個非常好用的接口測試工具,而且功能也很強大,今天只簡單說一下使用postman如何對一個接口傳入大批量參數(shù)進行測試的方法。 以我測試的平臺為例,我們的平臺是做在線教育平臺的,我模擬的場景是老師有一門課叫ABC,現(xiàn)在需要有1000個學(xué)生加入ABC這門課。我們不

    2024年01月23日
    瀏覽(32)
  • redis 無占用 兩種方式 清除大批量數(shù)據(jù) lua腳本

    redis存儲了很多無用的key,占用了大量內(nèi)存,需要清除 第一種 (顆粒度較大) lua腳本,刪除某些規(guī)則的key,輸入刪除的key,返回刪除的符合規(guī)則的key的數(shù)量 弊端:顆粒度比較大,發(fā)送一個lua腳本去執(zhí)行,會占用較多時間,堵塞其他redis命令 java代碼 這樣直接刪除,因為規(guī)則有很

    2024年04月28日
    瀏覽(24)
  • Python 自動獲取大批量excel數(shù)據(jù)并填寫到網(wǎng)頁表單(pandas;selenium)

    Python 自動獲取大批量excel數(shù)據(jù)并填寫到網(wǎng)頁表單(pandas;selenium)

    自動獲取大批量excel數(shù)據(jù)并填寫到網(wǎng)頁表單 部分網(wǎng)頁獲取下拉列表點擊的方式有所差異 這個請根據(jù)網(wǎng)頁源碼自做選擇 一定要學(xué)會使用IPDB調(diào)試工具 太好用了?。。?! 可能需要pip update一下 看提示 很好解決 沒有報錯最好啦 Python真是太好用了 辦公利器?。。。?!

    2024年02月12日
    瀏覽(25)
  • 大批量數(shù)據(jù)導(dǎo)出csv,平替導(dǎo)出excel性能優(yōu)化解決方案封裝工具類

    ? ? ? ? 有些業(yè)務(wù)邏輯需要在導(dǎo)出非常大量的數(shù)據(jù),幾百甚至幾千萬的數(shù)據(jù)這個時候再導(dǎo)出excel來對于性能都不是很友好,這個時候就需要替換實現(xiàn)思路來解決這個問題。 ? ? ? ? 本文章提供了兩種解決的方案,也是兩種從數(shù)據(jù)庫中拿取數(shù)據(jù)的方式一種是原生的jdbc一種是使用

    2024年01月16日
    瀏覽(26)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包