ArcGIS For JavaScript API Feature layer hover(功能图层的悬浮)————(二十六)

本文介绍如何使用ArcGIS JavaScript API实现地图上县区域的鼠标悬浮事件,展示人口统计数据等信息。通过定义FeatureLayer并设置鼠标事件,能够高亮显示选中的县并弹出包含详细信息的提示框。

查看原文:ArcGIS For JavaScript API Feature layer hover —— 功能图层的悬浮

描述:

 在”South Carolina南卡罗来纳州“的县上进行鼠标悬浮,跳出提示框。鼠标事件进行控制其显示方式。

重要代码:

(1)控制显示的州

var southCarolinaCounties=new esri.layers.FeatureLayer("http://sampleserver1.arcgisonline.com/ArcGIS/rest/services/Demographics/ESRI_Census_USA/MapServer/3",{
          mode
: esri.layers.FeatureLayer.MODE_SNAPSHOT,
          outFields
:["NAME","POP2000","POP2007","POP00_SQMI","POP07_SQMI"]
});
southCarolinaCounties
.setDefinitionExpression("STATE_NAME = 'South Carolina'");

(2)高亮图表定义

(3)鼠标事件

 参考联接:http://help.arcgis.com/en/webapi/javascript/arcgis/jssamples/#sample/fl_hover

 在线演示:http://help.arcgis.com/en/webapi/javascript/arcgis/samples/fl_hover/index.html

 

 代码如下:


