gpt4 book ai didi

android - WMS On Android 磁贴加载问题

转载 作者:行者123 更新时间:2023-11-29 21:30:43 26 4
gpt4 key购买 nike

我正在使用 Google Maps v2 显示来自 wms 的图 block 。我提到了this地点。加载图 block 时出现问题,它们加载了多次我不知道?任何人都可以帮助我吗? enter image description here

这是我的代码

package com.example.testgooglemaps;

import android.app.Activity;
import android.os.Bundle;

import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.MapFragment;
import com.google.android.gms.maps.model.TileOverlayOptions;
import com.google.android.gms.maps.model.TileProvider;

public class Lanch extends Activity {

// Google Map
private GoogleMap googleMap;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_lanch);

try {
// Loading map
initilizeMap();

} catch (Exception e) {
e.printStackTrace();
}

}

/**
* function to load map. If map is not created it will create it for you
* */
private void initilizeMap() {
if (googleMap == null) {
googleMap = ((MapFragment) getFragmentManager().findFragmentById(R.id.map)).getMap();

// check if map is created successfully or not
if (googleMap != null) {
setUpMap();
}
}
}

@Override
protected void onResume() {
super.onResume();
initilizeMap();
}

private void setUpMap() {
TileProvider wmsTileProvider = TileProviderFactory.getOsgeoWmsTileProvider();
googleMap.addTileOverlay(new TileOverlayOptions().tileProvider(wmsTileProvider));

// to satellite so we can see the WMS overlay.
googleMap.setMapType(GoogleMap.MAP_TYPE_NORMAL);
}

}

TileProvider 类...

package com.example.testgooglemaps;

import java.net.MalformedURLException;
import java.net.URL;
import java.util.Locale;

import android.util.Log;

public class TileProviderFactory {

public static WMSTileProvider getOsgeoWmsTileProvider() {

final String OSGEO_WMS = "http://localhost/geoserver/magnamaps/wms?service=WMS&version=1.1.0&request=GetMap&layers=magnamaps:bang_apartments&styles=&bbox=%f,%f,%f,%f&width=256&height=256&crs=EPSG:4326&format=image/png&transparent=true";

WMSTileProvider tileProvider = new WMSTileProvider(256, 256) {

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

WMSTileProvider 类...

package com.example.testgooglemaps;

import java.net.URLEncoder;

import com.google.android.gms.maps.model.UrlTileProvider;

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

protected String getCql() {
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;
}

}

编辑:在初始化 map 本身时,缩放级别设置为 3,在此方法中 getTileUrl(int x, int y, int zoom)

最佳答案

WMSTileProvider.getBoundingBox 中,您正在计算以 Web 墨卡托投影为单位的边界框,即米。在您的 OSGEO_WMS URL 字符串中,您指定 bbox 单位为 EPSG:4326(度)。因此,每个图 block 的查询很可能是不正确的。

参见 WMS reference对于 bbox 和 srs:

bbox: Bounding box for map extent. Value is minx,miny,maxx,maxy in units of the SRS.

尝试用 EPSG:3857 (WebMercator) 替换您的 srs 值

关于android - WMS On Android 磁贴加载问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19627851/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com