如何在 Google Maps API 中获取出发地和目的地之间的路线上的地点(例如加油站)

2023-12-04

您能否告诉我是否可以获取 Google Maps API 中出发地和目的地之间的路线上的所有地点(例如加油站)的列表?Here是一个链接,我试图根据方向支持的路线列出两点之间的所有加油站或休息区(或任何 Google Maps API 支持的地点类型)。

到目前为止,这是我的代码:

var directionsDisplay;
var directionsService = new google.maps.DirectionsService();
var map;
var haight = new google.maps.LatLng(49.216364,-122.811897);
var oceanBeach = new google.maps.LatLng(50.131446,-119.506838);

function initialize() {
  directionsDisplay = new google.maps.DirectionsRenderer();
  var mapOptions = {
  zoom: 14,
  mapTypeId: google.maps.MapTypeId.ROADMAP,
  center: haight
}
  map = new google.maps.Map(document.getElementById('map-canvas'), mapOptions);
  directionsDisplay.setMap(map);

    calcRoute();
 }

function calcRoute() {
  var request = {
  origin: haight,
  destination: oceanBeach,
  travelMode: google.maps.TravelMode.DRIVING
  };
  directionsService.route(request, function(response, status) {
   if (status == google.maps.DirectionsStatus.OK) {
       directionsDisplay.setDirections(response);
      }
 });
}

google.maps.event.addDomListener(window, 'load', initialize);

编辑部分:

// Make the directions request
  directionService.route(request, function(result, status) {
    if (status == google.maps.DirectionsStatus.OK) {
      directionsRenderer.setDirections(result);

      // Box around the overview path of the first route
      var path = result.routes[0].overview_path;
      var boxes = routeBoxer.box(path, distance);
      drawBoxes(boxes);
    } else {
      alert("Directions query failed: " + status);
    }

      for (var i = 0; i < boxes.length; i++) {
  var bounds = box[i];
  // Perform search over this bounds 
}



  });
}

  1. Use the 路由拳击手获取覆盖路线的 google.maps.LatLngBounds 对象数组。
  2. 对于每个边界,请使用地点库来搜索地点。

请注意,地点请求有查询限制和配额,因此对于长路线,这可能不切实际。

example

(但是,查看结果的分组方式,看起来位置服务正在边界中心周围搜索,而不是在边界内搜索,但这可能足以满足您的需求)。

代码片段:

var map = null;
var boxpolys = null;
var directions = null;
var routeBoxer = null;
var distance = null; // km
var service = null;
var gmarkers = [];
var boxes = null;
var infowindow = new google.maps.InfoWindow();

function initialize() {
  // Default the map view to the continental U.S.
  var mapOptions = {
    center: new google.maps.LatLng(40, -80.5),
    mapTypeId: google.maps.MapTypeId.ROADMAP,
    zoom: 8
  };

  map = new google.maps.Map(document.getElementById("map"), mapOptions);
  service = new google.maps.places.PlacesService(map);

  routeBoxer = new RouteBoxer();

  directionService = new google.maps.DirectionsService();
  directionsRenderer = new google.maps.DirectionsRenderer({
    map: map
  });

  // If there are any parameters at eh end of the URL, they will be in  location.search
  // looking something like  "?marker=3"

  // skip the first character, we are not interested in the "?"
  var query = location.search.substring(1);

  // split the rest at each "&" character to give a list of  "argname=value"  pairs
  var pairs = query.split("&");
  for (var i = 0; i < pairs.length; i++) {
    // break each pair at the first "=" to obtain the argname and value
    var pos = pairs[i].indexOf("=");
    var argname = pairs[i].substring(0, pos).toLowerCase();
    var value = pairs[i].substring(pos + 1).toLowerCase();

    // process each possible argname  -  use unescape() if theres any chance of spaces
    if (argname == "to") {
      document.getElementById('to').value = unescape(value);
    }
    if (argname == "from") {
      document.getElementById('from').value = unescape(value);
    }
    if (argname == "dist") {
      document.getElementById('distance').value = parseFloat(value);
    }
    if (argname == "type") {
      document.getElementById('type').value = unescape(value);
    }
    if (argname == "keyword") {
      document.getElementById('keyword').value = unescape(value);
    }
    if (argname == "name") {
      document.getElementById('name').value = unescape(value);
    }
    if (argname == "submit") {
      route();
    }
  }

}