<!DOCTYPE html>
<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=7,IE=9">
    <!--The viewport meta tag is used to improve the presentation and behavior of the samples on iOS devices-->
    <meta name="viewport" content="initial-scale=1, maximum-scale=1,user-scalable=no">
    <title>Feature Layer - display results as an InfoWindow onHover</title>

    <link rel="stylesheet" href="http://serverapi.arcgisonline.com/jsapi/arcgis/3.3/js/dojo/dijit/themes/claro/claro.css">
    <link rel="stylesheet" href="http://serverapi.arcgisonline.com/jsapi/arcgis/3.3/js/esri/css/esri.css">
    <style>
      html, body, #mapDiv {
        padding:0;
        margin:0;
        height:100%;
      }
    </style>

    <script src="http://serverapi.arcgisonline.com/jsapi/arcgis/3.3/"></script>
    <script>
      dojo.require("esri.map");
      dojo.require("esri.layers.FeatureLayer");
      dojo.require("dijit.TooltipDialog");
      dojo.require("dojo.number");
      
      var map, dialog;
		
	 // 初始化事件
      function init() {
        map = new esri.Map("mapDiv", {
          basemap: "streets",  // 指定的地图底图.有效选项:"streets","satellite","hybrid","topo","gray","oceans","national-geographic","osm".
          center: [-80.94, 33.646],
          zoom: 8
        });
        
		//  定义一个功能层
        var southCarolinaCounties = new esri.layers.FeatureLayer("http://sampleserver1.arcgisonline.com/ArcGIS/rest/services/Demographics/ESRI_Census_USA/MapServer/3", {
          mode: esri.layers.FeatureLayer.MODE_SNAPSHOT,	// 此模式下,该feature layer检索所有有关的层的资源,并作为推那个显示在客户端,一旦被添加到地图上, 会触发onUpdateEnd事件
          outFields: ["NAME", "POP2000", "POP2007", "POP00_SQMI", "POP07_SQMI"]	// 显示的字段
        });
        southCarolinaCounties.setDefinitionExpression("STATE_NAME = 'South Carolina'");	// 只有匹配的才会被显示,这里是 ”South Carolina南卡罗来纳州“

		// 定义一个填充符号
        var symbol = new esri.symbol.SimpleFillSymbol(
			esri.symbol.SimpleFillSymbol.STYLE_SOLID, 
			new esri.symbol.SimpleLineSymbol(	//线型符号
				esri.symbol.SimpleLineSymbol.STYLE_SOLID, 	//样式,STYLE_DASH,STYLE_DASHDOT,STYLE_DASHDOTDOT,STYLE_DOT,STYLE_NULL,STYLE_NULL
				new dojo.Color([255,255,255,0.35]),	// 颜色
				1	// 像素
			),
			new dojo.Color([125,125,125,0.35])
		);
        southCarolinaCounties.setRenderer(new esri.renderer.SimpleRenderer(symbol));	// 设置功能层的渲染
        map.addLayer(southCarolinaCounties);	// 添加到地图

        map.infoWindow.resize(245,125);	// 设置信息框的大小
        
        dialog = new dijit.TooltipDialog({
          id: "tooltipDialog",
          style: "position: absolute; width: 250px; font: normal normal normal 10pt Helvetica;z-index:100"
        });
        dialog.startup();	// 开启
        
		// 高亮线
        var highlightSymbol = new esri.symbol.SimpleFillSymbol(
			esri.symbol.SimpleFillSymbol.STYLE_SOLID,
			new esri.symbol.SimpleLineSymbol(
				esri.symbol.SimpleLineSymbol.STYLE_SOLID, 
				new dojo.Color([255,0,0]),
				3
			),
			new dojo.Color([125,125,125,0.35])
		);

        //当鼠标离开的高亮图形,关闭对话框
        dojo.connect(map, "onLoad", function(){
          map.graphics.enableMouseEvents();	// 开启鼠标事件
          dojo.connect(map.graphics,"onMouseOut",closeDialog);        	
        });
                
        //listen for when the onMouseOver event fires on the countiesGraphicsLayer
        //when fired, create a new graphic with the geometry from the event.graphic and add it to the maps graphics layer
        dojo.connect(southCarolinaCounties, "onMouseOver", function(evt) {
          var t = "<b>${NAME}</b><hr><b>2000 人口: </b>${POP2000:NumberFormat}<br/>"
                             + "<b>2000 Population per Sq. Mi.: </b>${POP00_SQMI:NumberFormat}<br/>"
                             + "<b>2007 人口: </b>${POP2007:NumberFormat}<br/>"
                             + "<b>2007 Population per Sq. Mi.: </b>${POP07_SQMI:NumberFormat}";
	
          var content = esri.substitute(evt.graphic.attributes,t);	// dojo.string.substitute(),可以处理通配符形式
          var highlightGraphic = new esri.Graphic(
		  		evt.graphic.geometry,
				highlightSymbol
		  );
          map.graphics.add(highlightGraphic);	// 将图标加入图形中
          
          dialog.setContent(content);	// 设置弹窗内容

          dojo.style(dialog.domNode, "opacity", 0.85);	// 透明度
          dijit.popup.open({popup: dialog, x:evt.pageX,y:evt.pageY});	// 弹出位置
        });
      }
    
      function closeDialog() {
        map.graphics.clear();	// 清除图形
        dijit.popup.close(dialog);	// 关闭弹出框
      }

      dojo.ready(init);
    </script>
  </head>
  <body class="claro">
  将鼠标悬停在南卡罗来纳州的一个县,以获得更多的信息。
  <div id="mapDiv"></div>
  </body>
</html>


 效果如下:

 

 

 

 

 

 

 

 

 

