Определите, попадают ли координаты GPS на дорогу - PullRequest
0 голосов
/ 01 декабря 2018

Я пытаюсь определить, находится ли точка на дороге / шоссе / автостраде и т. Д. Или в здании с помощью сценария Python.Для некоторых входных данных они будут содержать скорость пользователя, что означает, что в некоторых контекстах это будет очевидно, учитывая скорость устройства.Тем не менее, в случаях, когда мгновенная скорость пользователя мала, это может быть связано с движением, остановкой на свету и т. Д.

Я хочу иметь возможность ввести пару входов, например.-33.852592, 151.210663 и получите логический результат о том, попадают ли координаты пользователя на дорогу.

Я встречал Google places и OSRM, но пока не нашел решения по ним.Есть ли другие варианты, которые я пропускаю?

1 Ответ

0 голосов
/ 01 декабря 2018

Один из вариантов - сделать запрос DirectionsService.route с origin и destination, установленными в точку ввода.Это вернет маршрут длиной 0 от ближайшего местоположения на дороге (в пределах разумного).Если нет результатов, дело не в дороге.Если вы получите результат, вы можете рассчитать расстояние между вашим входом и возвращенной точкой, чтобы принять обоснованное решение о том, находятся ли координаты на дороге или нет.

Обратите внимание, что само устройство GPS может не быть, нотак точно.

доказательство концепции скрипки (с примером вашего примера)

screenshot of map showing result

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

var geocoder;
var map;

function initialize() {
  var testPoint = {
    lat: -33.852592,
    lng: 151.210663
  };
  var map = new google.maps.Map(
    document.getElementById("map_canvas"), {
      center: testPoint,
      zoom: 22,
      mapTypeId: google.maps.MapTypeId.ROADMAP
    });
  var marker = new google.maps.Marker({
    position: testPoint,
    map: map,
    icon: {
      url: "https://maps.gstatic.com/intl/en_us/mapfiles/markers2/measle.png",
      size: new google.maps.Size(7, 7),
      anchor: new google.maps.Point(3.5, 3.5)
    }
  });

  var directionsService = new google.maps.DirectionsService();
  directionsService.route({
    origin: testPoint,
    destination: testPoint,
    travelMode: "DRIVING"
  }, function(result, status) {
    if (status == 'OK') {
      var marker = new google.maps.Marker({
        position: result.routes[0].legs[0].steps[0].start_location,
        map: map,
        icon: {
          url: "https://maps.gstatic.com/intl/en_us/mapfiles/markers2/measle_blue.png",
          size: new google.maps.Size(7, 7),
          anchor: new google.maps.Point(3.5, 3.5)
        }
      });
      var distance = google.maps.geometry.spherical.computeDistanceBetween(result.routes[0].legs[0].steps[0].start_location, marker.getPosition());
      if (distance < 10)
        document.getElementById('info').innerHTML = "distance=" + distance + "m on road";
      else
        document.getElementById('info').innerHTML = "distance=" + distance + "m not on road";
    } else alert("status=" + status);
  });
}
google.maps.event.addDomListener(window, "load", initialize);
html,
body {
  height: 100%;
  width: 100%;
  margin: 0px;
  padding: 0px
}

#map_canvas {
  height: 90%;
}
<script src="https://maps.googleapis.com/maps/api/js?libraries=geometry"></script>
<div id="info"></div>
<div id="map_canvas"></div>
...