首页 > 解决方案 > 如何搜索折线附近的所有点?

问题描述

在 react-leaflet 项目中,我使用 react-leaflet-draw 来绘制形状。对于折线,我编写了一个特定的表格。用户可以为创建的折线输入缓冲区。此缓冲区必须显示为折线的阴影,宽度以米或公里为单位。现在我想显示(渲染)它们的纬度在该阴影或缓冲区大小内的所有点(标记)。我该如何实施?

这是我的代码框的链接

https://codesandbox.io/s/confident-swanson-rfp39

它包含地图组件和一个小型 node.js 服务器

首先我使用节点 mapserver.js 启动服务器,然后绘制一条折线。在此之后或之前,我应该以 m 或 km 为单位输入缓冲区大小。然后我单击按钮并开始获取请求。提取完成后,缓冲区中的所有点都必须用标记显示。

最重要的是,更新缓冲区时,它必须显示为折线的阴影,但我无法实现:|||

我实现了对圆形和多边形的搜索,但我的折线解决方案失败了。

这是处理 onCreated 事件的 onCreate 方法:

`

const onCreated = e => {
    console.log(e);
    console.log(editableFG);
    const { layerType, layer } = e;
    const drawnItems = editableFG.leafletElement._layers;
    console.log(drawnItems);
    if (Object.keys(drawnItems).length > 1) {
        Object.keys(drawnItems).forEach((layerid, index) => {
            if (index > 0) return;
            const layer = drawnItems[layerid];
            editableFG.leafletElement.removeLayer(layer);
        });
        console.log(drawnItems);
    }
    if (layerType === 'polyline') {
        setPolylineLayers(() => [
            {
                id: layer._leaflet_id,
                latlngs: layer.getLatLngs(),
                type: layerType
            }
        ]);
    }
};

`

这是我的折线搜索算法:`

    fetch('http://localhost:8000/geoData')
        .then(res => {
            if (!res.ok) {
                console.log(Promise.reject('request has been rejected'));
            }
            return res.json();
        })
        .then(data => {
            let m = [];
            let c = [];
            let points = [];
            for (let j = 1; j <= polylineLayers.latlngs.length; j++) {
                // m = (y1-y0)/(x1-x0)
                let x =
                    polylineLayers.latlngs[j][0] -
                    polylineLayers.latlngs[j - 1][0];
                let y =
                    polylineLayers.latlngs[j][1] -
                    polylineLayers.latlngs[j - 1][1];
                let z = y / x;
                m.push(z);
                // y - y0 = m(x-x0) => c = mx0 - y0
                let constant =
                    m[j - 1] * polylineLayers.latlngs[j - 1][0] +
                    polylineLayers.latlngs[j - 1][1];
                c.push(constant);
            }
            for (let i = 0; i < data.latlngs.length; i++) {
                for (let j = 0; j < m.length; j++) {
                    // distance = abs(y0-m*x0 + c)/sqrt(1+m^2)
                    let a = Math.abs(
                        data.latlngs[i][1] -
                            m[j] * data.latlngs[i][0] +
                            c[j]
                    );
                    let b = Math.pow(1 + Math.pow(m[j], 2), 2);
                    let distance = a / b;
                    if (bufferScale === 'm') {
                        if (distance < buffer / 1000) {
                            points.push(data.latlngs[i]);
                        }
                    } else {
                        if (bufferScale === 'km') {
                            if (distance < buffer) {
                                points.push(data.latlngs[i]);
                            }
                        }
                    }
                }
            }
            setPostions(points);
        });

` 任何帮助都会很愉快 :))

标签: reactjsreact-leafletreact-leaflet-draw

解决方案


推荐阅读