2014-02-20 2 views
2

Я работаю над пользовательским интерфейсом, который показывает много контактов на карте. Во время разработки я произвольно генерирую 1500 штырьков карты, чтобы их можно было разместить на карте, чтобы проверить внешний вид/чувство/производительность и т. Д.Случайные координаты GPS в не прямоугольном пространстве

Код, который делает это выглядит следующим образом:

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. Для тех, кто интересуется, где он находится, это область примерно вокруг Нидерландов.

Теперь есть небольшая проблема, что Нидерланды не являются прямоугольной областью, и многие из этих координат падают над морем, и я хотел бы, чтобы мои координаты были только на земле.

Есть ли остроумный математический способ, как я могу объединить координаты из непрямоугольной области?

Конечно, я мог бы сделать объект polygon google.maps, который покрывает непрямоугольную форму, а затем с помощью теста google api каждый случайный сгенерированный вывод, попадает ли он в пределах этой формы и т. Д., Но это будет излишним для пользовательского интерфейса этап проектирования. В основном, мой вопрос заключается в том, есть ли аккуратный математический трюк, который позволил бы мне случайным образом генерировать координаты из непрямоугольного пространства.

ответ

2

Оставьте свой код таким, как он есть, прямоугольник является ограничивающим прямоугольником над вашей областью интересов.

Затем добавьте строку

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

теперь вам нужно только искать точки в функции многоугольника, который легко найти. вы можете напрямую использовать координаты в (длинном, лат) порядке, долгота связана с координатой x, lat до y. Многоугольник должен быть заполнен координатами страны, которые не инсодируют воду.

Если у вас есть острова, то, возможно, вам нужно несколько таких полигонов, а затем перебрать все.

1

не быть приверженцем, но вы на самом деле генерации 1501 карты булавки :)

Это очень маловероятно, что вы сможете найти более простое решение, чем с помощью простой проверки pointinpolygon.

Используйте библиотеку рисования Google Maps (https://developers.google.com/maps/documentation/javascript/drawing#using_the_library), чтобы нарисовать многоугольник вокруг границы Нидерландов и сохранить его, как вы хотите (например, в базе данных или просто скопировать строку, определяющую координаты границы).

Тогда в сценарии выше, определить Google Maps многоугольник (по аналогии с тем, что делается здесь, в официальной документации: https://developers.google.com/maps/documentation/javascript/shapes#polygons), а затем использовать метод containsLocation в библиотеке Google Maps Geometry (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' 
      }); 
     } 
    } 
Смежные вопросы