arcgis api for js中使用d3.js标注点的属性值代替textsymbol方式

1 篇文章 0 订阅
<img src="https://img-blog.csdn.net/20150511121805752?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvenhnYW9fcmF5/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />
</pre><pre name="code" class="javascript"><pre name="code" class="html"><body>
    <div id="mapDiv">

    </div>
</body>
<script src="http://localhost:3000/content/public/webgit/jslib/esri/api/init.js"></script>
<script type="text/javascript">
require([
    'esri/map',
    'esri/layers/GraphicsLayer',
    'esri/geometry/Point',
    'esri/symbols/TextSymbol',
    'esri/graphic',
    'esri/symbols/SimpleFillSymbol',
    'esri/Color',
    'esri/symbols/SimpleMarkerSymbol',
    'dojo/on',
    'esri/SpatialReference',
    'keepsoft/gis/extlayers/D3AnnoLayer',
    'dojo/domReady!'
], function(Map, GraphicsLayer, Point, TextSymbol, Graphic, SimpleFillSymbol, Color, SimpleMarkerSymbol, on, SpatialReference, AnnoLayer){
    var map = new Map('mapDiv',
        { basemap: "topo", center: [120,30], zoom: 4, sliderStyle: "small" });
    var lyr = new GraphicsLayer({
        id:'textGraphicsLayer'
    });
    map.addLayer(lyr);

    on(map, 'load', function(){
        var point = new Point(120, 30, new SpatialReference(4326));
        var symbol = new SimpleMarkerSymbol('circle');
        var g = new Graphic(point, symbol, {
            stcd:'aaa',
            stnm:'bbb'
        });
        lyr.add(g);

        var d3AnnoLayer = new AnnoLayer(map, lyr, {
            rectWidth:160,
            labelDx:10
        });
        d3AnnoLayer.init();
    })
    
    

})
</script>


 
</pre><pre name="code" class="javascript">define('keepsoft/gis/extlayers/D3AnnoLayer',
[
	'dojo/_base/declare',
	'dojo/_base/lang',
	'd3/d3',
	'dojo/on',
	'esri/Evented',
	'esri/geometry/screenUtils'
],
function(declare, lang, d3js, on, Evented, screenUtils){
	var d = declare([Evented], {
		declaredClass:'keepsoft.gis.extlayers.D3AnnoLayer',
		_eventMap:{

		},
		option:{
			labelFields:[
				'stcd','stnm'
			],
			labelPrifixes:[
				'编码:','名称:'
			],
			labelSuffixes:[
				'',''
			],
			rectRadius:5,
			rectWidth:120,
			rectOffsetX:0,
			rectOffsetY:16,
			rectFillColor:'rgba(20,20,20,0.4)',
			rectStrokeColor:'rgba(255,255,255,1)',
			rectStrokeWidth:2,
			labelHeigth:23,
			labelVerticalAlign:4,
			labelsPaddingTop:2,
			labelsPaddingBottom:2,
			labelsPaddingLeft:2,
			labelsPaddingRight:2,
			fontSize:24,
			fontColor:'rgba(220,20,20,1)',
			labelDx:20
		},
		constructor:function(map, graphicsLayer, opt){
			//1.全局参数
			this.map = map;
			this.graphicsLayer = graphicsLayer;
			//2.合并参数
			lang.mixin(this.option, opt);
			//3.创建svg group
			this.domId = this.graphicsLayer.id+'-d3anno';
			d3js.select('#'+this.map.id+'_gc')
				.append('g')
				.attr({
					'id':this.domId
				});
		},
		init:function(){
			var map = this.map;
			on(map, 'pan', lang.hitch(this, this._pan));
			on(map, 'zoom-start', lang.hitch(this, this._zoomStart));
			on(map, 'zoom-end', lang.hitch(this, this._zoomEnd));
			this._initialize();
		},
		_initialize:function(){
			this._removeAllChildren();
			this._draw();
		},
		_removeAllChildren:function(){
			dojo.empty(this.domId);
		},
		_draw:function(){
			if (!this.option.labelFields){
				return;
			}

			for (var i =0; i < this.graphicsLayer.graphics.length; i++){
				var g = this.graphicsLayer.graphics[i];
				this._drawBgShape(g);
				this._drawText(g);
			}
		},
		_drawBgShape:function(graphic){
			var geometry = graphic.geometry;
			var o = this.option;
			var labelNum = o.labelFields.length;
			var shapeHeight = o.labelsPaddingTop + (o.fontSize+o.labelVerticalAlign)*labelNum + o.labelsPaddingBottom;
			var shapeWidth = o.rectWidth;
			var x = 0, y=0;
			var map = this.map;
			var mapExtent = map.extent;
			var mapWidth = map.width;
			var mapHeight = map.height;
			var xy = screenUtils.toScreenPoint(mapExtent, mapWidth, mapHeight, geometry);
			var _mvr = map.__visibleRect;
			x = xy.x - _mvr.x - shapeWidth/2 + o.rectOffsetX;
			y = xy.y - _mvr.y + o.rectOffsetY;
			/*
			console.log(xy);
			console.log(_mvr);
			console.log(shapeHeight);
			*/
			d3js.select('#'+this.domId)
				.append('rect')
				.attr({
					'x':x,
					'y':y,
					'width':shapeWidth,
					'height':shapeHeight,
					'fill':o.rectFillColor,
					'stroke':o.rectStrokeColor,
					'stroke-width':o.rectStrokeWidth,
					'rx':o.rectRadius,
					'ry':o.rectRadius
				})
		},
		_drawText:function(graphic){
			var geometry = graphic.geometry;
			var o = this.option;
			var labelNum = o.labelFields.length;
			var shapeHeight = o.labelsPaddingTop + (o.fontSize+o.labelVerticalAlign)*labelNum - o.labelAlign + o.labelsPaddingBottom;
			var shapeWidth = o.rectWidth;
			var x = 0, y=0;
			var map = this.map;
			var mapExtent = map.extent;
			var mapWidth = map.width;
			var mapHeight = map.height;
			var xy = screenUtils.toScreenPoint(mapExtent, mapWidth, mapHeight, geometry);
			var _mvr = map.__visibleRect;
			x = xy.x - _mvr.x -shapeWidth/2 + o.rectOffsetX;
			y = xy.y - _mvr.y + o.rectOffsetY;
			var node = d3js.select('#'+this.domId);
			var labelNum = o.labelFields.length;
			for (var i=0; i < labelNum; i++){
				var labelX = x + o.labelsPaddingLeft || 0;
				var labelY = y + o.labelsPaddingTop+o.fontSize+(o.fontSize+o.labelVerticalAlign)*i || 0;
				var fstring = graphic.attributes[o.labelFields[i]] || '';
				var prefix = o.labelPrifixes[i] || '';
				var suffix = o.labelSuffixes[i] || '';
				var text = prefix + fstring + suffix;
				node.append('text')
					.attr({
						'x':labelX,
						'y':labelY,
						'fill':o.fontColor,
						'font-size':o.fontSize,
						'dx':o.labelDx
					})
					.text(text);
			}
				
		},

		_pan:function(e){
			//console.log(e);
			var dx = e.delta.x;
			var dy = e.delta.y;
			var _dx = this.map.__visibleRect.x+dx;
			var _dy = this.map.__visibleRect.y+dy;
			d3.select('#'+this.domId)
				.attr({
					'transform':'matrix(1,0,0,1,'+_dx+','+_dy+')'
				})
		},
		_zoomStart:function(){
			this._removeAllChildren();
		},
		_zoomEnd:function(){
			d3.select('#'+this.domId)
				.attr({
					'transform':'matrix(1,0,0,1,0,0)'
				})
			this._draw();
		}
	});
	return d;
})
使用d3.js创建svg,通过侦听map的事件,重绘svg,实现对graphic要素在地图上的标注。
希望对大家有用。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
ArcGIS API for JavaScript 4.x 包含了一个名为 Wind.js 的模块,用于绘制风场效果。Wind.js 是一个由 Vladimir Agafonkin 开发的 JavaScript 库,用于在 Web 上渲染大规模天气数据。 使用 Wind.js 可以轻松地绘制出具有流动感的风场效果,可以在地图上显示风向和风速等信息。在 ArcGIS API for JavaScript 4.x ,可以通过导入 Wind.js 模块并使用该模块提供的方法来实现风场效果的绘制。 以下是一个使用 ArcGIS API for JavaScript 4.x 和 Wind.js 绘制风场效果的示例代码: ```javascript require([ "esri/Map", "esri/views/SceneView", "esri/layers/GraphicsLayer", "esri/Graphic", "dojo/domReady!" ], function(Map, SceneView, GraphicsLayer, Graphic) { // 创建地图 var map = new Map({ basemap: "streets", ground: "world-elevation" }); // 创建场景视图 var view = new SceneView({ container: "viewDiv", map: map, camera: { position: [-118.244, 34.052, 25000], tilt: 70 } }); // 创建图形图层 var graphicsLayer = new GraphicsLayer(); map.add(graphicsLayer); // 导入 Wind.js 模块 require([ "widgets/Wind-js/wind-js" ], function(wind) { // 加载风场数据 var url = "data/wind-global.json"; fetch(url).then(function(response) { return response.json(); }).then(function(data) { // 创建 Wind.js 实例 var windLayer = new wind.WindGL({ map: map, data: data, colorScale: [ [65, 105, 225, 0.5], [255, 255, 255, 1.0], [255, 255, 0, 1.0], [255, 0, 0, 1.0], [128, 0, 128, 1.0], [0, 0, 255, 1.0], [0, 255, 255, 1.0], [0, 255, 0, 1.0], [255, 255, 255, 1.0] ] }); // 将风场效果添加到图形图层 graphicsLayer.add(new Graphic({ geometry: windLayer.getGeometry(), symbol: windLayer.getSymbol() })); }); }); }); ``` 在这个示例代码,我们首先创建了一个地图和一个场景视图,并将其显示在页面上。然后我们创建了一个图形图层,用于显示风场效果。接着,我们通过导入 Wind.js 模块和加载风场数据来创建了一个 Wind.js 实例,并将其添加到图形图层。最后,我们将图形图层添加到地图,完成了风场效果的绘制。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值