【问题标题】:Does android maps support ground overlay?android地图是否支持地面覆盖?
【发布时间】:2014-11-13 14:20:04
【问题描述】:

我有一张天气图像,我想在 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 来完成此操作?

【问题讨论】:

  • 你解决过这个问题吗?我们接到要求将我们的 iOS 应用程序移植到 Android 的电话,它依赖于平铺覆盖。我不确定 Android 中等效的最佳方式是什么。
  • 不确定 Google Maps Android API 何时支持 GroundOverlays,但现在可用。 API 有一个名为“GroundOverlay”的类,它的功能与等效的 javascript API 完全相同。这是link

标签: android android-maps


【解决方案1】:

您可以使用叠加来完成此操作,但您必须使用叠加的绘​​制方法进行所有自己的绘画。不过,这可能是一个很好的扩展。

【讨论】:

    【解决方案2】:

    我是这样画的。

    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 异常?
    • 我不知道。我的地图应用程序不需要用户放大,所以我很少遇到这种异常。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多