Google 地图 API 路线

2023-12-09

我可以在应用程序中的谷歌地图上标记两个点,然后计算地图上的方向以及逐向导航吗?


我正在创建一个应用程序,用于获取两点之间的行驶方向在地图上

一步一步

step1首先创建一个类MyOverlay.java用于绘制路径

    import android.graphics.Bitmap;
import android.graphics.Canvas; 
import android.graphics.Color;
import android.graphics.Paint; 
import android.graphics.Point; 
import android.graphics.RectF; 
import android.util.Log;
//import android.util.Log;

import com.google.android.maps.GeoPoint; 
import com.google.android.maps.MapView; 
import com.google.android.maps.Overlay; 
import com.google.android.maps.Projection; 

public class MyOverLay extends Overlay 
{ 
  private GeoPoint gp1;
  private GeoPoint gp2;
  private int mRadius=6;
  private int mode=0;
  private int defaultColor;
  private String text="";
  private Bitmap img = null;


  public MyOverLay(GeoPoint gp1,GeoPoint gp2,int mode) //  GeoPoint is a int. (6E)
  { 

    this.gp1 = gp1; 
    this.gp2 = gp2;
    this.mode = mode;
    defaultColor = 999; // no defaultColor

  } 


  public MyOverLay(GeoPoint gp1,GeoPoint gp2,int mode, int defaultColor) 
  { 
    this.gp1 = gp1; 
    this.gp2 = gp2;
    this.mode = mode;
    this.defaultColor = defaultColor;
  } 

  public void setText(String t)
  {
      this.text = t;
  }

  public void setBitmap(Bitmap bitmap)
  {
      this.img = bitmap;
  }

  public int getMode()
  {
      return mode;
  }

  @Override 
  public boolean draw 
  (Canvas canvas, MapView mapView, boolean shadow, long when) 
  { 

    Projection projection = mapView.getProjection(); 
    if (shadow == false) 
    {      

      Paint paint = new Paint(); 
      paint.setAntiAlias(true); 


      Point point = new Point(); 
      projection.toPixels(gp1, point);
      // mode=1¡Gstart 
      if(mode==1)
      {
        if(defaultColor==999)
            paint.setColor(Color.BLUE);   
        else
            paint.setColor(defaultColor);   


        RectF oval=new RectF(point.x - mRadius, point.y - mRadius,  
                             point.x + mRadius, point.y + mRadius); 
        // start point
        canvas.drawOval(oval, paint); 
      }
      // mode=2¡Gpath 
      else if(mode==2)
      {
        if(defaultColor==999)
            paint.setColor(Color.RED);   
        else
            paint.setColor(defaultColor);   

        Point point2 = new Point(); 
        projection.toPixels(gp2, point2);
        paint.setStrokeWidth(5);
        paint.setAlpha(120);       
        canvas.drawLine(point.x, point.y, point2.x,point2.y, paint);       
      }
      /* mode=3¡Gend */
      else if(mode==3)
      {
        /* the last path */

        if(defaultColor==999)
            paint.setColor(Color.GREEN);   
        else
            paint.setColor(defaultColor);   

        Point point2 = new Point(); 
        projection.toPixels(gp2, point2);
        paint.setStrokeWidth(5);
        paint.setAlpha(120);
        canvas.drawLine(point.x, point.y, point2.x,point2.y, paint);


        RectF oval=new RectF(point2.x - mRadius,point2.y - mRadius,  
                             point2.x + mRadius,point2.y + mRadius); 
        /* end point */
        paint.setAlpha(255);
        canvas.drawOval(oval, paint);
      }
      /* mode=4¡Gcar */
      else if(mode==4)
      {

        if(defaultColor==999)
            paint.setColor(Color.GREEN);   
        else
            paint.setColor(defaultColor);   

        Point point2 = new Point(); 
        projection.toPixels(gp2, point2); 
        paint.setTextSize(20);
        paint.setAntiAlias(true); 
        canvas.drawBitmap(img, point2.x, point2.y,paint);      
        canvas.drawText(this.text, point2.x, point2.y, paint);
    //    Log.d(TAG, "Draw the text="+this.text+ " at point="+point2.x + "," + point2.y);
      }

      else if(mode==5)
      {

        if(defaultColor==999)
            paint.setColor(Color.GREEN);   
        else
            paint.setColor(defaultColor);   

        Point point2 = new Point(); 
        projection.toPixels(gp2, point2); 
        paint.setTextSize(20);
        paint.setAntiAlias(true); 
        canvas.drawBitmap(img, point2.x, point2.y,paint);



    //    Log.d(TAG, "Draw the text="+this.text+ " at point="+point2.x + "," + point2.y);
      }



    } 
    return super.draw(canvas, mapView, shadow, when); 
  } 


} 