function route() {
  // Clear any previous route boxes from the map
  clearBoxes();

  // Convert the distance to box around the route from miles to km
  distance = parseFloat(document.getElementById("distance").value) * 1.609344;

  var request = {
    origin: document.getElementById("from").value,
    destination: document.getElementById("to").value,
    travelMode: google.maps.DirectionsTravelMode.DRIVING
  }

  // Make the directions request
  directionService.route(request, function(result, status) {
    if (status == google.maps.DirectionsStatus.OK) {
      directionsRenderer.setDirections(result);

      // Box around the overview path of the first route
      var path = result.routes[0].overview_path;
      boxes = routeBoxer.box(path, distance);
      // alert(boxes.length);
      drawBoxes();
      findPlaces(0);
    } else {
      alert("Directions query failed: " + status);
    }
  });
}

// Draw the array of boxes as polylines on the map
function drawBoxes() {
  boxpolys = new Array(boxes.length);
  for (var i = 0; i < boxes.length; i++) {
    boxpolys[i] = new google.maps.Rectangle({
      bounds: boxes[i],
      fillOpacity: 0,
      strokeOpacity: 1.0,
      strokeColor: '#000000',
      strokeWeight: 1,
      map: map
    });
  }
}


function findPlaces(searchIndex) {
  var type = document.getElementById('type').value;
  var keyword = document.getElementById('keyword').value;
  var name = document.getElementById('name').value;
  var request = {
    bounds: boxes[searchIndex],
  };
  if (!!type && (type != "")) {
    if (type.indexOf(',') > 0)
      request.types = type.split(',');
    else
      request.types = [type];
  }
  if (!!keyword && (keyword != "")) request.keyword = keyword;
  if (!!name && (name != "")) request.name = name;
  service.nearbySearch(request, function(results, status) {
    if (status == google.maps.places.PlacesServiceStatus.OK) {
      document.getElementById('side_bar').innerHTML += "bounds[" + searchIndex + "] returns " + results.length + " results<br>"
      for (var i = 0, result; result = results[i]; i++) {
        var marker = createMarker(result);
      }
    } else {
      document.getElementById('side_bar').innerHTML += "bounds[" + searchIndex + "] returns 0 results<br>&nbsp;status=" + status + "<br>";
    }
    if (status != google.maps.places.PlacesServiceStatus.OVER_QUERY_LIMIT) {
      searchIndex++;
      if (searchIndex < boxes.length)
        findPlaces(searchIndex);
    } else { // delay 1 second and try again
      setTimeout("findPlaces(" + searchIndex + ")", 1000);
    }

  });
}

// Clear boxes currently on the map
function clearBoxes() {
  if (boxpolys != null) {
    for (var i = 0; i < boxpolys.length; i++) {
      boxpolys[i].setMap(null);
    }
  }
  boxpolys = null;
}

function createMarker(place) {
  var placeLoc = place.geometry.location;
  if (place.icon) {
    var image = new google.maps.MarkerImage(
      place.icon, new google.maps.Size(71, 71),
      new google.maps.Point(0, 0), new google.maps.Point(17, 34),
      new google.maps.Size(25, 25));
  } else var image = {
    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 marker = new google.maps.Marker({
    map: map,
    icon: image,
    position: place.geometry.location
  });
  var request = {
    reference: place.reference
  };
  google.maps.event.addListener(marker, 'click', function() {
    service.getDetails(request, function(place, status) {
      if (status == google.maps.places.PlacesServiceStatus.OK) {
        var contentStr = '<h5>' + place.name + '</h5><p>' + place.formatted_address;
        if (!!place.formatted_phone_number) contentStr += '<br>' + place.formatted_phone_number;
        if (!!place.website) contentStr += '<br><a target="_blank" href="' + place.website + '">' + place.website + '</a>';
        contentStr += '<br>' + place.types + '</p>';
        infowindow.setContent(contentStr);
        infowindow.open(map, marker);
      } else {
        var contentStr = "<h5>No Result, status=" + status + "</h5>";
        infowindow.setContent(contentStr);
        infowindow.open(map, marker);
      }
    });

  });
  gmarkers.push(marker);
  if (!place.name) place.name = "result " + gmarkers.length;
  var side_bar_html = "<a href='javascript:google.maps.event.trigger(gmarkers[" + parseInt(gmarkers.length - 1) + "],\"click\");'>" + place.name + "</a><br>";
  document.getElementById('side_bar').innerHTML += side_bar_html;
}

google.maps.event.addDomListener(window, 'load', initialize);
html,
body,
#map_canvas {
  margin: 0;
  padding: 0;
  height: 100%;
}
<script src="https://maps.googleapis.com/maps/api/js?libraries=places&key=AIzaSyCkUOdZ5y7hMm0yrcCQoCvLwzdM6M8s5qk"></script>
<script src="https://cdn.jsdelivr.net/gh/denissellu/routeboxer@master/src/RouteBoxer.js" type="text/javascript"></script>
<table border="1">
  <tr>
    <td valign="top">
      <div id="map" style="width: 600px; height: 500px;"></div>
    </td>
    <td>
      <div id="side_bar" style="width:200px; height: 600px; overflow: auto"></div>
    </td>
  </tr>
