缓冲区分析是地理信息系统中的空间分析基本功能之一,是众多空间分析方法的基础。缓冲区分析是指为了识别某地理实体或空间物体对其周围的邻近性或影响度而在其周围建立的一定宽度的带状区。
缓冲区介绍
缓冲区分析是地理信息系统最重要和最基本的空间操作功能之一。缓冲区指的是以点、线、面实体基础,在其周边建立一定范围的面状区域。缓冲区在空间分析中是十分常见的,例如:
- 点缓冲区分析:噪音污染源所影响的一定空间范围、爆炸影响范围等;
- 线缓冲区分析:道路两侧绿化面积、江景楼盘面积等;
- 面缓冲区分析:公共设施(商场、邮局、银行、医院等)的服务半径,大型水库建设引起的搬迁等
本文主要介绍如何使用ArcGIS API for JavaScript建立点线面的缓冲区。
GeometryService介绍
GeometryService是一个可以用来调用ArcGIS Server的几何服务的工具类,通过GeometryService,我们可以很简便的做一些基本的几何操作,比如联合、剪切、简化以及缓冲区等,本文主要介绍缓冲区操作。
GeometryService的构造函数只有一个参数,一个有效的符合ArcGIS REST风格的GeometryServer服务地址:
var geometryService=new GeometryService("https://utility.arcgisonline.com/ArcGIS/rest/services/Geometry/GeometryServer");
我们可以使用ArcGIS公开的服务地址:https://utility.arcgisonline.com/ArcGIS/rest/services/Geometry/GeometryServer。但是该服务毕竟在国外的服务器,稳定性不强,如果大家有自己的ArcGIS Server,可以直接使用ArcGIS server中自带的几何服务,获取方法如下:
1、登入ArcGIS Server Manager,在【utilities】文件夹下找到几何服务
2、点击【功能】REST URL即我们需要的地址
创建缓冲区
获得需要绘制缓冲区的几何图形
在创建缓冲区前我们要先指定要绘制缓冲区的图形,我们的需求一般分两种:
- 给已有图层的图形绘制缓冲区;
- 动态绘制图形,然后自动创建缓冲区;
如果是我们要给图层的图形创建缓冲区,我们可以调用FeatureLayer.graphics
获得一个Graphic数组,然后再分别获得Graphic.geometry获得一个图形数组:
var featureLayer=new FeatureLayer(...)
featureLayer.on("load",function(){
for(var i=0;i<featureLayer.graphics.length;i++){
var geometries=featureLayer.graphics[i].geometry
}
})
这个图形数组也可以是通过查询获得,具体做法请参考空间查询—ArcGIS API for JavaScript。
我们也可以直接添加图形,然后自动给这个图形创建缓冲区:
var points=[new Point(116.026,28.6826),new Point(116.05,28.66),new Point(116.11,28.70),new Point(115.95,28.65)];
var polylines=[new Polyline([[115.88,28.70],[115.88,28.67]]),new Polyline([[115.82,28.64],[115.89,28.59]])];
var polygons=[new Polygon([[115.798499,28.783553],[115.75998,28.895433],[115.900834,28.821535],[115.785276,28.759237],[115.713987,28.733902]])];
map.on("load",function(){
var lineSymbol=new SimpleLineSymbol(SimpleLineSymbol.STYLE_SOLID,new Color([255,0,0]), 4)
var markerSymbol=new SimpleMarkerSymbol(SimpleMarkerSymbol.STYLE_CIRCLE, 10,
new SimpleLineSymbol(SimpleLineSymbol.STYLE_SOLID,new Color([100,100,100,0.1]), 1),
new Color([255,0,0]));
var fillSymbol=new SimpleFillSymbol(SimpleFillSymbol.STYLE_SOLID,