缓冲区分析
(一)获取图层的features
1. 问:
openlayers 怎么获取 图层的features?? 试了好久 都不行,脑子有点乱
2. 答:
方法一:
layer.getSource().getFeatures()
你这里没拿到是因为上面定义layer得时候,用得是geoserver的url, 他这个返回是有点时间的,所以你这里console.log就会是空。
你随便写个 map.on('click 事件
在那里面你再打印,就会发现能拿到feature
方法二:
这个延迟的话,可以注册 Vector 数据源对象的 featuresloadend事件的处理函数试试
source.on(‘featuresloadened’, () => { })
虽然我不知道它回调能接收什么参数
3. 最后实现:
方法一: 此方法有用,获取到了feature
this.riverLayer.on('change', function (evt) {
// 获取矢量图层数据源
let riversource = evt.target.getSource();
if (riversource.getState() === 'ready') {
// 获取数据集
let riverFeatrues = riversource.getFeatures();
console.log(riverFeatrues, '............riverFeatrues................')
}
})
方法二:此方法没有获取到feature
this.riverVectorSource.on("featuresloadend", (features) => {
console.log("rivers features: ", features)
})
(二)将feature显示到地图上
1. 问:
openlayers用LineString画线,是怎么写啊??
我写的代码 一直出不来图, 但是另一条线可以显示出来.
两条线都加到了routeSource中。
this.routeSource.addFeatures([ lineFeature, closeFeature]);
2. 答:
你定义linefeature的时候那个geometry坐标是不是和你地图的坐标系是一致的??
我看你河流的图层是3857的坐标系, 你那个[start,end]这个坐标有没有转换成3857啊
3. 最后实现:
转换坐标系,将4326转为3857
let startcoord = geom.flatCoordinates; //startcoord 是 4326坐标系
let startpt = fromLonLat([parseFloat(startcoord[1]), parseFloat(startcoord[0])]) //3857坐标系
var closeFeature = this.riverVectorSource.getClosestFeatureToCoordinate(startpt) //closeFeature是河
var closegeometry = closeFeature.getGeometry();
var closepoint = closegeometry.getClosestPoint(startpt); // 获取与传入坐标最接近的点坐标
let endpt = closepoint
var lineGeom = new LineString([startpt, endpt]); //startpt, endpt都是3857
var lineFeature = new Feature({
geometry: lineGeom,
});
lineFeature.setStyle(this.getStyle("green"));//lineFeature是start点到距离最近的end
(三)turf坐标转换
1. 问:
turf.lineString(), turf.length() 必须是地理坐标系吗??
我用的是 3857坐标系,好像不行。
我想转换坐标系试一下,但是 坐标数据太多,转换出错了,代码没写对
怎么批量转换坐标系啊?? 我只能搜到 transform() 这种方法
2. 答:
循环弄
用的哪个版本的turf,最新的没有transform方法,坐标变换用toWgs84
3. 最后实现:
turf版本不知道,我自己用for循环写了一个,实现了坐标转换
let lineCoordinates = [], linepointTransform = [];
let riverCoord = riverCoords[0]
for (var i = 0; i < riverCoord.length; i++) { //for循环 实现了坐标批量转换
linepointTransform = transform(riverCoord[i], "EPSG:3857", "EPSG:4326");
lineCoordinates.push(linepointTransform);
}
let rivercood = transform(riverCoords[0][0], 'EPSG:3857', 'EPSG:4326')
let endptt = transform(endpt, 'EPSG:3857', 'EPSG:4326')
var line = turf.lineString(lineCoordinates); //line是河的长度
var sliced = turf.lineSlice(rivercood, endptt, line); //sliced是河的上半游
var distance = turf.length(sliced); //distance是河的上半游 的长度
(四)查询和缓冲面相交的点
1. 问:
提问1:
openlayer 画出来了缓冲区,想要查询和缓冲面相交的点, 怎么实现 ??
这算是 叠加分析吧 ?
提问2:
包含 该怎么写,不知道用啥方法
2. 答:
回答1:(针对提问1)
包含
回答2:(针对提问2)
postgis 数据库查一下,或者turf.js试试
3. 最后实现:
var points = turf.points(this.datacoords);
var searchWithin = turf.polygon([buffercoords]); //注意polygon中的[]
var ptsWithin = turf.pointsWithinPolygon(points, searchWithin);
turf.js的 pointsWithinPolygon 方法
(五)获取相交点(点集)中的坐标
let ptsWithinfeature = ptsWithin.features //需要用到的feature
let ptsWithinCoordinates = [], ptsWithinTransform = [];
for (var m = 0; m < ptsWithinfeature.length; m++) {
var ptsWithincoord = turf.getCoords(ptsWithinfeature[m]); //这里 获取到了 feature中的坐标
ptsWithinTransform = transform(ptsWithincoord, "EPSG:4326", "EPSG:3857");
let datacoord = new Point(ptsWithinTransform)
let datacoordsfeature = new Feature({ //endpt 点渲染
geometry: datacoord,
});
this.businessFeatrue.push(datacoordsfeature)
}