</table>
Box within at least
<input type="text" id="distance" value="3" size="2">miles of the route from
<input type="text" id="from" value="denver" />to
<input type="text" id="to" value="oklahoma city, OK" />
<input type="submit" onclick="route()" />
<br>
<label>type</label>
<input type="text" id="type" value="gas_station" />
<label>keyword</label>
<input type="text" id="keyword" value="" />
<label>name</label>
<input type="text" id="name" value="" />
<div id="towns"></div>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 Google Maps API 中获取出发地和目的地之间的路线上的地点(例如加油站) 的相关文章

  • 使用 Django 在 Google 地图上放置标记

    我正在尝试使用 API 和 HTML5 地理位置根据 Google 地图上模型中存储的纬度和经度放置标记 问题是如何使用模板关键字循环遍历 JavaScript 标签中存储的每个对象的经纬度信息 我不认为这可以在 Django 中完成 我在
  • Android键盘点击搜索输入时出现和消失

    我在用谷歌地图 Js API当我搜索一个地方时 我的输入搜索栏工作正常 当我通过 iPhone 设备使用它时 它也工作得很好 但是当我通过Android 设备然后键盘立即出现和消失 我已经找到了一些关于当我按下搜索栏时 android 键盘
  • getpaths() 多边形 谷歌地图 API

    我正在尝试检索折线和多边形的纬度坐标 完成任一对象的绘制后 我想将经纬度存储在数据库中 但现在我只是尝试在文本区域中显示经纬度 我已经很容易地完成了标记 矩形和圆形的操作 但是折线和多边形的术语让我感到困惑 当我完成绘图时 我使用 addD
  • 谷歌地图使用值 BESbswy 在内部创建隐藏的 div 和 span 并降低角度性能

    我在我的角度项目上使用谷歌地图 API v3 但是当我将地图添加到我的项目时 谷歌地图会创建一个隐藏的 div style height 1px width 1px span style font size 48px width 1 hei
  • 删除所有标记谷歌地图v3

    在我的第一次点击事件中 所有标记都显示在谷歌地图中 我想在第二次点击中删除它们 当我执行代码时 仅删除最后一个标记 这是我的 JavaScript 代码 var showmarkers false google maps event add
  • 在 iPhone 应用程序中获取路线和路线导航

    我正在开发一款应用程序 该应用程序将重点关注在驾驶时为用户提供路线和逐段指示 他们在驾驶过程中留在应用程序中非常重要 因此我真的不想让他们离开应用程序并转到内置的地图应用程序 我最近对如何包含此功能进行了大量研究 众所周知 这并不容易 因为
  • 使用javascript在谷歌地图中绘制多边形

    我想在谷歌地图中绘制多边形 我正在使用示例代码http jsfiddle net rvsMH 1 http jsfiddle net rvsMH 1 但它不起作用并且没有获取数组或纬度 经度值 我不知道出了什么问题
  • 带有方向的谷歌静态地图

    我的项目列表中有带有迷你地图的生成地点 地图上应该有 2 个点以及这两点之间的彩色道路方向 它应该看起来像这样 这应该是静态图片 因为页面上会有很多这样的不同方向的图片 但正如我所见 谷歌静态地图不允许绘制这样的图像 两点之间只能有直线 如
  • 使用 google 查询邮政编码距离

    我有两个邮政编码列表 R 语言 其中一个是孩子的地址及其学业成绩 另一个是学校的地址 我希望能够为每个孩子找到最近的学校 所以大概需要通过转换为长和纬度值来计算邮政编码之间的距离 然后我希望能够在谷歌地图上绘制每所学校的所有孩子 并看看住在
  • 如何在 Google Maps JS API 中获得仍包含一组纬度/经度坐标的最小 LatLngBounds?

    我需要在地图上绘制一组坐标以响应用户的选择 当发生这种情况时 我想平移地图以关注该组点 如何找到包含所有坐标的最小边界框 LatLngBounds 除了 Crescent Fresh 上面提到的 Stack Overflow 帖子 http
  • 地图 API v3:计算方位

    我已经为此苦苦挣扎了一段时间 需要一些建议 我看过一些类似的主题 但找不到适合我的答案 我正在使用谷歌地图 API 创建一个应用程序 它将确定您的位置 确定特定点 b 点 然后移动箭头以指向 b 点的方向 我在计算方位时遇到困难 有人可以提
  • Google 地图 api V3 - 从查询结果动态添加多个标记

    我正在尝试在页面上设置一个地图 并在其下方设置几个链接 单击这些链接时 将动态查询我的数据库并在地图上输出结果集 我花了很多时间在谷歌上搜索这个 但找不到我想要的东西 我已经使用 AJAX 返回纬度和经度坐标了 但是当尝试在地图上创建标记时
  • Google Maps JavaScript API v3 方向功能

    我使用 Google Maps js API v3 我可以根据路径点显示方向this http code google com intl hu apis maps documentation directions Waypoints 我想要
  • Google Maps API 下拉列表,缩放至标记

    我正在使用 Google Maps API v3 我有一个带有一些标记的简单地图 我还有一个下拉列表 我需要最少的代码来完成这项工作 我想在下拉列表中选择一个标记 并将选定的标记平移到它 我已经尝试了一切并在网上查看 我发现事情很接近 但到
  • 如何将地址(作为文本)转换为 GPS 坐标?

    假设我有文本地址 901 Cherry Ave 圣布鲁诺 CA 94066 美国 有没有免费服务可以帮助我识别该地址的 GPS 坐标 经度和纬度 我将在我的应用程序中使用它 所以它应该是某种 API 文本可以是任何语言 将地址转换为地理坐标
  • GeoDjango,PointField 与 Google Maps V3 API 接口使用什么 SRID?

    我有点困惑 我应该在 GeoDjango PointField 中将 SRID 值设置为多少 以便在通过 google 地图 api 将地址地理编码为通过 django postgis 查询的坐标和距离的情况下保持准确 我在阅读网络上的帖子
  • 如何修复未捕获的 InvalidValueError: setPosition: not a LatLng or LatLngLiteral: in property lat: not a number?

    我正在尝试将我的 googlemaps v2 功能移植到 v3 但不知怎的 我陷入了一个奇怪的错误 我找不到我做错了什么 错误 未捕获 InvalidValueError setPosition 不是 LatLng 或 LatLngLite
  • Google 地图 v3 信息窗口太宽

    在 Google 地图 v3 中 我似乎无法使 infoWindow 的宽度小于 200px 这是我正在使用的代码 var latlng new google maps LatLng 34 397 150 644 var myOptions
  • 如果路线有 Tolls Google Maps API xml 请求,则返回

    在标准谷歌地图方向搜索中 在编写方向之前会提供咨询 说明该路线有收费站 如果没有通行费 则不会显示任何咨询信息 我有一个谷歌地图 API 请求 该请求显示地图 其中包含从 1 个家庭地址到 1 个工作地址的旅行距离和持续时间 我很难找到在哪
  • 自定义标记在某些设备上不显示(Google 地图 Android SDK)

    我在 Android 应用程序上使用自定义标记运行 Google Maps SDK 在我们的测试手机 S3 S5 和 DROID 上一切正常 但是 当我在 Nexus 5 硬件上运行该应用程序时 一种类型的自定义标记不再显示在地图上 虽然标

