安卓地图支持地面覆盖吗?

4

我有一张天气图片,希望在Google Maps Android API中作为叠加层使用。我想要达到与KML文件中使用GroundOverlay相同的效果,例如

<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个纬度/经度点上,无论滚动、缩放等如何变化。
是否可以使用提供给Android的Google API/Maps实现此操作?

1
你解决过这个问题吗?我们收到了将我们的 iOS 应用移植到 Android 的电话,并且它依赖于平铺覆盖。我不确定在 Android 中相应的最佳方法是什么。 - radven
不确定Google Maps Android API何时添加了对GroundOverlays的支持,但现在已经可用。该API有一个名为“GroundOverlay”的类,其功能与等效的javascript API相同。这是链接:http://developer.android.com/reference/com/google/android/gms/maps/model/GroundOverlay.html。 - Nouman Hanif
2个回答

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;
}

当我放大时,出现了VMBudget异常,有什么解决方法吗? - Shardul
据我所知没有。我的映射应用程序不需要用户缩放,因此我很少遇到这种异常情况。 - Randy Findley

0

你可以使用覆盖层来实现,但是您需要在覆盖层的paint方法中自己完成所有的绘画工作。不过,这可能是一个不错的扩展。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接