用ArcGIS API for JavaScript制作三维可视化图

时间:2017-01-30 16:19:34   收藏:0   阅读:1490

前段时间接了一个项目,涉及到了空间信息三维可视化的工作。之前在网上查找无意中看到ArcGIS API for JavaScript(以下简称“ArcGIS API”或“该API”)可以在网页上制作三维可视化图。好在有友人在国外帮我把整个文档和API下载下来了,于是就着手学习了一下这个API。

简介

做GIS的肯定清楚ArcGIS是什么,包括一系列的ArcMap、ArcScence、ArcEngine等。ArcGIS推出了这套JavaScript API,现在有4.2版本,该版本可以创建二维、三维的网页应用程序。

下面是官网给出的一些三维可视化的示例。

技术分享  技术分享

技术分享  技术分享

ArcGIS制作可视化图的大体结构为:View 包含 Map 包含 Layer(s) 包含 Graphic(s)。带(s)表示是一个数组。其中

制作可视化图

使用ArcGIS API,需要引用各个组件(Map, SenceView, FeatureLayer ...),各个组件引用的路径在官网文档上会标注。引用时使用require()函数(这里使用TypeScript语法表示变量的类型)

require(modules: Array<String>, callback: function) => void

 

即可将各个组件引用到应用程序中。其中

于是,脚本整体上类似于:

require([
  "esri/Map",
  "esri/views/SceneView",
  "dojo/domReady!"
], function(Map, SceneView) {
  // Code to create the map and view will go here
});

 当然这些脚本要写在一对script标签里。

添加底图

 在ArcGIS API中,所有地图要素都是以对象的形式存在的。要在地图上添加地理地图,就需要创建地理地图对象。Map类的对象就表示一个地理地图。当引用了MA类组件之后,就可以创建其一个Map类的对象了。

var map = new Map({
  basemap: "streets",
  ground: "world-elevation"
});

Map类的属性有这些:

 通过调节这些属性,就可以实现我们想要的地图。

添加视图

我们需要一个视图来对我们所制作的地图进行观察,包括对底图的观察以及其他所有要素的观察。在ArcGIS软件中,如果制作二维地图或进行二维分析,就使用ArcMap软件;如果制作三维地图或进行三维分析,就使用ArcScene软件。在ArcGIS API中也是一样的。我们如果制作二维地图,就使用MapView类的对象创建视图;如果制作三维地图,就使用SceneView类的对象创建视图。

创建一个视图可以的方法与创建底图类似,如

var view = new SceneView({
    container: "viewDiv",
    map: map
});

这个SceneView的属性非常多,日后有空一一列举,与我们制作的三维地图关系较大的有:

一旦创建了视图对象,就会在选定的DOM元素中进行渲染。

添加图层

ArcGIS API提供了丰富的图层可以使用,但是不同的图层代表了不同的含义。这里只分析一下FeatureLayer和GraphicLayer的区别:当图层与某一地理实体相对应时,最好使用FeatureLayer,表示是地理要素的图层,具有实体含义;否则使用GraphicLayer,表示仅仅是一些几何元素,没有地理含义。

我所拿到的项目要可视化的内容具有地理实体含义,所以使用FeatureLayer。一个FeatureLayer对象包含很多属性,可以通过REST服务创建,也可以本地创建。使用REST服务创建需要发布REST服务,然后在url属性上填入REST服务的地址。这里介绍从本地创建FeatureLayer中的要素,官网示例见Sample - Create a FeatureLayer with GeoJSON data

如果要从本地创建要素,需要同时设置FeatureLayer的五个属性:fields、objectIdField、spatialReference、geometryType和source。

除此之外,还有一些属性是非常有用的:

当我们获取到了可视化的数据,首先创建一个Graphic数组,在官网示例中,是这样的

