检查经纬度列表是不是在范围内

Posted

技术标签:

【中文标题】检查经纬度列表是不是在范围内【英文标题】:Check if list of latitude, longitude are withing range检查经纬度列表是否在范围内 【发布时间】:2020-10-16 10:20:18 【问题描述】:

我有问题

我想问最有效的方法是检查纬度和经度坐标是否在纬度和经度点列表的范围内(例如 100 米)。

例如,我有这个坐标列表:

[[48.34483,51.16.24517],[48.484,16.2585],[48.361,51.87739419],[6.38477205,51.87745015],[48.3645,51.16.73167],[6.38391099,51.87755068],[48.3575,16.725],[6.38380232,51.87720004],[6.38376297,51.87708017],[6.38375183,51.87704018],[6.38373055,51.8769829]]

我希望以某种方式将所有点都在特定范围内(例如 100m), 以某种方式分组。

有什么方法可以让我从上面的列表中指出这一点:

[48.484,16.2585],[48.361,51.87739419][48.3575,16.725]

半径为100m(这些点之间的距离小于100m),应该摸索

【问题讨论】:

如果您在位置 x 处有点 A,在 x + 90 处有点 B,在 x + 150 处有点 C。C 距离 A 150 等待,但 B 等待 60,而 B 等待 90来自 A. C 是该组的一部分吗? @gilamran 是的 C 也应该是该组的一部分,但它与 B 分组 所以返回的是每个点,100m内的一组其他点? @AdamHopkinson 是的 【参考方案1】:

对于 GIS 专业人士来说,这听起来是一个很好的问题;您也许可以在 gis.stackexchange.com 上发帖。您是否正在使用已经可以访问 API 的映射技术?您正在寻找的功能称为几何运算。我将首先研究计算点之间距离的 API 中可用的几何函数。您可以找到所有点的几何中心,然后请求几何 API 在该点周围创建一个缓冲区。接下来,查询每个点是否在该缓冲区内。

找到一个帖子,可能有助于在此处找到点的中心: How do I find the center of a number of geographic points?

还在 stackexchange 上找到了一篇与您的非常相似的帖子,只是该帖子参考了 ArcGIS 和点距离(分析)工具: https://gis.stackexchange.com/q/91571/81346

【讨论】:

是的,我有一个 API,我使用 Geoserver 来显示这些点,因此它包含地图上显示的所有点......但所有标记为分组的点都在我的 Postgress 数据库中。当然会检查 gis.stackexchange .. 谢谢 Geoserver 中的 DWITHIN 操作可能会有所帮助:***.com/q/30334236/1617161 和 wiki.state.ma.us/display/massgis/…【参考方案2】:

理想情况下,您应该为此使用地理空间数据库,以避免在处理越来越多的点时出现性能问题。 mysql、Postgres 等都支持地理空间功能。

但是当您使用javascript 标记您的问题时,我将发布一个 JS 解决方案。有一个名为 haversine 的 npm 包 - 有了它,您应该能够遍历每个点并返回 100m 内的其他点。比如:

// bring in haversine from npm
var haversine = require("haversine");

// define the full list of points
var data = [
    [48.34483,51.1624517],
    [48.484,16.2585],
    [48.361,51.87739419],
    [6.38477205,51.87745015],
    [48.3645,51.1673167],
    [6.38391099,51.87755068],
    [48.3575,16.725],
    [6.38380232,51.87720004],
    [6.38376297,51.87708017],
    [6.38375183,51.87704018],
    [6.38373055,51.8769829]
];

var points = data.map(point => new Object(latitude: point[0], longitude: point[1]));

// var to store results in
var results = [];

// loop through the points
points.forEach((pair) => 
    var nearby = points;
    // filter the full list to those within 100m of pair
    nearby.filter(point => haversine(pair, point, unit: 'mile') <= 100);
    results.push(
        'point': pair,
        'nearby': nearby
    );
);

console.log(results);

注意:我更正了您列表中的一些点,它们有两位小数,因此无效

【讨论】:

感谢您回答 +1,是的,我的 Geoserver 上的地理空间数据库中有这些点,但不知道如何使用 Geoserver 功能来做到这一点 你知道我如何用 Geoserver 解决这个问题吗?

以上是关于检查经纬度列表是不是在范围内的主要内容,如果未能解决你的问题,请参考以下文章

检查纬度和经度是不是在我的谷歌地图起点和终点范围内

如何检查选定区域的纬度/经度是不是在使用 Java 的数据库中定义的范围内

给定两个纬度/经度,我如何判断它们是不是在 1 英里范围内?

在 Javascript 中使用夏令时检查日期范围

判断经纬度是不是在某个省市内,或者地级市范围

查找十进制纬度和经度是不是落在特定的访问范围内