Openlayers 教程 - 基于 Openlayers api 实现空间查询(客户端):点选、范围查询

news/2024/11/27 2:25:05/

Openlayers 教程 - 基于 Openlayers api 实现空间查询(客户端):点选、范围查询

  • 客户端空间查询
    • 核心代码
    • 在线示例

客户端空间查询

在地理信息系统中,空间查询有的非常重要的作用,几乎所有地图相关的业务系统都需要空间查询

空间查询一般指:基于空间数据的查询,一般包括点选、线段查询、多边形查询、缓冲分析、范围查询等。

由于空间数据的特殊原因,空间查询往往基于服务端系统,通过数据库进行查询,构建索引之后,查询速度会有很大的提升。

但是对于一些简易的地图业务系统,不依赖空间数据库,因此不能使用服务端的空间查询。

在之前的业务系统中,遇到过类似的空间查询场景,解决办法一般是使用 turf 或者 jsts 来实现客户端空间查询;

昨天偶然发现 Openlayers 的矢量图层(VectorSource)自带一些空间查询方法,可以实现简单的空间查询。

Openlayers 可以实现的空间查询:点选查询和范围查询。

本文包括核心代码和在线示例两部分。


核心代码

1. 应用函数

获取范围内图形要素

获取范围内图形要素(回调函数)

获取坐标点相交的图形要素

获取坐标点最近的图形要素

2. 创建随机数据,包括点线面数据。