第2步:创建类名DrivingDirectionActivity.java

   import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;

import org.w3c.dom.Document;
import org.xml.sax.SAXException;

import android.graphics.Color;
import android.os.Bundle;
import android.util.Log;

import com.android.code.R;
import com.google.android.maps.GeoPoint;
import com.google.android.maps.MapActivity;
import com.google.android.maps.MapView;

/**
 * @author ashish
 * 
 *  
 *
 */
public class DrivingDirectionActivity extends MapActivity {



    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.google_map_driving_direction_view);

        MapView mapView = (MapView) findViewById(R.id.myMapView1);

        double src_lat = 28.632808;
        double src_long = 77.218276;
        double dest_lat = 28.588535;
        double dest_long = 77.255130;
        GeoPoint srcGeoPoint = new GeoPoint((int) (src_lat * 1E6),
                (int) (src_long * 1E6));
        GeoPoint destGeoPoint = new GeoPoint((int) (dest_lat * 1E6),
                (int) (dest_long * 1E6));

        DrawPath(srcGeoPoint, destGeoPoint, Color.GREEN, mapView);

        mapView.getController().animateTo(srcGeoPoint);
        mapView.getController().setZoom(15);

    }

    /* (non-Javadoc)
     * @see com.google.android.maps.MapActivity#isRouteDisplayed()
     */



    protected boolean isRouteDisplayed() {
        // TODO Auto-generated method stub
        return false;
    }
    private void DrawPath(GeoPoint src, GeoPoint dest, int color,MapView mMapView01) {

        // connect to map web service
        Document doc = getDocument(makeUrl(src,dest));
        System.out.println(doc.toString());
        try {

            if (doc.getElementsByTagName("GeometryCollection").getLength() > 0) {

                // String path =
                // doc.getElementsByTagName("GeometryCollection").item(0).getFirstChild().getFirstChild().getNodeName();
                String path = doc.getElementsByTagName("GeometryCollection")
                        .item(0).getFirstChild().getFirstChild()
                        .getFirstChild().getNodeValue();

                Log.d("xxx", "path=" + path);

                String[] pairs = path.split(" ");
                String[] lngLat = pairs[0].split(","); // lngLat[0]=longitude
                                                        // lngLat[1]=latitude
                                                        // lngLat[2]=height

                // src
                GeoPoint startGP = new GeoPoint((int) (Double.parseDouble(lngLat[1]) * 1E6),
                                                    (int) (Double.parseDouble(lngLat[0]) * 1E6));
                mMapView01.getOverlays().add(new MyOverLay(startGP, startGP, 1));

                GeoPoint gp1;
                GeoPoint gp2 = startGP;
                for (int i = 1; i < pairs.length; i++) {
                    // the last one would be crash

                    lngLat = pairs[i].split(",");
                    gp1 = gp2;
                    // watch out! For GeoPoint, first:latitude, second:longitude
                    gp2 = new GeoPoint((int) (Double.parseDouble(lngLat[1]) * 1E6),
                            (int) (Double.parseDouble(lngLat[0]) * 1E6));
                    mMapView01.getOverlays().add(new MyOverLay(gp1, gp2, 2, color));
                    Log.d("xxx", "pair:" + pairs[i]);
                }
                mMapView01.getOverlays().add(new MyOverLay(dest, dest, 3)); // use
                                                                            // the
                                                                            // default
                                                                            // color
            }
        } catch ( Exception e) {

            e.printStackTrace();
        }  

    }

    private Document getDocument(String urlString) {
        // TODO Auto-generated method stub

        Document doc = null;
        HttpURLConnection urlConnection = null;
        URL url = null;
        try {
            url = new URL(urlString.toString());
            urlConnection = (HttpURLConnection) url.openConnection();
            urlConnection.setRequestMethod("GET");
            urlConnection.setDoOutput(true);
            urlConnection.setDoInput(true);
            urlConnection.connect();

            DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
            DocumentBuilder db = dbf.newDocumentBuilder();
            doc = db.parse(urlConnection.getInputStream());
        } catch (Exception e) {
            // TODO: handle exception
        }

        return doc;
    }

    private String makeUrl(GeoPoint src, GeoPoint dest) {
        // TODO Auto-generated method stub

        // get the kml (XML) doc. And parse it to get the coordinates(direction
        // route).

        StringBuilder urlString = new StringBuilder();
        urlString.append("http://maps.google.com/maps?f=d&hl=en");
        urlString.append("&saddr=");// from
        urlString.append(Double.toString((double) src.getLatitudeE6() / 1.0E6));
        urlString.append(",");
        urlString.append(Double.toString((double) src.getLongitudeE6() / 1.0E6));
        urlString.append("&daddr=");// to
        urlString.append(Double.toString((double) dest.getLatitudeE6() / 1.0E6));
        urlString.append(",");
        urlString.append(Double.toString((double) dest.getLongitudeE6() / 1.0E6));
        urlString.append("&ie=UTF8&0&om=0&output=kml");

        Log.d("xxx", "URL=" + urlString.toString());
        return urlString.toString();
    }

}