随机推荐

  • 如何从字典列表创建三个单独的值列表,其中每个字典具有三个键

    我是Python新手 对于经验丰富的开发人员和编码人员来说 我的问题可能很简单 但我一直无法找到答案 我正在通过数据库查询检索一些数据 我成功地将查询返回的每一行组织为具有三个键和每个键对应值的字典 本质上 我已将查询返回的所有数据行组织到
  • ACR122u直接通讯无反应

    我正在尝试通过发送直接命令来使用 java 访问我的 ACR122u 奇怪的是我没有得到任何响应 也没有错误 这是我的代码 final static int IOCTL SMARTCARD ACR122 ESCAPE COMMAND 0x0
  • 如何关闭TextInputPanel

    我正在移植 WPF 应用程序以在 Windows 8 平板电脑上运行 我想让文本输入面板在文本框获得焦点时出现 并在文本框失去焦点时消失 让它出现是没有问题的 但我似乎无法让它关闭 我已在进程上尝试了 Kill 和 CloseMainWin
  • Android M 一次请求多个权限

    您好 我正在更新我的应用程序贾夫纳神庙 这样它就可以支持Android M设备 v 6 0及以上 有没有办法可以一次请求多个权限 例如 我想获得同时读取手机状态和位置信息的权限 使用这种方式我可以一一请求许可 但我想在应用程序开始时立即保留
  • MySQL 将字段添加到 Enum

    我必须向数据库表添加一些枚举选项 问题是 我必须对多个表和数据库执行此操作 并且它们可能并不都具有相同的枚举数据类型 是否有理由编写更改表查询或类似于将选项附加到枚举数据类型的内容 如果没有办法纯粹在 MySQL 中完成此操作 您将如何使用
  • 我可以在 C# 中使用 linq 压缩 if 语句吗?

    在 sql 中 我可以制作如下 if 语句 如果 MY STATE 在 1 2 3 4 在 C 中我必须输入 if MY STATE STATE CT MY STATE STATE MA MY STATE STATE VA MY STATE
  • 在 jQuery 中让元素靠近屏幕中间

    我在页面中有一个项目 div 列表 example div div div div div div div div div div div div div div div div div div
  • html5显示音频当前时间

    我想显示 html 5 音频元素的当前时间以及该元素的持续时间 我一直在互联网上查找 但找不到一个功能脚本 可以让我显示音频文件的长度以及当前的时间 例如1 35 3 20 有人有什么想法吗 这是一个例子
  • PHP,速记,使用三元运算符的 If..Else

    有没有一个衬里可以做到这一点 一个不错的三元OP F NAME SESSION USR F NAME if isset POST F NAME F NAME POST F NAME 基本上 如果发送了 POST 请表明 即使帖子为空 否则从
  • WPF 用户控件的绑定问题

    这就是我本质上想要的 AUserControl with a TextBlock whose Text属性绑定到Prop的财产UserControl 这只是我实际问题的代表 下面是我的一部分UserControl ClientDetails
  • 如何使用Socket.SendAsync发送大数据

    private void ProcessReceive SocketAsyncEventArgs e Check if the remote host closed the connection if e BytesTransferred
  • OSX Lion Preview 应用程序是否可以编写脚本? [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 OSX Lion 或更旧的 OSX 预览版本是否可以编写脚本 现在还没有预览版
  • Ember.js RC1 - 指定“模板”时不显示视图

    按照模板上的 Ember 指南 我执行以下操作 App PostsView Ember View extend template Ember Handlebars compile I am the template 但什么也没有呈现 当我使
  • UILabel 中的“更多”按钮就像 AppStore 中的任何应用程序描述一样

    我有 myObject 的描述 并在 UILabel 中显示它 我想将 更多 按钮添加到我的UILabel如果描述太长 在Github上我发现TTT属性标签它允许使用超链接 问题是 有什么特殊的功能吗 UILabel or UITextVi
  • 如何通过代理服务器使用 API 上传到 YouTube

    我正在构建一个应用程序 允许用户将视频上传到 youtube 上的特定帐户 我已按照以下示例进行操作http code google com apis youtube 2 0 developers guide dotnet html对于直接
  • 否则在 StateProvider 上

    使用 Angular ui router 我如何使用否则方法 on stateProvider或者我该如何使用它 你不能只使用 stateProvider 你需要注射 urlRouterProvider并创建类似于以下的代码 urlRout
  • Java程序和mySQL连接问题:找不到合适的驱动程序

    我的 mySQL 数据库连接出现问题 我收到错误 没有找到适合 jdbc mysql 127 0 0 1 sakila 的驱动程序 我已经安装了 mySQL Workbench 并从这里获得了驱动程序http dev mysql com d
  • 为什么使用 nullPtr 调用函数不会使我的应用程序崩溃? [复制]

    这个问题在这里已经有答案了 我不明白 C 中的某些内容 我在类上创建了一些指针并将其设置为 null 现在我用这个空指针调用一些函数并且该函数成功 为什么它不崩溃 class Entity public void Print const s
  • ASP.Net Gridview,如何根据ID(DataKey)激活编辑模式

    我有一个页面 我们称之为 SourceTypes aspx 它有一个显示源类型列表的 GridView GridView 的一部分是 DataKey SourceTypeID 如果源 TypeID 通过查询字符串传递到页面 如何根据 Sou
  • 如何在 Google Maps API 中获取出发地和目的地之间的路线上的地点(例如加油站)

    您能否告诉我是否可以获取 Google Maps API 中出发地和目的地之间的路线上的所有地点 例如加油站 的列表 Here是一个链接 我试图根据方向支持的路线列出两点之间的所有加油站或休息区 或任何 Google Maps API 支持