我开发了一个工作脚本,用于测量车辆在路线上行驶的距离,行驶的最长距离,路线是从A点到B点,一个环路,还是车辆处于闲置状态
我正在使用GoogleMaps API来确定所有这些,并搜索XML数据以确定车辆的当前位置。有一个'Vicinity'标签,用于说明当前城市在长/纬度坐标处的位置。
我没有看到任何描述当前高速公路出口或英里标记的信息,是否有人知道如何通过Google获取此信息?
如果之前有人问过,我道歉。我发现了一个类似的帖子,但它是从7年前开始的,并表示GoogleMaps目前没有提供这种服务。
答案 0 :(得分:0)
我认为它运作得很好。
它有时会产生双重标记(比如相距几码的两个合并标记)。
有些额外的代码可能没有被使用,有些东西被注释掉了。 我从我正在处理的另一个项目中复制/粘贴了大部分内容。
<style>
body {
width: 100%;
}
#right-panel, #map {
height: 400px;
width: 50%;
float: left;
overflow: auto;
}
hr {
clear: both;
}
</style>
<input id="from" placeholder="from" value="Tulsa"/>
<input id="to" placeholder="to" value="Chicago"/>
<select onchange="routeType(this)">
<option value="DRIVING">DRIVING</option>
<option value="WALKING">WALKING</option>
<option value="BICYCLING">BICYCLING</option>
<option value="TRANSIT">TRANSIT</option>
</select>
<input value="plot" onclick="calculateRoute()" type="button"/>
<hr/>
<div id="map"></div>
<div id="right-panel"></div>
<hr/>
<input onclick="calculateRoute()" value="GO" type="button"/>
<div id="maplog"></div>
<script type="text/javascript" src="https://maps.google.com/maps/api/js?libraries=geometry"></script>
<script>
var map;
var here = {};
var dest = {};
var directionsService;
var directionsDisplay;
var travelMode = 'DRIVING'; //'WALKING';
var sourcePosition;
function initMap() {
map = new google.maps.Map(document.getElementById('map'), {
center: {lat: 35, lng: -100},
zoom: 5,
mapTypeId: 'terrain'
});
var marker = new google.maps.Marker({
position: {lat: 50.8735506, lng: 4.3238525},
map: map,
title: 'Fermenthings winkel'
});
dest.marker = marker;
directionsService = new google.maps.DirectionsService;
directionsDisplay = new google.maps.DirectionsRenderer({
draggable: true,
suppressMarkers: true,
panel: document.getElementById('right-panel'),
map: map
});
}
function trackLocation() {
getLocation();
}
google.maps.event.addDomListener(window, 'load', initMap);
function getLocation() {
if (navigator.geolocation) {
navigator.geolocation.getCurrentPosition(showPosition);
} else {
//x.innerHTML = "Geolocation is not supported by this browser.";
}
}
function showPosition(position) {
// x.innerHTML = "Latitude: " + position.coords.latitude +
// "<br>Longitude: " + position.coords.longitude;
if(map) {
sourcePosition = {lat: position.coords.latitude, lng: position.coords.longitude};
//map.setCenter(sourcePosition);
if(here.marker) {
here.marker.setMap(null);
}
here.marker = new google.maps.Marker({
position: sourcePosition,
draggable: true,
icon: {url: 'thumbnails/here.png'},
map: map
});
var bounds = new google.maps.LatLngBounds();
bounds.extend(sourcePosition);
bounds.extend(dest.marker.getPosition());
map.fitBounds(bounds);
google.maps.event.addListener(here.marker, 'position_changed', function() {
sourcePosition = {lat: this.getPosition().lat(), lng: this.getPosition().lng()};
});
google.maps.event.addListener(here.marker, 'dragend', function() {
sourcePosition = {lat: this.getPosition().lat(), lng: this.getPosition().lng()};
calculateRoute();
});
//return;
}
// route
calculateRoute();
}
function createMarker(lat, lng, title) {
return new google.maps.Marker({
position: {lat: lat, lng: lng},
map: map,
title: title
});
}
function displayRoute(origin, destination, service, display, waypoints, callback) {
if(waypoints) {
var options = {
origin: origin,
destination: destination,
waypoints: waypoints,
travelMode: travelMode //'DRIVING',
};
}
else {
var options = {
origin: origin,
destination: destination,
travelMode: travelMode //'DRIVING',
};
}
service.route(options, function(response, status) {
if (status === 'OK') {
//
//createMarkers(response, callback);
display.setDirections(response);
if(callback) {
callback(response);
}
} else {
// alert('Could not display directions due to: ' + status);
}
});
}
function routeType(elm) {
travelMode = elm.value;
if(sourcePosition) {
calculateRoute();
}
}
function calculateRoute() {
var from = document.getElementById('from').value;
var to = document.getElementById('to').value;
displayRoute(
from,
to,
directionsService,
directionsDisplay,
null, //waypoints,
function(response) {
// loop steps
var steps = response.routes[0].legs[0].steps;
for(var i = 0; i<steps.length; i++) {
var step = response.routes[0].legs[0].steps[i];
// search for keywords in the instructions
if( (step.instructions.indexOf('Take') > -1 || step.instructions.indexOf('take') > -1) && step.instructions.indexOf('exit') > -1) {
//here we enter a highway
document.getElementById('maplog').innerHTML += 'exit: ' + step.start_location.lat() +','+ step.start_location.lng() +'<br/>';
createMarker(step.start_location.lat(), step.start_location.lng(), 'exit');
}
if( (step.instructions.indexOf('Merge') > -1 || step.instructions.indexOf('merge') > -1) && step.instructions.indexOf('onto') > -1) {
//here we exit a highway
document.getElementById('maplog').innerHTML += 'merge: ' + step.start_location.lat() +','+ step.start_location.lng() +'<br/>';
createMarker(step.start_location.lat(), step.start_location.lng(), 'merge');
}
}
//document.getElementById('maplog').innerHTML = JSON.stringify(response);
}
);
}
</script>