现在执行..

如果这不好,那么您可以将您当前的位置作为源位置传递

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

Google 地图 API 路线 的相关文章

  • 检查双精度值的等于和不等于条件

    我在比较两者时遇到困难double values using and 我创建了 6 个双变量并尝试进行比较If健康 状况 double a b c d e f if a b c d e f My code here in case of t
  • 无法解析符号 FlutterActivity

    我使用 VCS gt Checkout from Version Control 将 flutter 项目从 github 导入到 Android Studio 中 现在我面临的问题是 Cannot resolve symbol Flutt
  • Google Inbox 类似 RecyclerView 项目打开动画

    目前 我正在尝试实现 Google Inbox 例如RecyclerView行为 我对电子邮件打开动画很好奇 我的问题是 该怎么做 我的意思是 他们使用了哪种方法 他们用过吗ItemAnimator dispatchChangeStarti
  • Android SDK 中可用的所有“android.intent.action”操作的详尽列表是什么?

    大家好 我想知道标准 Android SDK 中定义的所有 Intent 操作是否有详尽的参考 我正在考虑完整的 android intent action someaction 名称 而不是 Intent 类中定义的方便别名操作的限制列表
  • layout.xml 的用途是什么?

    人们为什么使用layout xml在他们的resources like
  • 下载图像并显示它

    应用程序的主要目的是下载和显示图像 但是当我尝试启动应用程序时它崩溃了 这是我的代码 private DownloadImageTask task protected void onCreate Bundle savedInstanceSt
  • Android 手机应用意图

    我想在手机上启动手机应用程序作为意图 我正在使用这个代码 startActivity getPackageManager getLaunchIntentForPackage com android phone 但该函数抛出一个空指针异常 因
  • Cordova 地理定位不适用于 Android

    我想在 Android 上使用地理定位 我用 Apache Cordova 编写应用程序 地理定位在 android 电脑模拟器和 android 手机上均不起作用 I try http cordova apache org docs en
  • 在 Android 上的测试用例之外运行 ExtractDecodeEditEncodeMuxTest

    我正在尝试添加在 Android 上提取 解码 编辑 编码和混合视频的功能 因此 我发现了一些非常有用的实现 它是Android CTS的一部分ExtractDecodeEditEncodeMuxTest https android goo
  • 如何在 Android 清单文件中设置文本外观?

    是否可以做相当于 setTextAppearance context android R style TextAppearance Medium 在 Android 应用程序的清单文件中 android textAppearance and
  • 版本 5 上带有 getBackground().setAlpha 的按钮 - 棒棒糖无法正常工作

    我有这段代码 适用于自 API 14 以来的每个版本 但在 Android 5 0 Lollipop 上无法正常工作 以下是我希望按钮出现的方式 单击按钮1 buttonArrivals getBackground setAlpha 180
  • 带有方向的谷歌静态地图

    我的项目列表中有带有迷你地图的生成地点 地图上应该有 2 个点以及这两点之间的彩色道路方向 它应该看起来像这样 这应该是静态图片 因为页面上会有很多这样的不同方向的图片 但正如我所见 谷歌静态地图不允许绘制这样的图像 两点之间只能有直线 如
  • onTouchEvent()中如何区分移动和点击?

    在我的应用程序中 我需要处理移动和单击事件 一次点击是由一个 ACTION DOWN 操作 多个 ACTION MOVE 操作和一个 ACTION UP 操作组成的序列 理论上 如果您收到 ACTION DOWN 事件 然后收到 ACTIO
  • 点击监听器的公共类

    我的所有 6 项活动中有 7 个按钮 所有 6 个按钮在所有活动中都具有相同的功能 如何为这 6 个按钮执行通用的单击事件侦听器 您可以创建一个实现 View OnClickListener 的新类 如下所示 public class My
  • Android开发:未定义方法

    大家好 我是 Android 和 Eclipse 的新手 我刚刚遵循了developer android com 上的教程 现在我在添加操作栏 http developer android com training basics actio
  • 无法在 Android 模拟器中安装 apk

    我正在尝试通过 adb shell 在 ICS 模拟器中安装 apk 从一个站点下载 但出现以下错误 失败 INSTALL FAILED UID CHANGED 可能是什么问题 只需 rm r 有问题的数据目录即可 如果您在安装时遇到此错误
  • Jetpack Compose 部分或开放侧边框

    我正在尝试绘制部分或一侧开放的矩形圆形边框以实现此效果 玩了一下之后我得到了这个 这是通过以下方式完成的 RoundedCornerShape topStartPercent 50 bottomStartPercent 50 start R
  • OpenGL ES 2.0 屏幕闪烁

    我面临着一个大问题 我正在使用带有 Android 4 0 3 的 Transformer tf101 选项卡 我的应用程序使用自定义 OpenGL ES 2 0 表面 我正在用纹理渲染多个平面 该纹理大约发生变化 每秒 20 次 并通过传
  • Android:获取最新意图

    如何获取发送到活动的最后一个意图 的文档onNewIntent 建议我需要做这样的事情 class MyActivity public void onNewIntent Intent intent setIntent intent reac
  • 绘制大位图时 nSyncAndDrawFrame 速度极慢

    我想用多个大位图优化视差滚动视图 在我的 Nexus 5 上 一切都很顺利 Traceview 转储如下所示 doFrame 方法大约需要 18 毫秒才能完成 但是 当使用我的 Nexus 7 或 Android 6 模拟器 Genymot

