arcgis api for js中使用d3.js标注graphic替代textsymbol方式

先看效果

230821_j0t9_1858137.png

js代码:

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;
})

 

页面

<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>

 

使用d3创建svg,侦听map事件,实现对graphic的attributes进行标注。

希望能有用。

转载于:https://my.oschina.net/u/1858137/blog/413067

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
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 实例,并将其添加到图形图层。最后,我们将图形图层添加到地图,完成了风场效果的绘制。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值