在 Google Maps v2 Android 上突出显示指定路线

2023-11-27

是的,我目前正在我的应用程序中使用 Google Directions API 来检索两个位置之间的路线。

当我发送路线方向请求时,我会以 JSON 格式检索有关路线的许多详细信息,包括路线沿线每条道路的名称、相应的起点和终点经纬度坐标以及折线值。

例如:如果我发送请求在两条道路之间,我得到以下 JSON 响应(沿途一条道路的输出)。

 {
                     "distance" : {
                        "text" : "0.2 km",
                        "value" : 203
                     },
                     "duration" : {
                        "text" : "1 min",
                        "value" : 18
                     },
                     "end_location" : {
                        "lat" : 53.435250,
                        "lng" : -6.132140000000001
                     },
                     "html_instructions" : "Head \u003cb\u003eeast\u003c/b\u003e on \u003cb\u003eRedfern Ave.\u003c/b\u003e toward \u003cb\u003eMartello Court\u003c/b\u003e",
                     **"polyline" : {
                        "points" : "woceIvgmd@O}DOkDQqF"**
                     },

到目前为止,我的应用程序解析了这些信息,并简单地在列表视图中列出了道路和方向,如下所示:

enter image description here

我想做的是在地图上突出显示从 A 到 B 的整个路线,但是我在网上没有找到任何关于如何在新的 Google Maps API v2 上执行此操作的有用信息。我看到在 Google 地图 v2 上使用折线而不是叠加来绘制线条,但是据我所知,它们只绘制直线,这对我来说毫无用处。无论如何,是否可以使用我所掌握的信息(道路名称、起点和终点经纬度坐标、折线点)来突出显示路线?如有任何帮助,我们将不胜感激。

另外,我看到响应中有一个“折线”值,这可能很有用,但我无法弄清楚如何解析或使用这些信息。有谁知道我如何理解这个值来绘制折线?

**"polyline" : {
             "points" : "woceIvgmd@O}DOkDQqF"**

编辑:我的解决方案代码在下面的答案中提供。


经过多次尝试和错误,我终于成功了!现在,它在地图上完全突出显示从 A 到 B 的指定路线(如下面的屏幕截图所示)。我还为将来可能需要它的人提供了我的代码。

enter image description here

public class PolyMap extends Activity {
        ProgressDialog pDialog;
        GoogleMap map;
        List<LatLng> polyz;
        JSONArray array;
        static final LatLng DUBLIN = new LatLng(53.344103999999990000,
                -6.267493699999932000);

        @SuppressLint("NewApi")
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.map_layout);
            map = ((MapFragment) getFragmentManager().findFragmentById(R.id.map))
                    .getMap();
            map.moveCamera(CameraUpdateFactory.newLatLngZoom(DUBLIN, 15));
            map.animateCamera(CameraUpdateFactory.zoomTo(10), 2000, null);
            new GetDirection().execute();
        }

        class GetDirection extends AsyncTask<String, String, String> {

            @Override
            protected void onPreExecute() {
                super.onPreExecute();
                pDialog = new ProgressDialog(PolyMap.this);
                pDialog.setMessage("Loading route. Please wait...");
                pDialog.setIndeterminate(false);
                pDialog.setCancelable(false);
                pDialog.show();
            }

            protected String doInBackground(String... args) {
                Intent i = getIntent();
                String startLocation = i.getStringExtra("startLoc");
                String endLocation = i.getStringExtra("endLoc");
                            startLocation = startLocation.replace(" ", "+");
                    endLocation = endLocation.replace(" ", "+");;
                String stringUrl = "http://maps.googleapis.com/maps/api/directions/json?origin=" + startLocation + ",+dublin&destination=" + endLocation + ",+dublin&sensor=false";
                StringBuilder response = new StringBuilder();
                try {
                    URL url = new URL(stringUrl);
                    HttpURLConnection httpconn = (HttpURLConnection) url
                            .openConnection();
                    if (httpconn.getResponseCode() == HttpURLConnection.HTTP_OK) {
                        BufferedReader input = new BufferedReader(
                                new InputStreamReader(httpconn.getInputStream()),
                                8192);
                        String strLine = null;

                        while ((strLine = input.readLine()) != null) {
                            response.append(strLine);
                        }
                        input.close();
                    }

                    String jsonOutput = response.toString();

                    JSONObject jsonObject = new JSONObject(jsonOutput);

                    // routesArray contains ALL routes
                    JSONArray routesArray = jsonObject.getJSONArray("routes");
                    // Grab the first route
                    JSONObject route = routesArray.getJSONObject(0);

                    JSONObject poly = route.getJSONObject("overview_polyline");
                    String polyline = poly.getString("points");
                    polyz = decodePoly(polyline);

                } catch (Exception e) {

                }

                return null;

            }

            protected void onPostExecute(String file_url) {

                for (int i = 0; i < polyz.size() - 1; i++) {
                    LatLng src = polyz.get(i);
                    LatLng dest = polyz.get(i + 1);
                    Polyline line = map.addPolyline(new PolylineOptions()
                            .add(new LatLng(src.latitude, src.longitude),
                                    new LatLng(dest.latitude,                dest.longitude))
                            .width(2).color(Color.RED).geodesic(true));

                }
                pDialog.dismiss();

            }
        }

        /* Method to decode polyline points */
        private List<LatLng> decodePoly(String encoded) {

            List<LatLng> poly = new ArrayList<LatLng>();
            int index = 0, len = encoded.length();
            int lat = 0, lng = 0;

            while (index < len) {
                int b, shift = 0, result = 0;
                do {
                    b = encoded.charAt(index++) - 63;
                    result |= (b & 0x1f) << shift;
                    shift += 5;
                } while (b >= 0x20);
                int dlat = ((result & 1) != 0 ? ~(result >> 1) : (result >> 1));
                lat += dlat;

                shift = 0;
                result = 0;
                do {
                    b = encoded.charAt(index++) - 63;
                    result |= (b & 0x1f) << shift;
                    shift += 5;
                } while (b >= 0x20);
                int dlng = ((result & 1) != 0 ? ~(result >> 1) : (result >> 1));
                lng += dlng;

                LatLng p = new LatLng((((double) lat / 1E5)),
                        (((double) lng / 1E5)));
                poly.add(p);
            }

            return poly;
        }
    }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Google Maps v2 Android 上突出显示指定路线 的相关文章

  • 这个方法比 Math.random() 更快吗?

    我是一名初学者 目前已经开始开发一款使用粒子群优化算法的 Android 游戏 我现在正在尝试稍微优化我的代码 并且 for 循环中有相当多的 Math random 几乎一直在运行 所以我正在考虑一种方法来绕过并跳过所有 Math ran
  • 如何在android网络库(ION)中使用自签名SSL?

    使用此网络库 https github com koush ion https github com koush ion 由于当前状态是开发 我想使用自签名 SSL 证书 图书馆论坛有一些讨论 https github com koush
  • 如何从该 JAVA 文件中提取 Delphi 类以与 Android 一起使用?

    我的Delphi XE7项目需要与FTDI FT311 Android 配件芯片 http www ftdichip com Products ICs FT311D html 他们帮助提供了一个 Android 演示 其中包括他们的 JAV
  • 使用一个 apk 安装两个应用程序

    我有 2 个应用程序 1 内容提供者 2 使用此 ContentProvider 的应用程序 我需要使用单个 apk 文件安装这 2 个应用程序 我想在 Eclipse 中同时推送这两个应用程序 如果我将另一个项目添加到一个应用程序的构建路
  • 让协程等待之前的调用

    我还没有完全掌握 Kotlin 协程 基本上我希望协程在执行之前等待任何先前的调用完成 下面的代码似乎可以工作 但它正在做我认为它正在做的事情吗 private var saveJob Job null fun save saveJob s
  • Android 应用程序在启动时打开应用程序信息屏幕,而不是启动主 Activity

    我不确定这是否是一个问题 但这是我第一次遇到这个问题 我正在开发一个应用程序 当我在进行一些编码后断开应用程序与 Android Studio 和 PC 的连接时 如果我尝试在手机上打开应用程序 它会启动app info屏幕 我们看到强制停
  • 使用 HttpClient 时,为什么服务器响应中省略了 Content-Length 标头?

    我正在使用这个问题的源代码如何异步执行httprequest并显示下载响应的进度 https stackoverflow com questions 9594318 how to asynchronous perform a httpreq
  • 如何在 android 中启动“添加联系人”活动

    您能告诉我如何在 Android 中启动 添加联系人 活动吗 谢谢 API 级别 5 及以上解决方案 Add listener so your activity gets called back upon completion of act
  • onScale 事件后触发奇怪的 onScroll 事件

    我有一个同时使用 SimpleOnScaleGestureListener 和 SimpleOnGestureListener 的应用程序 每当我进行捏缩放时 我都会得到预期的 onScale 但是当我抬起时 我会看到一个奇怪的 onScr
  • 使用 HttpUrlConnection Android 将 base64 编码的图像发送到服务器

    我正在尝试使用 HttpUrlConnection 将 base64 编码的图像发送到服务器 我遇到的问题是大多数图像均已成功发送 但有些图像会生成 FileNotFound 异常 我的图像编码代码可以在下面找到 public static
  • 如何向开发人员发送崩溃报告?

    我开发 Android 应用程序 但在某些情况下我的应用程序force close 如果出现以下情况 我如何向开发人员发送包含详细信息的电子邮件force close随时发生 The ACRA https github com ACRA a
  • Android 版 jTwitter 授权错误

    我在我的 Android 应用程序中使用 jTwitter 库 直到前天一切都运转良好 但今天遇到异常 服务提供商响应错误 301 请帮助我 这是堆栈跟踪 02 21 21 07 27 258 E AndroidRuntime 4013 F
  • Android:使 Dialog 周围的所有内容都比默认值更暗

    我有一个具有以下样式的自定义对话框 它显示了一个无边框对话框 后面的任何内容都会 稍微 变暗 我的设计师希望背后的一切都比 Android 的默认设置更暗 但不是完全黑色 有这样的设置吗 我能想到的唯一解决方法是使用全屏活动而不是对话框 只
  • 像 WhatsApp 一样发送图片

    我做了一个聊天应用程序 我想添加照片 文件共享我的应用程序中的概念与 WhatsApp 相同 我已经使用该应用程序制作了Xmpp Openfire目前我正在使用此功能进行照片共享 但它并不完全可靠 public void sendFile
  • Android 纹理仅显示纯色

    我正在尝试在四边形上显示单个纹理 我有一个可用的 VertexObject 它可以很好地绘制一个正方形 或任何几何对象 现在我尝试扩展它来处理纹理 但纹理不起作用 我只看到一种纯色的四边形 坐标数据位于 arrayList 中 the ve
  • 如何使用应用程序接口将蓝牙套接字传递给另一个活动

    因此 根据我收集的信息 套接字连接既不可序列化 也不可分割 但我需要将蓝牙连接传递给另一个活动 我不想作为中间人编写服务 所以请不要将此作为解决方案发布 我听说有一种方法可以使用自定义应用程序接口来传递这些类型的对象 但我一生都找不到这样的
  • 有多少种方法可以将位图转换为字符串,反之亦然?

    在我的应用程序中 我想以字符串的形式将位图图像发送到服务器 我想知道有多少种方法可以将位图转换为字符串 现在我使用 Base64 格式进行编码和解码 它需要更多的内存 是否有其他可能性以不同的方式做同样的事情 从而消耗更少的内存 现在我正在
  • Android AdMob:addView 在返回活动之前不会显示广告

    我正在尝试在游戏顶部添加横幅广告 我的活动使用带有自定义 SurfaceView 的relativelayout 我希望广告与 SurfaceView 重叠 广告会加载并可点击 但不会绘制到屏幕上 当我离开活动并返回时 会绘制广告 例如 通
  • 使用 DataBindingComponent 的 Inflate 方法

    当 Glide 成功渲染图像后 我在更新文本视图时看到此错误 致命异常 java lang IllegalStateException 必需 CustomBinding 类中的 DataBindingComponent 为 null 绑定适
  • R.java是手动修改的!恢复到生成的版本

    我在布局中添加了一个 xml 文件 之后这个错误就来了 但问题是我还没有接触过 R java 文件 现在 在我的新活动中 我要将其内容视图设置为我新创建的 xml 文件 但是当我执行 R layout 时 新创建的 xml 不会出现在建议中