随机推荐

  • Python 中的 MemoryError 钩子?

    有没有一种方法可以全局捕获 MemoryError 异常 以便库可以清除缓存而不是让用户代码看到 MemoryError 我正在用 Python 开发一个内存缓存库 它存储非常大的对象 以至于用户通常希望使用所有可用的 RAM 来简化脚本和
  • 子类化 SimpleCursorAdapter 以包含 ConvertView 以节省内存

    我一直在搜索示例和教程 但我似乎无法理解如何在子类 SimpleCursorAdapter 中处理回收 我知道 对于常规 ArrayAdapter 您可以检查 ConvertView 是否为 null 如果为 null 则从 xml 中膨胀
  • 在 VBA 中使用 FTP

    我编写了 VBA 代码 该代码根据 Excel 数据 Websphere MQ Define Job 为 IBM 主机创建一个包含作业代码的 txt 文件 如果能够通过 FTP 自动将此文件传输到主机 那就太酷了 此时我通过以下方式手动执行
  • 在 iphone webView 中打开 .docx 的代码

    我是 iPhone 新手 我正在尝试在 UIwebView 中打开 docx 文件 我编写了以下代码 NSString urlAddress NSBundle mainBundle pathForResource Arabic litera
  • 为什么有些 PHP 安装有 $_SERVER['SCRIPT_URI'] 而其他安装没有?

    我运行两台 Apache 2 服务器 一个是 PHP5 2 另一个是 PHP5 3 5 3 机器上有什么原因吗 SERVER SCRIPT URI 这个变量从哪里来 它显然是来自 Apache 环境的东西 并且 PHP 手册中没有记录它 然
  • 对 Java 方法签名的完全限定引用

    是什么proper如何在 Java 中编写对方法名称的完全限定引用 Message com sun mail imap IMAPFolder addMessages Message Message com sun mail imap IMA
  • VueJS 手风琴表 - 出现在表之外

    我有一个表 其中使用 ajax 获取数据 我试图创建一个表 其中每行都有一个关联的隐藏行 单击该行可切换隐藏行的显示 隐藏行包含一个手风琴 问题是手风琴变得一团糟并显示在表格底部 而不是显示在它被单击的特定行下方 我的代码如下 table
  • 它将打印什么 console.log(1+ + "2")

    为什么这个 JavaScript 声明 console log 1 2 print 3 作为输出 我不知道为什么它会打印这个 我期望 12 or 字符串前面的操作数将其转换为数字 所以在这里 2 会变成2因此结果将是3 gt 1 2 2 2
  • Android 检测实际正在播放的铃声(Ringtone.isPlaying 问题)

    在 Android 上 我在尝试找出实际正在播放的铃声时遇到问题 我不是在尝试检测默认铃声 而是实际播放的铃声 因为由于用户为特定铃声设置了特定铃声 因此实际播放的铃声可能会有所不同 接触 当我循环浏览 成功 RingtoneManager
  • Spark 流不记得以前的状态

    我编写了带有状态转换的 Spark Streaming 程序 看来我的 Spark 流应用程序正在通过检查点正确地进行计算 但是 如果我终止程序并再次启动它 它不会读取之前的检查点数据并从头开始 这是预期的行为吗 我是否需要更改程序中的任何
  • 原生IOS设置远程视频描述发送参数失败

    这是 sdpOffer offer v 0 o 1514366952141741 1 输入 IP4hostx s 安装点 99 t 0 0 a 组 捆绑视频 a msid 语义 WMS janus m 视频 9 UDP TLS RTP SA
  • 将一个 TLD 的所有页面重定向到另一个 TLD

    今晚我简直要抓狂地想弄清楚这个问题了 我希望有人能帮助我 我的网站有 3 个 TLD 类似于以下内容 www domain com www domain org www domain net 它们都位于同一目录中 我想设置 301 重定向
  • PHP 开放时间 [关闭]

    Closed 这个问题需要细节或清晰度 目前不接受答案 我有一个客户想要一家在线披萨店 当然 他也不希望顾客在营业时间之后下订单 我为此制作了一个简单的脚本 我想我将来可能会与任何想要的人分享
  • DES、三重 DES、AES、河豚数据加密的比较

    有人比较这些加密算法的优缺点吗 Use AES 更详细地说 DES 是七十年代的旧 数据加密标准 它的密钥大小对于适当的安全性而言太短 56 个有效位 这可以被暴力破解 正如已经证明的那样十多年前 此外 DES 使用 64 位块 这在使用相
  • 使用 SharedPreferences 设置登录状态并在应用程序启动时检索它 - Flutter

    我有一个 flutter 应用程序 在该应用程序启动时我必须检查登录状态并相应地调用相关屏幕 用于启动应用程序的代码 class MyApp extends StatefulWidget override MyAppState create
  • 左外连接与 Entity Framework Core

    我正在尝试使用 EF7 7 0 0 rc1 final vNext RC1 rc1 final 和 SQL Server 2014 执行左外连接请求 数据库 宠物 身份证 姓名 用户 ID 姓名 PetId 这个有效 var queryWo
  • ASP.NET Core 中基于令牌的身份验证(已更新)

    我正在使用 ASP NET Core 应用程序 我正在尝试实现基于令牌的身份验证 但不知道如何使用新的保安系统 我的场景 客户端请求令牌 我的服务器应该授权用户并返回 access token 客户端将在以下请求中使用该令牌 这里有两篇关于
  • 具有格式相关类型的柯里化函数

    据我所知 F 不像处理其他函数那样处理 printfn 因为它依赖于字符串参数的类型 有人可以向我解释为什么这会阻止我这样做吗 let printn printfn A 该错误表示类型被推断为 a gt unit 我需要添加显式参数或类型注
  • 使用Friendly_id匹配单个Rails路线中的多个模型

    我有一个公司和一个用户模型 两者都有一个通过Friendly id 的slug 确保两种模型中的段头都是唯一的 我想要网址 http www example com any company name http www example com
  • Google 地图 API 路线

    我可以在应用程序中的谷歌地图上标记两个点 然后计算地图上的方向以及逐向导航吗 我正在创建一个应用程序 用于获取两点之间的行驶方向在地图上 一步一步 step1首先创建一个类MyOverlay java用于绘制路径 import androi