// 默认范围
const bbox = [115.44400430633583, 39.20776490257249, 117.44351602508583, 40.84472779319749];let number = 30;
// 模拟随机点数据
const points = turf.randomPoint(// 模拟数量number,{// 范围bbox: bbox})// 模拟随机线段数据
const lineStrings = turf.randomLineString(// 模拟数量number,{// 范围bbox: bbox,// 顶点数量num_vertices: 10,// 最大长度max_length: 0.1,// 最大角度max_rotation: Math.PI / 8})// 模拟随机多边形
const polygons = turf.randomPolygon(// 模拟数量number,{// 范围bbox: bbox,// 最大辐射长度max_radial_length: 0.1,// 顶点数量num_vertices: 10})const randomObject = {'Point': points,'LineString': lineStrings,'Polygon': polygons,
}// 清空数据,添加数据
layerQuery.getSource().clear();
layerQuery.getSource().addFeatures(getFeatureByGeoJson(randomObject.Point));
layerQuery.getSource().addFeatures(getFeatureByGeoJson(randomObject.LineString));
layerQuery.getSource().addFeatures(getFeatureByGeoJson(randomObject.Polygon));
  1. 创建标绘事件。

注意:这里的事件类型只有 PointExtent,并且 Extent 需要 Circleol.interaction.Draw.createBox(4)

let geometryFunction = ol.interaction.Draw.createBox(4);drawObject = new ol.interaction.Draw({source: layer.getSource(),type: type,geometryFunction: type === 'Circle' ? geometryFunction : undefined,
});

3. 判断是否相交。

这里需要注意的是,由于点选是点数据的原因,选中点数据和线段数据的难度比较大,因此这里使用的是获取最近的数据。

而且,判断只留下 200 米以内的数据;这里的判断也可以根据 zoom 值来调整,比如地图等级 10 级的时候设置 500 米以内。

// 确定容差范围:200米
function available(feature1, feature2) {const line = new ol.geom.LineString([feature1.getGeometry().getCoordinates(),feature2 instanceof Array ? feature2 : feature2.getGeometry().getCoordinates()]);const len = ol.sphere.getLength(line, {projection: 'EPSG:4326'});return len <= 200;
}// 点选查询
if (e.feature.getGeometry().getType() === 'Point') {// 获取最近的图形要素,这里给的范围为 200米以内的数据feature = layerQuery.getSource().getClosestFeatureToCoordinate(e.feature.getGeometry().getCoordinates());// 点和线可以允许容差,多边形需要再内部才认为查询到switch (feature.getGeometry().getType()) {case 'Point':if (!available(e.feature, feature)) {feature = undefined;}break;case 'LineString':// getFeaturesAtCoordinateconst point = feature.getGeometry().getClosestPoint(e.feature.getGeometry().getCoordinates());if (!available(e.feature, point)) {feature = undefined;}break;case 'Polygon':if (!feature.getGeometry().intersectsCoordinate(e.feature.getGeometry().getCoordinates())) {feature = undefined;}break;}// 改变样式feature && feature.setStyle(selectedStyle);// 范围查询
} else {// 查询范围内数据feature = layerQuery.getSource().getFeaturesInExtent(e.feature.getGeometry().getExtent());
}

在线示例

专门为地图开发人员准备的地图工具:在线地图工具

Openlayers api 实现空间查询:OpenLayers space query

在这里插入图片描述


http://www.ppmy.cn/news/220234.html

相关文章

R2 和 RMSE

要点&#xff1a; 一 简介 R2&#xff08;决定系数&#xff09;和RMSE&#xff08;均方根误差&#xff09;是常用的回归模型评估指标&#xff0c;用于衡量模型对观测数据的拟合程度和预测精度。以下是它们的计算方法&#xff1a; R2&#xff08;决定系数&#xff09;&#xf…

esxi从6.0升级到6.7

###检查主机是否在维护模式 [rootlocalhost:~] vim-cmd /hostsvc/hostsummary | grep inMaintenanceMode inMaintenanceMode true,##检查升级包 [rootlocalhost:~] esxcli software sources profile list -d /vmfs/volumes/5e7ab5b5-35d557e8-c053-10517255d4d3…

DC1-3靶机总结

DC-1总结 测试思路 1.信息搜集&#xff0c;端口&#xff0c;操作系统&#xff0c;服务 2.访问网站&#xff0c;对网站进行信息搜集&#xff0c;cms&#xff0c;敏感文件robots.txt,后台登录界面&#xff0c;多注意一下源码&#xff0c;可能存在一些敏感信息&#xff0c;中间件…

5-24V蓝牙音箱芯片FP5207XR-G1大功率升降压DC-DC外置MOS

概述 FP5207是异步升压控制IC&#xff0c;透过EXT Pin控制外部NMOS&#xff0c;输入低启动电压2.8V与宽工作电压5V~24V&#xff0c;单节锂电池3V~4.2V应用&#xff0c;将Vout接到HVDD Pin&#xff1b;精准的反馈电压1.2V&#xff0c;内置软启动&#xff0c;工作频率由外部电阻…

高音质高性价比蓝牙音箱解决方案

高音质高性价比蓝牙音箱解决方案 1.蓝牙模块&#xff1a;RB103&#xff08;蓝牙4.0&#xff09; 2.蓝牙协议&#xff1a;音乐播放&#xff08;A2DP&#xff09;、流媒体控制&#xff08;AVRCP&#xff09;、免提通话&#xff08;HFP&#xff09; 3.实现功能&#xff1a;开/关机…

什么牌子的蓝牙耳机性价比高?耐用音质好的性价比蓝牙耳机

随着科技的发展&#xff0c;无线蓝牙耳机给我们带来的便利生活&#xff0c;使得越来越受大众的欢迎&#xff0c;咱们平时使用的有线耳机&#xff0c;使用起来比较麻烦&#xff0c;每次使用前首先要做的就是解开缠绕的耳机线&#xff0c;而无线蓝牙耳机就方便很多&#xff0c;只…

小爱音箱连接Windows蓝牙没有声音

问题&#xff1a;使用Windows&#xff08;win10、win11&#xff09;电脑蓝牙连接上了小爱音箱&#xff0c;在蓝牙设备中能看到小爱音箱以配对或者已连接&#xff0c;但是在输出设备中却找不到小爱音箱&#xff0c;怎么办&#xff1f; 详细的问题由于没截图&#xff0c;这里引用…

JL 杰理 AC692N系列TWS 蓝牙音箱 开发

一、简要说明 随着时间的推移&#xff0c;TWS蓝牙技术也广泛应用于音箱当中&#xff0c;主要采用relay转发模式。目前杰理公司所推出针对音箱方案的是AC692N系列&#xff0c;也必将成为今后一年内的音箱产品的主选方案。 二、开发细节 &#xff08;一&#xff09;连接方式选择 …