如何解决ArcGIS JS - 如何在渲染之前通过测试一个属性与另一个属性来设置多边形的样式?
我目前正在尝试使用 ArcGIS JS API 来显示随时间推移的土地利用的简单 web 地图。目的是将土地使用从 1996 年到 2018 年发生变化的任何多边形涂成橙色(即:如果(NAME_1996 != NAME_2018)那么...)。如果名称保持不变,则多边形将显示为蓝色。
数据是来自 Esri 托管内容服务的查询 geoJSON 文件。
我知道在 Leaflet 中,geoJSON 数据可以在渲染之前在每个特征上进行处理和样式化。然而,我能找到的与ArcGIS JS相似的是UniqueValueRenderer,它只允许测试一个字段。我意识到可以通过对数据进行预处理以向数据集添加 HAS_CHANGED(真/假)列来解决这个问题,但这看起来很简单,应该可以即时实现。
文档中的This page 解释了 UnqiueValueRenderer。
示例代码:
<!DOCTYPE html>
<html>
<head>
<Meta charset="utf-8" />
<Meta
name="viewport"
content="initial-scale=1,maximum-scale=1,user-scalable=no"
/>
<title>Load a basic WebMap - 4.12</title>
<!-- jquery -->
<script src="https://code.jquery.com/jquery-3.6.0.js" integrity="sha256-H+K7U5CnXl1h5ywQfKtSj8PCmoN9aaq30gDh27Xc0jk=" crossorigin="anonymous"></script>
<style>
html,body,#viewDiv {
padding: 0;
margin: 0;
height: 100%;
width: 100%;
}
</style>
<link
rel="stylesheet"
href="https://js.arcgis.com/4.12/esri/themes/light/main.css"
/>
<script src="https://js.arcgis.com/4.12/"></script>
<script>
require([
"esri/Map","esri/views/MapView","esri/layers/TileLayer","esri/layers/FeatureLayer","esri/renderers/SimpleRenderer","esri/symbols/SimpleFillSymbol","esri/symbols/SimpleLinesymbol","esri/config"
],function(Map,MapView,TileLayer,FeatureLayer,SimpleRenderer,SimpleFillSymbol,SimpleLinesymbol,Query,esriConfig) {
esriConfig.apiKey = KEY_GOES_HERE
const map = new Map({
basemap: "satellite" // Basemap layer service
});
function returnRenderer(name_1996,name_2018) {
if (name_1996 != name_2018) {
renderer = {
type: "simple",symbol: {
type: "simple-fill",size: 6,color: "orange",outline: {
width: 0.5,color: "white"
}
}
};
} else {
renderer = {
type: "simple",color: "blue",color: "white"
}
}
};
}
return renderer
}
var view = new MapView({
container: "viewDiv",map: map,center: [176.13567895574866,-37.71157953908512],zoom: 15
});
popup_landcover = {
"title":"{NAME_2018} (2018)","content":"Landcover type in 1996: {NAME_1996}<br>Landcover type in 2018: {NAME_2018}"
}
var layer_landcover = new FeatureLayer({
url: "https://services.arcgis.com/PyaTLAnbSEVNXOpB/arcgis/rest/services/iris_Landcover_NZ_v5/FeatureServer",outFields: ["NAME_2018","NAME_1996"],popupTemplate: popup_landcover,renderer: returnRenderer( ???? )
})
map.add(layer_landcover);
</script>
</head>
<body>
<div id="viewDiv"></div>
</body>
</html>
解决方法
数据处理:
好的,这需要对数据进行一些变通和预处理。最终,我确实创建了一个名为“Changed”的新字段,其中存储了一个二进制值:0 表示假(土地用途没有随时间变化),1 表示真(土地用途随时间变化)。>
有关在 ArcGIS Online 中创建新字段的注意事项:
无论是使用 Arcade 还是 SQL 查询,都无法计算字段值。这是通过使用 QGIS 解决的。
新数据集的可视化:
然后将该图层作为托管要素图层重新上传到 ArcGIS Online。在应用程序中,使用了单个 ClassBreaksRenderer,中断分别设置为 0 和 1。然后用单独的符号对它们进行着色。看下面的代码就清楚多了:
symbol_same = {
type: "simple-fill",color: 'blue',outline: { // autocasts as new SimpleLineSymbol()
width: 1,color: "white"
}
}
symbol_changed = {
type: "simple-fill",color: 'orange',color: "white"
}
}
var renderer = {
type: "class-breaks",field: "Changed",classBreakInfos: [
{
minValue: 0,maxValue: 0,symbol: symbol_same,label: "Area unchanged"
},{
minValue: 1,maxValue: 1,symbol: symbol_changed,label: "Area changed"
}
]
};
var layer_landcover = new FeatureLayer({
url: "https://services.arcgis.com/PyaTLAnbSEVNXOpB/arcgis/rest/services/landcover_edited/FeatureServer",outFields: ["NAME_2018","NAME_1996","Changed"],popupTemplate: popup_landcover,renderer: renderer
})
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。