随机推荐

  • WooCommerce:如何显示“产品附加组件”扩展中的字段?

    我正在使用 WooCommerce 的 产品附加组件 1 扩展 它允许产品的自定义字段 这会自动显示在单个产品模板上 通过对单一产品模板的一些尝试和错误 它似乎挂在了某个地方woocommerce single product summar
  • 如何将本地时间字符串转换为 UTC?

    如何转换日期时间当地时间的字符串 to a UTC 时间字符串 我确信我以前做过这个 但找不到它 所以希望将来能帮助我 和其他人 做到这一点 澄清 例如 如果我有2008 09 17 14 02 00在我当地的时区 10 我想生成一个具有等
  • 是否可以检测移动浏览器的 GPS 位置? [复制]

    这个问题在这里已经有答案了 我正在制作一个针对手机的网站 并且希望在用户访问我的默认页面时获取用户当前的 GPS 纬度 经度 以便我可以向他们显示他们所在区域的结果 使用 ASP NET 可以实现这一点吗 See Also 从手机浏览器获取
  • 如何向 tableGrob 图添加标题?

    我有一个表格 我想在它上面打印一个标题 t1 lt tableGrob top 10 events by casualties cols c EVTYPE casualties rows seq 1 10 grid draw t1 这里也提
  • Spring和Hibernate突然将事务设置为只读

    我们有一个在 JBoss 4 2 3 上运行的应用程序 使用 Spring 2 5 2 和 Hibernate 3 2 6 ga 它在 Linux JEE01 2 6 16 60 0 54 5 smp 上运行 使用自己的用户 写入另一台机器
  • 在基于 Python 文本的 GUI (TUI) 中输入

    我一直在尝试在 python 2 7 中制作自己的基于文本的 UI 但我想到了一个关于输入的想法 所以我想到了这样的事情 input raw input input center 78 但粗略地说 光标在右侧很远 在我输入它之前才意识到它不
  • PHP CURL CURLOPT_SSL_VERIFYPEER 被忽略

    由于某种原因 我无法将 CURL 与 HTTPS 一起使用 一切都工作正常 直到我运行了curl 库的升级 现在 我在尝试执行 CURL 请求时遇到以下响应 SSL CA 证书有问题 路径 访问权限 根据此处发布的有关相关问题的建议 我尝试
  • 如何在 Eclipse IDE 中运行简单的 C 程序

    我已经下载了 Eclipse C C IDE 我需要在其中运行一个简单的c 程序 打印欢迎 在尝试运行该程序时 它会弹出一条错误消息 例如 Launch failed Binary not found 我需要安装任何编译器包 请帮助我做到这
  • 返回下载文件的 Post 请求

    我正在将数据发送到我的服务器 该服务器根据请求创建一个 pdf 文件 该文件创建得很好 但我无法将文件发送回客户端 我正在使用 React 来提交表单 handleSubmit event event preventDefault var
  • 没有形式参数的可变参数函数模板

    这就是我想做的 base case void f template
  • 使用 javascript 动态修改 SVG 过滤器

    我正在尝试创建动态模糊效果 可以使用 javascript 即时修改 首先 我使用这个非常简单的 svg 过滤器
  • 为什么我使用golang的mgo库找不到ID?

    我在 golang 中使用 mgo 库进行 mongodb 操作 这是我的代码 session SetMode mgo Monotonic true coll session DB aaaw web C cron emails var re
  • Matplotlib Colorbar 更改刻度标签和定位器

    我想更改下图颜色栏中的刻度线定位器和标签 import pandas as pd import matplotlib pyplot as plt from matplotlib import dates as mdates import n
  • 在 MVVM Light 中使用参数打开新窗口的最佳实践

    我对 mvvm 和 mvvm light 相当陌生 但我想我理解它的总体思路 我不明白的是 如果我想打开一个新窗口 但该窗口需要来自调用者的数据 将该数据获取到新窗口的最佳实践是什么 如果我将数据传递给构造函数 则意味着我需要后面的代码中的
  • 如何从托管代码中捕获的本机异常中获取本机堆栈跟踪

    我有一些托管代码调用一些本机 DLL 中的方法 我有适当的符号文件 有时 该本机方法会引发异常 我会在托管代码中捕获该异常 但是 当我从捕获的异常中打印堆栈跟踪时 我只看到托管代码 最后一帧是对本机代码的调用 但它看不到本机代码中的堆栈跟踪
  • 如何在 .NET/C# 中通过反射引发事件?

    I have a third party editor that basically comprises a textbox and a button the DevExpress ButtonEdit control I want to
  • 将初始提交从 master 移至 Git 中的另一个分支

    我正在尝试迁移到 GitFlow 工作流程 并且我想重写存储库的历史记录 以便所有内容都符合新存储库的要求 目前它看起来像这样 Master A B C D E F L Release J K Development G H I M 我希望
  • 可可按钮翻转与 mouseEntered: 和 mouseExited:?

    为了在按钮上创建翻转效果 我创建了一个名为 Button 的 NSButton 子类 按钮 h import
  • 我可以在接口上使用 @MappedSuperclass 注释吗?

    我想将常见映射分组到interface 但我不能使用abstract superclass因为我的实体已经扩展了另一个class 所以我需要一个如下所示的界面 MappedSuperclass public interface NamedE
  • 在 Google Maps v2 Android 上突出显示指定路线

    是的 我目前正在我的应用程序中使用 Google Directions API 来检索两个位置之间的路线 当我发送路线方向请求时 我会以 JSON 格式检索有关路线的许多详细信息 包括路线沿线每条道路的名称 相应的起点和终点经纬度坐标以及折