<think>我们正在处理一个关于ArcGIS API for JavaScript的问题:用户想要对FeatureLayer执行缓冲区查询。根据引用资料,我们知道FeatureLayer是用于操作和显示特征数据的图层。用户需要一个缓冲区查询的示例。 缓冲区查询通常涉及以下步骤: 1. 创建一个FeatureLayer实例。 2. 定义一个几何(点、线或面)作为缓冲区的中心。 3. 在该几何周围创建一个缓冲区(多边形)。 4. 使用该缓冲区作为空间过滤器来查询FeatureLayer,获取落在缓冲区内的特征。 在ArcGIS API for JavaScript中,我们可以使用GeometryService来创建缓冲区,然后使用Query对象和FeatureLayer的queryFeatures方法执行查询。 注意:GeometryService是一个独立的服务,需要ArcGIS Server的GeometryService支持。 我们将按照以下步骤编写代码: 1. 加载所需的模块(FeatureLayer, GeometryService, BufferParameters, Query等)。 2. 创建FeatureLayer实例。 3. 创建GeometryService实例(指向可用的GeometryService)。 4. 定义缓冲区参数(几何、距离、单位等)。 5. 使用GeometryService执行缓冲区操作,得到缓冲区多边形。 6. 构建一个Query对象,设置其geometry为缓冲区多边形,并设置空间关系(spatialRelationship)为包含或相交。 7. 使用FeatureLayer的queryFeatures方法执行查询,处理返回的结果。 下面是一个示例代码:</think>### ArcGIS API for JavaScript 实现 FeatureLayer 缓冲区查询 在 ArcGIS API for JavaScript 中,对 `FeatureLayer` 执行缓冲区查询需要以下步骤: #### 1. **创建 FeatureLayer** 首先初始化特征图层,确保设置了正确的 URL 或 GeoJSON 数据源: ```javascript require(["esri/layers/FeatureLayer"], function(FeatureLayer) { const featureLayer = new FeatureLayer({ url: "https://services.arcgis.com/.../FeatureServer/0", // 替换为实际服务URL outFields: ["*"] // 返回所有字段 }); map.add(featureLayer); // 将图层添加到地图 }); ``` #### 2. **执行缓冲区查询** 使用 `geometryEngine` 生成缓冲区,然后构建空间查询: ```javascript require(["esri/geometry/geometryEngine", "esri/tasks/support/Query"], function(geometryEngine, Query) { // 步骤1:定义中心点和缓冲区半径 const centerPoint = { // 示例点坐标 type: "point", longitude: -118.15, latitude: 33.80 }; const bufferDistance = 10; // 缓冲距离(单位:千米) // 步骤2:生成缓冲区多边形 const bufferPolygon = geometryEngine.geodesicBuffer( centerPoint, bufferDistance, "kilometers" ); // 步骤3:构建查询对象 const query = new Query({ geometry: bufferPolygon, // 使用缓冲区作为查询范围 spatialRelationship: "intersects", // 空间关系:相交 returnGeometry: true, outFields: ["*"] }); // 步骤4:执行查询 featureLayer.queryFeatures(query) .then(function(results){ console.log("查询结果:", results.features); // 处理结果:高亮显示/弹窗等 }) .catch(function(error){ console.error("查询失败:", error); }); }); ``` #### 关键参数说明: - **空间关系 (`spatialRelationship`)**: - `intersects`:返回与缓冲区相交的要素(最常用) - `contains`:完全包含在缓冲区内的要素 - `within`:要素完全包含缓冲区(较少用) - **缓冲区类型**: - `geometryEngine.geodesicBuffer()`:考虑地球曲率的精确缓冲区(推荐) - `geometryEngine.buffer()`:平面坐标系缓冲区 #### 3. **结果可视化** 在查询回调中可添加结果渲染: ```javascript results.features.forEach(function(feature){ feature.symbol = { // 自定义符号 type: "simple-fill", color: [255, 0, 0, 0.5], outline: { width: 2, color: "red" } }; graphicsLayer.add(feature); // 添加到图形图层 }); ``` #### 注意事项: 1. **服务支持**:确保 FeatureLayer 的 REST 服务启用了 `query` 操作 2. **坐标系匹配**:缓冲区几何与图层坐标系需一致 3. **性能优化**:对于大数据量图层,建议设置 `where` 条件缩小查询范围 [^1]: FeatureLayer 支持空间查询和属性过滤,可通过定义表达式优化性能 [^2]: 使用 GeometryService 可处理复杂空间运算,但需额外配置服务 [^3]: 查询结果可通过 Graphic 对象渲染,实现交互式可视化 --- ### 相关问题 1. **如何优化 FeatureLayer 缓冲区查询的性能?** - 建议方案:使用 `where` 子句过滤数据量,设置合理的 `maxRecordCount` 2. **FeatureLayer 与 GraphicsLayer 在渲染查询结果时的区别?** - 关键差异:FeatureLayer 连接动态服务,GraphicsLayer 只处理客户端图形 3. **如何处理跨日期变更线的缓冲区查询?** - 解决方案:使用 `geometryEngine.geodesicBuffer()` 自动处理坐标系转换 4. **如何将缓冲区查询结果导出为 GeoJSON?** - 实现方法:通过 `esriRequest` 模块转换查询结果为标准格式
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值