2010-06-08 62 views
4

我有一个天气图像我想用作谷歌地图android api中的覆盖图。我想达到相同的结果,我在KML文件中使用的GroundOverlay获得,如Android地图是否支持地面覆盖?

<GroundOverlay> 
    <name>myimage</name> 
    <Icon> 
    <href>myimage.png</href> 
    <viewBoundScale>0.75</viewBoundScale> 
    </Icon> 
    <LatLonBox> 
    <north>75.6088</north> 
    <south>5.0121</south> 
    <east>182.2805</east> 
    <west>120.6795</west> 
    </LatLonBox> 
</GroundOverlay> 

以上将确保我的图像的4个角留锚定到4纬度/长点上市,无论滚动,缩放等。

有没有一种方法可以完成这个使用谷歌提供的API /地图android?

+1

你有没有解决过这个问题?我们正在接听电话,将我们的iOS应用程序移植到Android,并依靠平铺叠加。我不确定在Android中最好的方式是什么。 – radven 2010-12-25 19:54:39

+0

不知道Google Maps Android API中支持GroundOverlay的时间,但现在可用。该API有一个名为“GroundOverlay”的类,它完全等效于JavaScript API的功能。这里是[链接](http://developer.android.com/reference/com/google/android/gms/maps/model/GroundOverlay.html)。 – 2014-11-13 06:20:04

回答

0

您可以使用叠加层来完成,但是您必须在Overlay的绘制方法中完成所有自己的绘制。这可能是一个很好的延伸。

0

这是我如何做绘图。

public class GroundOverlay extends Overlay { 

    private GroundOverlayData data = null; 

    private final int strokeWidth = 1; 
    private Paint borderPaint = new Paint(); 
    private Paint bitmapPaint = new Paint(); 

    public GroundOverlay(GroundOverlayData data) { 
     super(); 
     this.data = data; 

     bitmapPaint.setAlpha(100); 

     borderPaint.setStrokeWidth(strokeWidth); 
     borderPaint.setColor(Color.BLACK); 
     borderPaint.setAlpha(20); 
     borderPaint.setStyle(Paint.Style.STROKE); 
    } 

    @Override 
    public void draw(Canvas canvas, MapView mapView, boolean shadow) { 
     super.draw(canvas, mapView, shadow); 

     if (data != null) { 
      Point northWest = toPoint(mapView.getProjection(), data.getNorthWestCoordinate().getGeoPoint()); 
      Point southEast = toPoint(mapView.getProjection(), data.getSouthEastCoordinate().getGeoPoint()); 

      Rect bitmapRect = new Rect(northWest.x, northWest.y, southEast.x, southEast.y); 
      if (data.getBitmap() != null) { 

       if (!data.getBitmap().isRecycled()) { 
        canvas.drawBitmap(data.getBitmap(), null, bitmapRect, bitmapPaint); 
       } 
      } 

      //Border 
      Rect borderRect = new Rect(bitmapRect.left-strokeWidth, bitmapRect.top-strokeWidth, 
        bitmapRect.right+strokeWidth, bitmapRect.bottom+strokeWidth); 
      canvas.drawRect(borderRect, borderPaint); 
     } 
    } 

    private Point toPoint(Projection projection, GeoPoint geoPoint) { 
     Point point = new Point(); 
     projection.toPixels(geoPoint, point); 
     return point; 
    } 

    public GroundOverlayData getData() { 
     return data; 
    } 

    public void setData(GroundOverlayData data) { 
     this.data = data; 
    } 
} 

数据类:

public class GroundOverlayData { 

    private Bitmap bitmap = null; 
    private Coordinate northWestCoordinate = null; 
    private Coordinate southEastCoordinate = null; 


    public Bitmap getBitmap() { 
     return bitmap; 
    } 
    public void setBitmap(Bitmap bitmap) { 
     this.bitmap = bitmap; 
    } 
    public Coordinate getNorthWestCoordinate() { 
     return northWestCoordinate; 
    } 
    public void setNorthWestCoordinate(Coordinate northWestCoordinate) { 
     this.northWestCoordinate = northWestCoordinate; 
    } 
    public Coordinate getSouthEastCoordinate() { 
     return southEastCoordinate; 
    } 
    public void setSouthEastCoordinate(Coordinate southEastCoordinate) { 
     this.southEastCoordinate = southEastCoordinate; 
    } 


} 

public class Coordinate implements Serializable { 

    private static final long serialVersionUID = -2779462973231193512L; 

    private transient GeoPoint geoPoint = null; 

    public Coordinate() { 

    } 

    public Coordinate(Double latitude, Double longitude) { 
     this.geoPoint = Coordinate.toGeoPoint(latitude, longitude); 
    } 

    public GeoPoint getGeoPoint() { 
     return geoPoint; 
    } 

    public void setGeoPoint(GeoPoint geoPoint) { 
     this.geoPoint = geoPoint; 
    } 
    public void setLatLong(Double latitude, Double longitude) { 
     setGeoPoint(Coordinate.toGeoPoint(latitude, longitude)); 
    } 


    public static GeoPoint toGeoPoint(Double latitude, Double longitude) { 

     Double lon = longitude * 1E6; 
     Double lat = latitude * 1E6; 

     return new GeoPoint(lat.intValue(), lon.intValue()); 
    } 

} 

这是我如何解析JSON。 **注意我的JSON与上面的例子有点不同。我先清理服务器上的JSON。 **

private static List<GroundOverlayData> parseGroundOverlays(String json) throws JSONException { 

    JSONArray overlaysArray = new JSONArray(json); 
    List<GroundOverlayData> groundOverlaysData = new ArrayList<GroundOverlayData>(); 

    for (int i = 0 ; i < overlaysArray.length() ; i++) { 
     JSONObject overlayObj = (JSONObject) overlaysArray.get(i); 
     GroundOverlayData data = new GroundOverlayData(); 
     data.setBitmap(getBitmapFromUrl(overlayObj.getString("imageUrl"))); 

     data.setNorthWestCoordinate(new Coordinate(Double.valueOf(overlayObj.getString("north")), 
       Double.valueOf(overlayObj.getString("west")))); 
     data.setSouthEastCoordinate(new Coordinate(Double.valueOf(overlayObj.getString("south")), 
       Double.valueOf(overlayObj.getString("east")))); 
     groundOverlaysData.add(data); 
    } 

    return groundOverlaysData; 
} 


public static Bitmap getBitmapFromUrl(String url) throws MalformedURLException, IOException { 
    HttpURLConnection connection = (HttpURLConnection) new URL(url).openConnection(); 
    connection.setRequestProperty("User-agent","Mozilla/4.0"); 

    connection.connect(); 
    InputStream input = connection.getInputStream(); 

    Bitmap output = null; 
    try { 
     output = BitmapFactory.decodeStream(input); 
    } catch (Throwable e) { 

    } finally { 
     try { 
      input.close(); 
     } catch (Exception e) {} 
    } 
    return output; 
} 
+0

当我放大任何解决方法时,我有VMBudget异常? – Shardul 2011-10-22 14:26:53

+0

不是我所知道的。我的地图应用程序不需要用户放大,所以我很少得到这个例外。 – 2011-12-14 21:23:59