Проблема со случайной координатой в пределах диапазона, когда близко к пределу земли - PullRequest
0 голосов
/ 20 февраля 2019

Я создаю случайную точку в границах карты, где центр является геокоординатой, которую я даю.

var sw = bounds.getSouthWest();
var ne = bounds.getNorthEast();    

var ptLat = Math.random() * (ne.lat() - sw.lat()) + sw.lat();
var ptLng = Math.random() * (ne.lng() - sw.lng()) + sw.lng();
var point = new google.maps.LatLng(ptLat,ptLng);

В большинстве случаев все работает хорошо, но в случае, например, -7.47, 178.67 будут проблемы, поскольку границы для долготы будут 142, -142 и испортят случайное число, так как оно может возвращать значения типа 20,30 или 40, которые находятся в пределах диапазона чисел, но не в диапазоне координат.

Каков наилучший вариант для вычисления случайного числа для широты или долготы в пределах диапазона без искажения?

1 Ответ

0 голосов
/ 20 февраля 2019

Использование LatLngBounds.toSpan

var bounds = map.getBounds();
var sw = bounds.getSouthWest();
var ne = bounds.getNorthEast();
var span = bounds.toSpan();
var ptLat = Math.random() * span.lat() + sw.lat();
var ptLng = Math.random() * span.lng() + sw.lng();
var point = new google.maps.LatLng(ptLat, ptLng);

подтверждение концепции скрипта

screenshot of resulting map with multiple random markers

фрагмент кода:

var map;

function initMap() {
  var myLatLng = {
    lat: 64.197671,
    lng: -152.009373
  };

  map = new google.maps.Map(document.getElementById('map'), {
    zoom: 3,
    center: myLatLng
  });

  var marker = new google.maps.Marker({
    position: myLatLng,
    map: map,
    title: 'Hello World!'
  });
  google.maps.event.addListenerOnce(map, 'bounds_changed', function() {
    createRandomMarker();
  });
}

function createRandomMarker() {
  var bounds = map.getBounds();
  var sw = bounds.getSouthWest();
  var ne = bounds.getNorthEast();
  var span = bounds.toSpan();
  console.log("span=" + span.toUrlValue(6) + "; sw=" + sw.toUrlValue(6) + " ne=" + ne.toUrlValue(6));
  var ptLat = Math.random() * span.lat() + sw.lat();
  var ptLng = Math.random() * span.lng() + sw.lng();
  var point = new google.maps.LatLng(ptLat, ptLng);
  var marker2 = new google.maps.Marker({
    position: point,
    map: map,
    title: 'Random point'
  });
  console.log("random marker at:" + marker2.getPosition().toUrlValue(6));
  if (!bounds.contains(marker2.getPosition())) {
    alert("marker out of bounds:" + marker2.getPosition().toUrlValue());
  }
}
html,
body {
  height: 100%;
  margin: 0;
  padding: 0;
}

#map {
  height: 90%;
  margin: 0;
  padding: 0;
}
<input type="button" onclick="createRandomMarker();" value="makeMarker" />
<div id="map"></div>
<!-- Replace the value of the key parameter with your own API key. -->
<script async defer src="https://maps.googleapis.com/maps/api/js?key=AIzaSyCkUOdZ5y7hMm0yrcCQoCvLwzdM6M8s5qk&callback=initMap"></script>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...