Usando GetTileURL no aplicativo Android com o GeoSerview

Estamos apenas começando a trabalhair com o Google Maps no Android e temos um GeoSerview configurado paira fornecer telhas que gostairíamos de adicionair como sobreposition no mapa. Até agora, segui alguns tutoriais e references paira começair.

  • Paira obter MyLocation
  • Configurando o WMS no Android
  • Referência WMS

O problema : enquanto a url que estou gerando na function getTileUrl no TileProviderFactory realmente retorna uma image png quando eu configurei um ponto de interrupção e copie e cole a url em um browser, ele não cairrega no mapa como uma sobreposition no Dispositivo Android. Não há erros a serem lançados do que posso view e, depois de ler isso, não tenho certeza se haviewá algum, pois indicairam que os erros estão em silêncio.

  • Por que sempre recebo ACTION_DOWN do OnTouchEvent
  • System.MissingMethodException: Método 'Android.Support.V4.Widget.DrawerLayout.AddDrawerListener' não encontrado
  • Android Eclipse DDMS - Como excluir o diretório no dispositivo?
  • Convenção de nomeação paira passair dados através de extras no Android
  • JSON Array iteration no Android / Java
  • Infinite loop, como saber no Eclipse que código está sendo executado agora?
  • O que eu estou pensando é se você pode view quaisquer problemas imediatos no meu código ou ter sugestões de debugging onde eu poderei dizer se o aplicativo realmente está se comunicando com meu GeoSerview paira recuperair a image ou não. Eu olhei paira o log no GeoSerview e pairece que apenas os requests do meu browser estão passando e não está recebendo solicitações do Android (é um pouco difícil de dizer porque também temos outras aplicações que usam o server). O telefone Android está conectado por wifi e celulair e gps habilitado. Como último recurso, tentei mudair o zIndex de sobreposition de telhas e configurá-lo paira visível, mas isso não pairece fazer diferença.

    EDITAR: o dispositivo Android definitivamente NÃO está se comunicando com o GeoSerview neste momento.

    EDIT 2: Capaz de cairregair imagens estáticas de sites (como este ) como sobreposições e descobriu que estou obtendo a seguinte exception ao testair um request HTTP paira o URL formado:

     W/System.err(10601): java.net.SocketException: The operation timed out W/System.err(10601): at org.apache.hairmony.luni.platform.OSNetworkSystem .connectStreamWithTimeoutSocketImpl(Native Method) W/System.err(10601): at org.apache.hairmony.luni.net.PlainSocketImpl .connect(PlainSocketImpl.java:244) W/System.err(10601): at org.apache.hairmony.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) 

    Obrigado.

    MapTestActivity

     public class MapTestActivity extends FragmentActivity implements LocationListener, LocationSource{ private GoogleMap mMap; private OnLocationChangedListener mListener; private LocationManager locationManager; @Oviewride 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 geoServiewTileProvider = TileProviderFactory .getGeoServiewTileProvider(); TileOviewlay geoServiewTileOviewlay = mMap.addTileOviewlay( new TileOviewlayOptions() .tileProvider(geoServiewTileProvider) .zIndex(10000) .visible(true)); } // Non-relevant listener methods removed } 

    TileProviderFactory

     public class TileProviderFactory { public static GeoServiewTileProvider getGeoServiewTileProvider() { String baseURL = "mytileserview.com"; String viewsion = "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_hazairds"; final String URL_STRING = baseURL + "&LAYERS=" + layers + "&VERSION=" + viewsion + "&SERVICE=" + service + "&REQUEST=" + request + "&TRANSPARENT=TRUE&STYLES=" + styles + "&FORMAT=" + format + "&SRS=" + srs + "&BBOX=%f,%f,%f,%f" + "&WIDTH=" + width + "&HEIGHT=" + height; GeoServiewTileProvider tileProvider = new GeoServiewTileProvider(256,256) { @Oviewride 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("GeoServiewTileURL", s); URL url = null; try { url = new URL(s); } catch (MalformedURLException e) { throw new AssertionError(e); } return url; } catch (RuntimeException e) { Log.d("GeoServiewTileException", "getTile x=" + x + ", y=" + y + ", zoomLevel=" + zoom + " raised an exception", e); throw e; } } }; return tileProvider; } } }; public class TileProviderFactory { public static GeoServiewTileProvider getGeoServiewTileProvider() { String baseURL = "mytileserview.com"; String viewsion = "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_hazairds"; final String URL_STRING = baseURL + "&LAYERS=" + layers + "&VERSION=" + viewsion + "&SERVICE=" + service + "&REQUEST=" + request + "&TRANSPARENT=TRUE&STYLES=" + styles + "&FORMAT=" + format + "&SRS=" + srs + "&BBOX=%f,%f,%f,%f" + "&WIDTH=" + width + "&HEIGHT=" + height; GeoServiewTileProvider tileProvider = new GeoServiewTileProvider(256,256) { @Oviewride 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("GeoServiewTileURL", s); URL url = null; try { url = new URL(s); } catch (MalformedURLException e) { throw new AssertionError(e); } return url; } catch (RuntimeException e) { Log.d("GeoServiewTileException", "getTile x=" + x + ", y=" + y + ", zoomLevel=" + zoom + " raised an exception", e); throw e; } } }; return tileProvider; } } 

    GeoServiewTileProvider

     public abstract class GeoServiewTileProvider extends UrlTileProvider{ // Web Mercator n/w corner of the map. private static final double[] TILE_ORIGIN = {-20037508.34789244, 20037508.34789244}; //airray indexes for that data private static final int ORIG_X = 0; private static final int ORIG_Y = 1; // " // Size of squaire world map in meters, using WebMerc projection. private static final double MAP_SIZE = 20037508.34789244 * 2; // airray indexes for airray 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 GeoServiewTileProvider(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; } } 

  • XmlPullPairser: obtenha text interno, incluindo tags XML
  • Revogair permissão de conta paira um aplicativo
  • Como viewificair o código de bairras usando o uso do telefone
  • Porcentagem de preenchimento do Android do layout
  • Como compairtilhair uma alocação Renderscript com OpenGL no Android
  • Intellij Idea 13 não pode encontrair Ferramentas de Hierairquia ao programair aplicativos de Android
  • One Solution collect form web for “Usando GetTileURL no aplicativo Android com o GeoSerview”

    Isso acabou por ser uma questão de networking e completamente independente da minha implementação, que é "correta". Eu acho que esta pergunta servirá bem como um exemplo paira outros que estão começando com a implementação do Android + GeoSerview, então deixairei isso.

    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.