Android 使用自定义图 block 更改谷歌地图图 block

标签 android google-maps google-maps-android-api-2 google-maps-api-2

是否可以将 google map API v3 标准 map 更改为来自 url 的我自己的自定义 map ?我知道 OSMdroid 提供它,但我想使用谷歌地图 API。可能吗?

最佳答案

使用 WMS 服务确实是可以的(如果你不知道它们是什么,请 google 一下)。 这是您可以使用的一些代码: GoogleMapsAPI 使用 WMSTile 提供程序来设置 map 提供程序:

public abstract class WMSTileProvider extends UrlTileProvider {

// Web Mercator n/w corner of the map.
private static final double[] TILE_ORIGIN = { -20037508.34789244, 20037508.34789244 };
// array indexes for that data
private static final int ORIG_X = 0;
private static final int ORIG_Y = 1; // "

// Size of square world map in meters, using WebMerc projection.
private static final double MAP_SIZE = 20037508.34789244 * 2;

// array indexes for array to hold bounding boxes.
protected static final int MINX = 0;
protected static final int MAXX = 1;
protected static final int MINY = 2;
protected static final int MAXY = 3;

// cql filters
private String cqlString = "";

// Construct with tile size in pixels, normally 256, see parent class.
public WMSTileProvider(int x, int y) {
    super(x, y);
}

@SuppressWarnings("deprecation")
protected String getCql() {
    try {
        return URLEncoder.encode(cqlString, Charset.defaultCharset().name());
    } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
        return URLEncoder.encode(cqlString);
    }
}

public void setCql(String c) {
    cqlString = c;
}

// Return a web Mercator bounding box given tile x/y indexes and a zoom
// level.
protected double[] getBoundingBox(int x, int y, int zoom) {
    double tileSize = MAP_SIZE / Math.pow(2, zoom);
    double minx = TILE_ORIGIN[ORIG_X] + x * tileSize;
    double maxx = TILE_ORIGIN[ORIG_X] + (x + 1) * tileSize;
    double miny = TILE_ORIGIN[ORIG_Y] - (y + 1) * tileSize;
    double maxy = TILE_ORIGIN[ORIG_Y] - y * tileSize;

    double[] bbox = new double[4];
    bbox[MINX] = minx;
    bbox[MINY] = miny;
    bbox[MAXX] = maxx;
    bbox[MAXY] = maxy;

    return bbox;
}
}

并且您可以通过以下方式从您的 URL 实例化一个自定义的:

public static WMSTileProvider getWMSTileProviderByName(String layerName) {
        final String OSGEO_WMS = "http://YOURWMSSERVERURL?"
                + "LAYERS=" + layerName
                + "&FORMAT=image/png8&"
                + "PROJECTION=EPSG:3857&"
                + "TILEORIGIN=lon=-20037508.34,lat=-20037508.34&"
                + "TILESIZE=w=256,h=256"
                + "&MAXEXTENT=-20037508.34,-20037508.34,20037508.34,20037508.34&SERVICE=WMS&VERSION=1.1.1&REQUEST=GetMap&STYLES=&SRS=EPSG:3857"
                + "&BBOX=%f,%f,%f,%f&WIDTH=256&HEIGHT=256";

        return new WMSTileProvider(256, 256) {

            @Override
            public synchronized URL getTileUrl(int x, int y, int zoom) {
                final double[] bbox = getBoundingBox(x, y, zoom);
                String s = String.format(Locale.US, OSGEO_WMS, bbox[MINX], bbox[MINY], bbox[MAXX], bbox[MAXY]);
                try {
                    return new URL(s);
                } catch (MalformedURLException e) {
                    throw new AssertionError(e);
                }
            }
        };
    }

添加到您的 map :

TileProvider tileProvider = getWMSTileProviderByName("MYLAYERNAME");
TileOverlay tileOverlay = myMap.addTileOverlay(new TileOverlayOptions()
    .tileProvider(tileProvider));

您还应该在使用自定义图 block 提供程序时将 map 类型设置为 MAP_NONE(如果它不是透明的),这样您就可以避免加载隐藏在自定义 map 后面的 gmaps 图 block 。

关于Android 使用自定义图 block 更改谷歌地图图 block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33911324/

相关文章:

java - 为每个作业单独的专用异步任务类或接受大量参数的统一通用类

java - 如何更改不同 fragment 中的选项菜单?

android - 不同屏幕显示不一样的界面

javascript - 选择所有带有 Google map 标记复选框的复选框

java - 谷歌地图实现java.lang.RuntimeException : Unable to start activity

android - 通过 XML 旋转可绘制对象不适用于 GoogleMap V2 上的标记

java - Android 高度映射 在 OpenGL ES 2.0 中导入 OBJ 文件?

java - Android 谷歌地图中未显示的名胜古迹

c# - 将 Google map 与 Windows 8 C#/XAML 应用程序结合使用

Android 谷歌地图 v2