Uso de getTileURL en la aplicación Android con GeoServer

Estamos empezando a trabajar con Google Maps en Android y tenemos un GeoServer configurado para proporcionar azulejos que nos gustaría agregar como superposición en el mapa. Hasta ahora, he seguido algunos tutoriales y referencias para empezar.

  • Para obtener MyLocation
  • Configuración de WMS en Android
  • Referencia de WMS

El problema : Mientras que la url que estoy generando en la función getTileUrl en el TileProviderFactory realmente devuelve una imagen png cuando establezco un punto de interrupción y copiar y pegar la url en un navegador, no se carga en el mapa como una superposición en el Dispositivo Android. No hay errores que se lanzan de lo que puedo ver y después de leer esto no estoy seguro si habrá alguno ya que han indicado que los errores están siendo silenciado.

Lo que me pregunto es si usted puede ver cualquier problema inmediato en mi código o tiene alguna sugerencia para la depuración, donde voy a ser capaz de decir si la aplicación es realmente la comunicación con mi GeoServer para recuperar la imagen o no. He mirado el registro en el GeoServer y parece como si sólo las solicitudes de mi navegador están pasando y no está recibiendo ninguna solicitud de Android (es un poco difícil de decir porque tenemos otras aplicaciones que utilizan el servidor también). El teléfono Android está conectado tanto por wifi como por celular y tiene GPS habilitado. Como último recurso he intentado cambiar el zIndex de la capa del azulejo y fijarlo a visible pero esto no parecía hacer ninguna diferencia.

EDIT: El dispositivo Android definitivamente no se está comunicando con GeoServer en este momento.

EDIT 2: Capaz de cargar imágenes estáticas de sitios web (como este ) como superposiciones y encontró que estoy recibiendo la siguiente excepción en las pruebas de una solicitud HTTP a la URL formada:

 W/System.err(10601): java.net.SocketException: The operation timed out W/System.err(10601): at org.apache.harmony.luni.platform.OSNetworkSystem .connectStreamWithTimeoutSocketImpl(Native Method) W/System.err(10601): at org.apache.harmony.luni.net.PlainSocketImpl .connect(PlainSocketImpl.java:244) W/System.err(10601): at org.apache.harmony.luni.net.PlainSocketImpl .connect(PlainSocketImpl.java:533) W/System.err(10601): at java.net.Socket .connect(Socket.java:1074) W/System.err(10601): at org.apache.http.conn.scheme.PlainSocketFactory .connectSocket(PlainSocketFactory.java:119) 

Gracias.

MapTestActivity

 public class MapTestActivity extends FragmentActivity implements LocationListener, LocationSource{ private GoogleMap mMap; private OnLocationChangedListener mListener; private LocationManager locationManager; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_map_test); setupLocationManager(); setupMapIfNeeded(); } private void setupLocationManager() { this.locationManager = (LocationManager) getSystemService(LOCATION_SERVICE); if (locationManager != null) { boolean gpsIsEnabled = locationManager.isProviderEnabled( LocationManager.GPS_PROVIDER); boolean networkIsEnabled = locationManager.isProviderEnabled( LocationManager.NETWORK_PROVIDER); if(gpsIsEnabled) { this.locationManager.requestLocationUpdates( LocationManager.GPS_PROVIDER, 5000L, 10F, this); } else if(networkIsEnabled) { this.locationManager.requestLocationUpdates( LocationManager.NETWORK_PROVIDER, 5000L, 10F, this); } else { //Show an error dialog that GPS is disabled... } } else { // Show some generic error dialog because // something must have gone wrong with location manager. } } private void setupMapIfNeeded() { // Do a null check to confirm that we have not already instantiated the // map. if (mMap == null) { // Try to obtain the map from the SupportMapFragment. mMap = ((SupportMapFragment) getSupportFragmentManager() .findFragmentById(R.id.map)).getMap(); // Check if we were successful in obtaining the map. if (mMap != null) { setUpMap(); } mMap.setLocationSource(this); } } private void setUpMap() { // TODO Auto-generated method stub mMap.setMyLocationEnabled(true); TileProvider geoServerTileProvider = TileProviderFactory .getGeoServerTileProvider(); TileOverlay geoServerTileOverlay = mMap.addTileOverlay( new TileOverlayOptions() .tileProvider(geoServerTileProvider) .zIndex(10000) .visible(true)); } // Non-relevant listener methods removed } 

TileProviderFactory

 public class TileProviderFactory { public static GeoServerTileProvider getGeoServerTileProvider() { String baseURL = "mytileserver.com"; String version = "1.3.0"; String request = "GetMap"; String format = "image/png"; String srs = "EPSG:900913"; String service = "WMS"; String width = "256"; String height = "256"; String styles = ""; String layers = "wtx:road_hazards"; final String URL_STRING = baseURL + "&LAYERS=" + layers + "&VERSION=" + version + "&SERVICE=" + service + "&REQUEST=" + request + "&TRANSPARENT=TRUE&STYLES=" + styles + "&FORMAT=" + format + "&SRS=" + srs + "&BBOX=%f,%f,%f,%f" + "&WIDTH=" + width + "&HEIGHT=" + height; GeoServerTileProvider tileProvider = new GeoServerTileProvider(256,256) { @Override public synchronized URL getTileUrl(int x, int y, int zoom) { try { double[] bbox = getBoundingBox(x, y, zoom); String s = String.format(Locale.US, URL_STRING, bbox[MINX], bbox[MINY], bbox[MAXX], bbox[MAXY]); Log.d("GeoServerTileURL", s); URL url = null; try { url = new URL(s); } catch (MalformedURLException e) { throw new AssertionError(e); } return url; } catch (RuntimeException e) { Log.d("GeoServerTileException", "getTile x=" + x + ", y=" + y + ", zoomLevel=" + zoom + " raised an exception", e); throw e; } } }; return tileProvider; } } 

GeoServerTileProvider

 public abstract class GeoServerTileProvider 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 MINY = 1; protected static final int MAXX = 2; protected static final int MAXY = 3; public GeoServerTileProvider(int width, int height) { super(width, height); } // 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; } } 

    One Solution collect form web for “Uso de getTileURL en la aplicación Android con GeoServer”

    Esto resultó ser un problema de red y completamente ajeno a mi implementación que es "correcto". Supongo que esta pregunta servirá como un ejemplo para otros que están empezando con la implementación de Android + GeoServer por lo que lo dejaré.

    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.