【问题标题】:How to display static google map on android imageview?如何在 android imageview 上显示静态谷歌地图?
【发布时间】:2011-07-16 11:47:08
【问题描述】:

我想在图像视图上显示静态谷歌地图。共享位置时显示类似于“Whatsapp”的内容。我该怎么做?

【问题讨论】:

    标签: android


    【解决方案1】:

    Google 提供静态地图 API,您需要 API 密钥。

    您可以从 Web 下载动态配置的位图,将其存储在文件系统或内存中,然后从中获取可绘制的内容,以便将其设置为 ImageView。

    您需要从您的坐标生成一个 url,以使用该 url 从网络加载数据。显示巴黎埃菲尔铁塔的 200x200 位图示例:

    String latEiffelTower = "48.858235";
    String lngEiffelTower = "2.294571";
    String url = "http://maps.google.com/maps/api/staticmap?center=" + latEiffelTower + "," + lngEiffelTower + "&zoom=15&size=200x200&sensor=false&key=YOUR_API_KEY"
    

    StackOverflow 已经有了一些关于如何从网络上下载图像以便在图像视图中显示的答案:link

    您可以在此处找到Google Static Maps API 的文档。

    【讨论】:

    • 太棒了!我使用了第二个地图视图,这给我带来了很多麻烦(通常每个进程只能有一个),但我可能会坚持这个解决方案。只是一个问题 - 每个应用程序 (developers.google.com/maps/documentation/staticmaps/#Limits) 的 25k 下载量是否适用于此?如果是这样,他们如何检查?请求来自不同的设备,url 没有 api 密钥...
    • 你是对的,没有 api 密钥,他们无法强制每个应用程序的 25K 限制。现在这个 api 可能没有限制,如果请求来自不同的 ip。
    • 如何用这个sn-p在地图上添加标记?
    • 现在,这不是最佳解决方案,因为 API 已更改,现在需要 API 密钥,如果未提供,有时会返回错误。此外,每天有 25k 个请求的限制。
    【解决方案2】:
    public static Bitmap getGoogleMapThumbnail(double lati, double longi){
            String URL = "http://maps.google.com/maps/api/staticmap?center=" +lati + "," + longi + "&zoom=15&size=200x200&sensor=false";
            Bitmap bmp = null;
            HttpClient httpclient = new DefaultHttpClient();   
            HttpGet request = new HttpGet(URL); 
    
            InputStream in = null;
            try {
                in = httpclient.execute(request).getEntity().getContent();
                bmp = BitmapFactory.decodeStream(in);
                in.close();
            } catch (IllegalStateException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (ClientProtocolException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
    
            return bmp;
        }
    

    【讨论】:

    • 您需要 API 密钥才能使用它
    • Google Maps Platform 服务器拒绝了您的请求。您必须使用 API 密钥来验证对 Google Maps Platform API 的每个请求。更多信息请参考g.co/dev/maps-no-account
    【解决方案3】:

    您现在还可以使用 SDK 在本机显示静态图像(这是 2014 年 12 月添加的): https://developers.google.com/maps/documentation/android/lite

    这将产生一个 MapView。

    【讨论】:

    • 这是当今最好的答案。
    • 您有完整的使用示例吗?
    • 我不建议这样做,即使在 lite 模式下,MapView 对象在加载时也会暂停你的 UI 一秒钟,如果你要在 RecyclerView 中加载地图图像,这一点尤其明显。因此,根据您的用例,您可能希望使用静态图像 API。
    【解决方案4】:

    Web 视图是我的建议。

    在asset文件夹的html文件夹中创建一个html文件static_map.html

    它的内容可能如下所示

    <!doctype html>
    <html>
    <head>
    <meta charset="utf-8">
    <title>Untitled Document</title>
    <style>
        html,body{
            padding:0;
            margin:0;
        }
        .map{
            position: fixed;
        top: 0;
        right: 0;
        bottom: 0;
        left: 0;
        width: 100%;
        height: 100%;
        }
    </style>
    </head>
    
    <body>
    <img class="map" src="REPLACE_HERE" >
    </body>
    </html>
    

    然后以编程方式创建一个静态地图 URL 并用它替换 REPLACE_HERE 字符串。然后将其加载到 Web 视图中。这将大大减少我们的工作量。

    代码如下

    try {
        String url ="https://maps.googleapis.com/maps/api/staticmap?";
        url+="&zoom=13";
        url+="&size=600x300";
        url+="&maptype=roadmap";
        url+="&markers=color:green%7Clabel:G%7C"+latitude+", "+longitude;
        url+="&key="+ YOUR_GOOGLE_API_KEY;
    
        InputStream is = context.getAssets().open("html/static_map.html");
        int size = is.available();
        byte[] buffer = new byte[size];
        is.read(buffer);
        is.close();
        String str = new String(buffer);
        str = str.replace("REPLACE_HERE", url);
        wv_map.getSettings().setJavaScriptEnabled(true);
        wv_map.loadDataWithBaseURL("", str, "text/html", "UTF-8", "");
    } catch (IOException e) {
    
    } 
    

    【讨论】:

      【解决方案5】:

      另外,另一个解决方案是 Picasso 库:“一个强大的 Android 图像下载和缓存库

      你给 Picasso 一个图片 url,然后它会做一个 GET 请求并加载图片。如果请求失败,毕加索可以设置默认图像。

      您甚至可以在图像加载时设置进度动画。

      这是一个很好且干净的解决方案。

      一个例子:

      ImageView ivUrl = (ImageView) view.findViewById(R.id.iv_photo);
      
      Picasso.with(getContext()).cancelRequest(ivUrl);
      
      Picasso.with(getContext())
          .load(imageUrlString)
          .error(R.drawable.ic_error)
          .placeholder(R.drawable.progress_animation)
          .into(ivUrl);
      

      【讨论】:

        【解决方案6】:
        String url = "https://maps.googleapis.com/maps/api/staticmap?" +
                  "center=40.714%2c%20-73.998" +
                  "&zoom=12&size=400x400" +              
                  "&key=YOUR_API_KEY_GOES_HERE;
        Picasso.get()
                    .load(url)
                    .into(imageView, new Callback() {
                        @Override
                        public void onSuccess() {
        
                        }
        
                        @Override
                        public void onError(Exception e) {
                            Toast.makeText(context, "Error to load Maps: " + e.getMessage(), Toast.LENGTH_SHORT).show();
                        }
                    });
        

        【讨论】:

          【解决方案7】:

          正如@pcans 所说,我真的很喜欢他的解决方案。您可以使用字符串作为 URL 在 ImageView 中加载图像。我建议使用第三方库来加载图像: https://github.com/koush/ion

          希望对你有帮助:)

          【讨论】:

            【解决方案8】:

            首先,您将显示在可绘制文件夹中的地图图像用作该 imageView 的背景。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多