2014-10-02 1 views
1

Я создал пользовательский UrlTileProvider для визуализации плитки в MapsActivity следующим образом:Пользовательские плитки не отображаются на карте GoogleMap

public class MapsActivity extends FragmentActivity { 

    private GoogleMap mMap; 

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

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

    private void setUpMapIfNeeded() { 
     if (mMap == null) { 
      mMap = ((SupportMapFragment) getSupportFragmentManager() 
       .findFragmentById(R.id.map)).getMap(); 
      if (mMap != null) { 
       setUpMap(); 
      } 
     } 
    } 

    private void setUpMap() { 
     TileProvider tileProvider = new CustomTileProvider(); 
     TileOverlayOptions tileOverlayOptions = new TileOverlayOptions() 
      .tileProvider(tileProvider); 
     tileOverlayOptions.visible(true); 
     tileOverlayOptions.zIndex(10000); 
     TileOverlay tileOverlay = mMap.addTileOverlay(tileOverlayOptions); 
    } 
} 

..

public class CustomTileProvider extends UrlTileProvider { 

    private static final int TILE_WIDTH = 256; 
    private static final int TILE_HEIGHT = 256; 
    private static final int MIN_ZOOM = 12; 
    private static final int MAX_ZOOM = 16; 
    private static final String TILE_SERVER_URL = ... 

    public CustomTileProvider() { 
     this(TILE_WIDTH, TILE_HEIGHT); 
    } 

    public CustomTileProvider(final int width, final int height) { 
     super(width, height); 
    } 

    @Override 
    public URL getTileUrl(int x, int y, int zoom) { 
     String tileServerUrl = String.format(TILE_SERVER_URL, zoom, x, y); 

     if (!checkTileExists(x, y, zoom)) { 
      return null; 
     } 

     try { 
      return new URL(tileServerUrl); 
     } catch (MalformedURLException exception) { 
      throw new AssertionError(exception); 
     } 
    } 

    private boolean checkTileExists(int x, int y, int zoom) { 
     if ((zoom < MIN_ZOOM || zoom > MAX_ZOOM)) { 
      return false; 
     } 
     return true; 
    } 

} 

Это в основном те же, которые могут можно найти в Google documentation.

По какой-то причине плитки не отображаются в области, предоставляемой сервером. Метод getTileUrl() никогда не вызывается.

+0

Вы должны вернуть TileProvider.NO_TILE вместо нулевого, если вы не хотите предоставлять плитки для некоторого уровня масштабирования или координат x/y. Если вы абсолютно уверены, что метод никогда не вызывается, это, конечно же, не устранит вашу проблему. – user2808624

+0

Класс 'abstract'' UrlTileProvider' требует реализации 'public abstract java.net.URL getTileUrl (int i, int i1, int i2);' – JJD

ответ

0

Проблема заключалась в том, что String.format выбрасывает IllegalFormatException, который не отображается в журналах.

Я рекомендую его окружить блоком try ... catch.

Кроме того, url-кодированный % в TILE_SERVER_URL вмешивается в формат заполнителей в String.format(TILE_SERVER_URL, zoom, x, y).