码迷,mamicode.com
首页 > 其他好文 > 详细

浏览器中展示地图

时间:2015-07-30 02:08:48      阅读:323      评论:0      收藏:0      [点我收藏+]

标签:android开发   地图   

我们在APP中开发中经常会内嵌地图展示某一具体位置,比如用地图展示某一个具体位置。以上海徐家汇为例,如下图所示:

技术分享

如果我们直接使用浏览器打开的话,参考http://developer.baidu.com/map/uri-introweb.htm

如果我们已知经纬度(lat, lng),那么很方便,我们可以使用下面的方式来展示

Intent intent = new Intent();

           intent.setAction("android.intent.action.VIEW");

           Uri content_url = Uri

                 .parse("http://api.map.baidu.com/ marker?location=31.200209,121.443481&output=html");

           intent.setData(content_url);

           startActivity(intent);

结果也能正确显示。但是更多时候我们无法知道确切经纬度,只有具体地名,那么我们又该如何处理呢? 百度WEB API都帮我们想到了这些问题,我们可以先使用http://api.map.baidu.com/geocoder?address=上海徐家汇&output=json方法来获取经纬度,进而使用上面的方式展示即可。注意我们使用的是json,如果使用Html展示,那么下面内容为:

Intent intent = new Intent();

           intent.setAction("android.intent.action.VIEW");

           Uri content_url = Uri

                 .parse("http://api.map.baidu.com/geocoder?address=上海徐家汇&output=html");

           intent.setData(content_url);

           startActivity(intent);

显示结果为:

技术分享

如果需要得到上面实际地图结果,需要点击椭圆形中的地图图标才会进入地图模式,得到:

技术分享

这样就很麻烦,需要用户点击一次才可以得到想要的内容。

故我们的方式为先用异步处理获得经纬度,然后填充到上面的API展示相关内容即可。具体实现代码如下:

class AddrAsync extends AsyncTask<String, Void, String> {

      String addr;

 

      @Override

      protected String doInBackground(String... params) {

        addr = params[0];

        return doGetGeoAddr(addr);

      }

 

      @Override

      protected void onPostExecute(String addrUrl) {

         Intent intent = new Intent();

         intent.setAction("android.intent.action.VIEW");

         Uri content_url = Uri.parse(addrUrl);

         intent.setData(content_url);

         startActivity(intent);

      }

   }

 

   public String doGetGeoAddr(String addr) {

      try {

        URL url = new URL(getAddressJson(addr));

        HttpURLConnection con = (HttpURLConnection) url.openConnection();

         String result = readStream(con.getInputStream());

        if (result == null) {

           return getAddressUrl(addr);

        } else {

           LocGeoResult loc = new Gson().fromJson(result,

                 LocGeoResult.class);

           if (loc.status.equalsIgnoreCase("ok")) {

              return getAddressDetailUrl(

                    loc.result.location.lat, loc.result.location.lng,

                    "我的位置", addr);

           }

        }

      } catch (Exception e) {

        e.printStackTrace();

      }

      return getAddressUrl(addr);

   }

 

   private String readStream(InputStream in) {

      BufferedReader reader = null;

      StringBuilder mBuilder = new StringBuilder();

      try {

        reader = new BufferedReader(new InputStreamReader(in));

        String line = "";

 

        while ((line = reader.readLine()) != null) {

           mBuilder.append(line);

        }

      } catch (IOException e) {

        e.printStackTrace();

        return null;

      } finally {

        if (reader != null) {

           try {

              reader.close();

           } catch (IOException e) {

              e.printStackTrace();

           }

        }

      }

 

      return mBuilder.toString().replace(" ", "");

   }

  

   public static String getAddressUrl(String addr) {

        String strUrl = "http://api.map.baidu.com/geocoder?address=%1$s&output=html";

        return String.format(strUrl, encodeStr(addr));

    }

   

    public static String getAddressJson(String addr) {

        String strUrl = "http://api.map.baidu.com/geocoder?address=%1$s&output=json";

        return String.format(strUrl, encodeStr(addr));

    }

   

    public static String getAddressDetailUrl(float lat, float lng, String title, String addr) {

      StringstrUrl = "http://api.map.baidu.com/marker?location=%1$f,%2$f&title=%3$s&content=%4$s&output=html";

        return String.format(strUrl, lat, lng, title, addr);

    }

   

    public static String encodeStr(String str) {

      try {

        return URLEncoder.encode(str, "UTF-8");

      } catch (UnsupportedEncodingException e) {

        e.printStackTrace();

      }

 

      return null;

   }

其中LocGeoResult如下:

public class LocGeoResult {

   public String status;

   public LocResult result;

  

   public class LocResult {

      public LocDetail location;

      public int precise;

      public int confidence;

      public String level;

   }

  

   public class LocDetail {

      public float lng;

      public float lat;

   }

}

最后调用new AddrAsync().execute(strAddr); 即可。结果如下:

技术分享

 

如果不想调用浏览器,那么在页面中嵌入webview也是可以的.获取具体的URL实现方式和上面一致

版权声明:本文为博主原创文章,未经博主允许不得转载。

浏览器中展示地图

标签:android开发   地图   

原文地址:http://blog.csdn.net/zhengdan66/article/details/47139845

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!