代码之家  ›  专栏  ›  技术社区  ›  Loki

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

  •  0
  • Loki  · 技术社区  · 5 年前

    我有个问题

    我想问一下,最有效的方法是检查纬度和经度坐标是否在纬度和经度点列表的范围内(例如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]]
    

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

    我有没有办法从上面的列表中指出:

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

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

    1 回复  |  直到 5 年前
        1
  •  1
  •   iCode    5 年前

    对于GIS专业人士来说,这听起来是个很棒的问题;你或许可以在gis上发帖。斯塔克交换。通用域名格式。您是否在使用已经可以访问API的映射技术?您要寻找的功能称为几何操作。首先,我将研究API中可用的几何函数,这些函数计算点之间的距离。可以找到所有点的几何中心,然后请求geometry API在该点周围创建缓冲区。接下来,查询每个点是否在该缓冲区内。

    找到了一篇可能有助于找到点中心的帖子: How do I find the center of a number of geographic points?

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

        2
  •  1
  •   Adam Hopkinson    5 年前

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

    但正如你在问题上加上的标签 javascript ,我将发布一个JS解决方案。有一个npm包叫做 haversine -有了它,你应该能够循环通过每个点,并返回100米范围内的其他点。比如:

    // 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);
    

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