2013-10-28 7 views
1

저는 wms에서 타일을 표시하기 위해 Google Maps v2를 사용하고 있습니다. 나는 this 사이트를 언급했다. 타일을로드하는 중 문제가 발생합니다. 여러 번로드되는 중입니까? any1 나를 도울 수 있습니까? 여기WMS (Android 타일로드 문제)

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

} 

편집이다 : 맵 자체를 초기화하는 동안, 줌 레벨이다 3으로 설정,이 메소드 내부 getTileUrl (int x, int y, int zoom)

답변

2

WMSTileProvider.getBoundingBox에서 웹 메카 토르 투영 단위 인 경계 상자를 미터로 계산합니다. OSGEO_WMS URL 문자열에서 bbox 단위가 EPSG : 4326 (도)으로 지정됩니다. 결과적으로 각 타일에 대한 쿼리가 잘못되었을 가능성이 큽니다.

BBOX :지도 범위에 대한 경계 상자

WMS reference BBOX와 SRS를 참조하십시오. 값은 단위의 minx, miny, maxx, maxy이며 SRS 단위입니다.

EPSG:3857 (WebMercator)

와 SRS 값을 대체하십시오