return arrayUtils.map(geoJson.features, function(feature, i) {
    return {
    geometry: new Point({
        x: feature.geometry.coordinates[0],
        y: feature.geometry.coordinates[1]
    }),
    // select only the attributes you care about
    attributes: {
        ObjectID: i,
        title: feature.properties.title,
        type: feature.properties.type,
        place: feature.properties.place,
        depth: feature.geometry.coordinates[2] + " km",
        time: feature.properties.time,
        mag: feature.properties.mag,
        mmi: feature.properties.mmi,
        felt: feature.properties.felt,
        sig: feature.properties.sig,
        url: feature.properties.url
    }
    };
});

这里使用了arrayUtils的方法将一个数组映射为另一个数组。也可以使用foreach循环来完成这件事。将Griphic数组用一个变量保存起来。

fields也需要我们进行创建,官网的示例中创建了如下的属性表:

var fields = [
    {name: "ObjectID",alias: "ObjectID",type: "oid"},
    {name: "title",alias: "title",type: "string"},
    {name: "type",alias: "type",type: "string"},
    {name: "place",alias: "place",type: "string"},
    {name: "depth",alias: "depth",type: "string"},
    {name: "time",alias: "time",type: "date"},
    {name: "mag",alias: "Magnitude",type: "double"},
    {name: "url",alias: "url",type: "string"},
    {name: "mmi",alias: "intensity",type: "double"},
    {name: "felt",alias: "Number of felt reports",type: "double"},
    {name: "sig",alias: "significance",type: "double"}
];

我们现在就可以创建FeatureLayer了,示例代码如下:

var lyr = new FeatureLayer({
    source: graphics, // autocast as an array of esri/Graphic
    // create an instance of esri/layers/support/Field for each field object
    fields: fields, // This is required when creating a layer from Graphics
    objectIdField: "ObjectID", // This must be defined when creating a layer from Graphics
    renderer: quakesRenderer, // set the visualization on the layer
    spatialReference: {
    wkid: 4326
    },
    geometryType: "point", // Must be set when creating a layer from Graphics
    popupTemplate: pTemplate
});

map.add(lyr);

最后一行通过map类对象的add()方法,将该要素图层添加到地图上。其中,quakesRenderer是创建的渲染器,下小节中会详细讲解。

设计渲染器

渲染器是地图显示符号的方法,相当于Echarts中的VisualMap配置项。ArcGIS API中有很多渲染器,我们这里对点符号的渲染可以使用SimpleRenderer,有几个属性

官网设计的渲染器如下所示:

var quakesRenderer = new SimpleRenderer({
symbol: new SimpleMarkerSymbol({
    style: "circle",
    size: 20,
    color: [211, 255, 0, 0],
    outline: {
    width: 1,
    color: "#FF0055",
    style: "solid"
    }
}),
visualVariables: [
{
    type: "size",
    field: "mag", // earthquake magnitude
    valueUnit: "unknown",
    minDataValue: 2,
    maxDataValue: 7,
    // Define size of mag 2 quakes based on scale
    minSize: {
        type: "size",
        expression: "view.scale",
        stops: [
        {value: 1128,size: 12},
        {value: 36111,size: 12},
        {value: 9244649,size: 6},
        {value: 73957191,size: 4},
        {value: 591657528,size: 2}]
    },
    // Define size of mag 7 quakes based on scale
    maxSize: {
        type: "size",
        expression: "view.scale",
        stops: [
        {value: 1128,size: 80},
        {value: 36111,size: 60},
        {value: 9244649,size: 50},
        {value: 73957191,size: 50},
        {value: 591657528,size: 25}]
    }
}]
});

 这个渲染器的效果如下所示

技术分享

 

整体代码

我的项目的整体代码由于现在放假不在电脑里,日后会分享出来。

原文:http://www.cnblogs.com/MSspblxh/p/6273998.html

评论(0
© 2014 bubuko.com 版权所有 - 联系我们:wmxa8@hotmail.com
打开技术之扣,分享程序人生!