非矩形空间中的随机GPS坐标

时间:2014-02-20 14:06:42

标签: google-maps gps random-sample

我正在开发一个在地图上显示许多引脚的用户界面。 在开发过程中,我随机生成1500个地图引脚,只是为了测试外观/感觉/性能等问题。

这样做的代码如下:

    for (var i = 0; i <= 1500; i += 1) {
        $scope.mapPins.push({
            latitude: (Math.random() * 2) + 51,
            longitude: (Math.random() * 4) + 3,
            icon: themeImages[Math.floor(Math.random() * themeImages.length)],
            title: 'Sample title',
            infoContent: 'Sample content'
        });
    }

自然地,所覆盖的引脚区域是纬度51-53和经度3-7的矩形。对于那些想知道它在哪里的人来说,这个区域大致是在荷兰附近。

现在,有一个问题是荷兰不是一个长方形区域,很多这些坐标落在海面上,我希望我的坐标只能在陆地上。

我是否有一种诙谐的数学方法如何从非矩形区域汇集坐标?

当然我可以创建一个覆盖非矩形形状的google.maps多边形对象,然后通过google api测试每个随机生成的pin是否落在这个形状的范围内等,但这对于UI设计阶段来说是一种过度杀伤力。基本上我的问题是是否有一个巧妙的数学技巧,可以让我从非矩形空间中随机生成坐标。

2 个答案:

答案 0 :(得分:2)

保持代码不变,矩形是您感兴趣区域的边界框。

然后添加一行

if (isPointInpolygon(polygon, longitudeOrX, latitudeOrY) {
    // use this location
}

现在你只需要在多边形函数中搜索一个易于查找的点。 你可以直接使用(long,lat)顺序中的坐标,经度与x坐标相关,lat与y相关。 多边形必须用国家的坐标填充,而不是在水中。

如果你有岛屿,那么你可能需要多个这样的多边形,然后迭代所有多边形。

答案 1 :(得分:1)

不是一个坚持者,但你实际上生成了1501个地图别针:)

您不太可能找到比使用简单的pointinpolygon检查更简单的解决方案。

使用Google地图绘图库(https://developers.google.com/maps/documentation/javascript/drawing#using_the_library)在荷兰边界周围绘制多边形,然后根据需要保存(例如,在数据库中,或只复制定义边界坐标的字符串)。

然后在上面的脚本中,定义谷歌地图多边形(类似于官方文档中的内容:https://developers.google.com/maps/documentation/javascript/shapes#polygons),然后使用Google Maps Geometry库中的containsLocation方法(https://developers.google.com/maps/documentation/javascript/examples/poly-containsLocation )在将它们添加到地图之前检查您的随机地图别针是否位于荷兰的边界内。

例如:

    var netherlandsCoords = [
    // comma-separated list of coordinates defining the Netherlands boundary
    ];

    var netherlandsBoundary = new google.maps.Polygon({
        path: netherlandsCoords
    });

    for (var i = 0; i <= 1500; i += 1) {
        var lat = (Math.random() * 2) + 51;
        var lng = (Math.random() * 4) + 3;
        var latlng = new google.maps.LatLng(lat, lng);

        if (google.maps.geometry.poly.containsLocation(latlng, netherlandsBoundary)) {
            $scope.mapPins.push({
                latitude: lat,
                longitude: lng,
                icon: themeImages[Math.floor(Math.random() * themeImages.length)],
                title: 'Sample title',
                infoContent: 'Sample content'
            });
        } 
    }