日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 前端技术 > javascript >内容正文

javascript

基于ArcGIS JS API 4.11实现对FeatureLayer的多变量渲染

發(fā)布時(shí)間:2025/3/21 javascript 51 豆豆
生活随笔 收集整理的這篇文章主要介紹了 基于ArcGIS JS API 4.11实现对FeatureLayer的多变量渲染 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

文章目錄

  • 需求背景
  • 需求分析
  • 開發(fā)過程
  • 效果圖
  • 注意事項(xiàng)
  • 參考鏈接
  • 在線示例

需求背景

有一個(gè)二維數(shù)組,里面包含幾萬(wàn)個(gè)表示高度的值,現(xiàn)在要把這些高度值在地圖上展示出來(lái)。可以通過小立方體的方式展現(xiàn),長(zhǎng)寬固定,高用實(shí)際值代替。

需求分析

  • 數(shù)據(jù)量較大,需要考慮性能問題;
  • 在三維場(chǎng)景中對(duì)點(diǎn)數(shù)據(jù)(二維數(shù)組中的單個(gè)值)進(jìn)行三維符號(hào)化
  • 開發(fā)過程

    最開始的思路是創(chuàng)建類型為Point的Graphic,通過PointSymbol3D進(jìn)行符號(hào)化,在ObjectSymbol3DLayer中設(shè)置固定的長(zhǎng)寬,高度根據(jù)數(shù)組里面的具體值對(duì)應(yīng),主要代碼大概如下:

    var elevArr = [];//模擬二維數(shù)組for (let i=0;i<10;i++) {let rowArr = [];for (let j=0;j<10;j++) {rowArr.push(Math.random() * 1000);}elevArr.push(rowArr);}for (let row=0;row<elevArr.length;row++) {for (let col=0;col<elevArr[row].length;col++) {let locX = 17004630.030532643 + 500 + col*500;let locY = 3875195.620791356 - 500 - row*500;const objectSymbol = {type: "point-3d", // autocasts as new PointSymbol3D()symbolLayers: [{type: "object", // autocasts as new ObjectSymbol3DLayer()width: 1000, // diameter of the object from east to west in metersheight: elevArr[row][col], // height of the object in metersdepth: 1000, // diameter of the object from north to south in metersresource: { primitive: "cube" },material: { color: "blue" }}]};var point = {type: "point", // autocasts as new Point()x: locX,y: locY,z: 100, spatialReference: { wkid: 3857 }};const graphic = new Graphic({geometry: point,symbol: objectSymbol});graphicsLayer.add(graphic);}}

    經(jīng)過測(cè)試發(fā)現(xiàn)1000個(gè)點(diǎn)的時(shí)候頁(yè)面響應(yīng)就有點(diǎn)慢了,增加到10000個(gè)點(diǎn)之后,頁(yè)面崩潰,估計(jì)是和創(chuàng)建過多的Graphic , ObjectSymbol3DLayer等對(duì)象有關(guān)系。該方法在較大數(shù)據(jù)量的情況下不適用。
    ArcGIS JS API里面有大數(shù)據(jù)集要素可視化的例子,通過FeatureLayer和Renderer的方式進(jìn)行可視化渲染,FeatureLayer可通過3種方式創(chuàng)建:

    FeatureLayers may be created in one of three ways: from a service URL, an ArcGIS portal item ID, or from an array of client-side features.

    這里采用第三種,直接在代碼里面通過數(shù)組的方式,具體代碼如下:

    <!DOCTYPE html> <html><head><meta charset="utf-8" /><meta name="viewport" content="initial-scale=1, maximum-scale=1, user-scalable=no" /><title>實(shí)現(xiàn)FeatureLayer大數(shù)據(jù)集的多變量渲染</title><style>html,body,#viewDiv {padding: 0;margin: 0;height: 100%;width: 100%;}</style><link rel="stylesheet" href="https://js.arcgis.com/4.11/esri/themes/light/main.css" /><script src="https://js.arcgis.com/4.11/"></script><script>require(["esri/Map", "esri/views/SceneView", "esri/layers/FeatureLayer"], function (Map, SceneView, FeatureLayer) {var map = new Map({basemap: "streets",ground: "world-elevation"});var view = new SceneView({container: "viewDiv", // Reference to the scene div created in step 5map: map, // Reference to the map object created before the scenescale: 5000000, // Sets the initial scale to 1:50,000,000center: [-101.17, 21.78], // Sets the center point of view with lon/lat// viewingMode: "local"});view.on('click', (evt) => {console.log(evt.mapPoint);})var features = [];//模擬二維數(shù)組var elevArr = [];var fid = 0;for (let i = 0; i < 100; i++) {let rowArr = [];for (let j = 0; j < 600; j++) {rowArr.push(Math.random() * 1000);}elevArr.push(rowArr);}let leftCoorX, upCoorY, resolution;for (let row = 0; row < elevArr.length; row++) {for (let col = 0; col < elevArr[row].length; col++ , fid++) {let locX = -11807396.534464896 + 500 + col * 500;let locY = 2727548.99928753 - 500 - row * 500;let feature = {geometry: {type: "point", //不可省略x: locX,y: locY,spatialReference: { wkid: 3857 }, //不可省略},attributes: {ObjectID: fid,elevation: elevArr[row][col],width: "100",depth: "100"}};features.push(feature);}}var uvRenderer = {type: "simple", // autocasts as new SimpleRenderer()symbol: {type: "point-3d", // autocasts as new PointSymbol3D()symbolLayers: [{type: "object", // autocasts as new ObjectSymbol3DLayer()// width: 1000, // diameter of the object from east to west in meters// height: 5000, // height of the object in meters// depth: 1000, // diameter of the object from north to south in metersresource: { primitive: "cube" },material: { color: "blue" }}]},visualVariables: [{type: "size",axis: "height", //在symbolLayers設(shè)置width、height、depth無(wú)效field: "elevation",valueUnit: "meters"},{type: "size",axis: "width",field: "width",valueUnit: "meters"},{type: "size",axis: "depth",field: "depth",valueUnit: "meters"}]};var layer = new FeatureLayer({fields: [{name: "ObjectID",alias: "ObjectID",type: "oid"}, {name: "elevation",alias: "elevation",type: "double"}, {name: "width",alias: "width",type: "string"}, {name: "depth",alias: "depth",type: "string"}],objectIdField: "ObjectID",source: features, // autocast as a Collection of new Graphic(),注意數(shù)組長(zhǎng)度限制,盡量低于60000geometryType: "point",spatialReference: { wkid: 3857 },renderer: uvRenderer,// type: "feature",outFields: ["*"]});map.add(layer);});</script> </head><body><div id="viewDiv"></div> </body></html>

    通過60000個(gè)點(diǎn)進(jìn)行測(cè)試,無(wú)卡頓情況,推測(cè)ArcGIS JS API內(nèi)部有優(yōu)化,如分塊渲染、量化操作等(可參考鏈接1)

    效果圖

    注意事項(xiàng)

  • geometry里面屬性type和spatialReference不可忽略,否則圖形加不到地圖上;
  • 創(chuàng)建FeatureLayer時(shí)source有數(shù)組長(zhǎng)度限制,經(jīng)測(cè)試60000個(gè)點(diǎn)時(shí)正常,70000報(bào)錯(cuò)棧溢出,推測(cè)限制長(zhǎng)度可能為65535,可以通過創(chuàng)建多個(gè)featurelayer的方式避免長(zhǎng)度限制;
  • 當(dāng)geometry中包含z屬性值時(shí),符號(hào)化后高度是在z值之上疊加,如果不包含z屬性,符號(hào)化后高度從該點(diǎn)所對(duì)應(yīng)地形高程值之上累加;
  • 參考鏈接

  • Visualize large feature datasets in 3D with ArcGIS API for JavaScript: https://www.esri.com/arcgis-blog/products/js-api-arcgis/3d-gis/visualize-large-feature-datasets-in-3d-with-arcgis-api-for-javascript/?tdsourcetag=s_pcqq_aiomsg
  • https://developers.arcgis.com/javascript/latest/api-reference/esri-layers-FeatureLayer.html
  • 在線示例

    示例地址

    總結(jié)

    以上是生活随笔為你收集整理的基于ArcGIS JS API 4.11实现对FeatureLayer的多变量渲染的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。