2012-04-05 9 views
2

Osmdroidを使用してオフラインモードでマップを表示するAndroidアプリを開発しています。私はズームインまたはズームアウトしたいときに、地図をつまんだり、ビルドインズームコントロールを使ったりするときに問題があります。地図をズームインすると、タイルが常に正しくレンダリングされるとは限りません。ズームアウトすると、マップに灰色のタイルが表示されることもあります。マップ上に表示される場所には関係ありません。私のマップタイルは、Mapnikソースを/ mnt/sdcard/osmdroidフォルダにあるosmdroid zipファイルに保存されます。私はosmdroid-3.0.7を使用しています。ズーム後のOsmdroidオフラインモードの更新タイル

だから、どんな助けも歓迎です。

(私の含みがここにコードに含まれていません)以下の私のコードを参照してください:

public class MapActivity extends OSMapActivity { 

private ArrayList<String[]> mapPointData; 
private ArrayList<String[]> multiData; 

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    super.setContentView(R.layout.map); 

    setABTitle(getIntent().getExtras().getStringArray("geoLoc")[0]); 
    actionButtonVisible(getIntent().getExtras().getBoolean("routeList")); 

    initLayout(); 
    setHomePoint(); 
} 

@Override 
protected void onResume() { 
    super.onResume(); 
    Prefs.clearMapPrefs(this); 
} 

private void initLayout() { 

    c = this; 
    // Buttons @ top of the activity 
    doseeBN = (ImageView) findViewById(R.id.mapDoseeBN); 
    eatdrinkBN = (ImageView) findViewById(R.id.mapEatdrinkBN); 
    nightlifeBN = (ImageView) findViewById(R.id.mapNightlifeBN); 
    sleepBN = (ImageView) findViewById(R.id.mapSleepBN); 

    // The LinearLayout with the ScrollView for the Subcategories in "Do & See" 
    doseeLL = (LinearLayout) findViewById(R.id.doseeSubCatLL); 
    top10BN = (Button) findViewById(R.id.mapDoseeTop10BN); 
    monumentsBN = (Button) findViewById(R.id.mapDoseeMonumentsBN); 
    museumBN = (Button) findViewById(R.id.mapDoseeMuseumsBN); 
    cultureBN = (Button) findViewById(R.id.mapDoseeCultureBN); 
    attractionsBN = (Button) findViewById(R.id.mapDoseeAttractionBN); 
    shoppingBN = (Button) findViewById(R.id.mapDoseeShoppingBN); 
    marketBN = (Button) findViewById(R.id.mapDoseeMarketBN); 

    // Init of the map an mapcontroller 
    mapView = (MapView) findViewById(R.id.osmMV); 
    mapView.setTileSource(TileSourceFactory.MAPNIK); 
    mapController = mapView.getController(); 
    mapController.setZoom(16); 
    mapView.setUseDataConnection(false); 

    mapView.setBuiltInZoomControls(true); 
    mapView.setMultiTouchControls(true); 
    // mapView.setDrawingCacheEnabled(true); 


    mapData = new ArrayList<String[]>(); 
    mapPointData = new ArrayList<String[]>(); 
    multiData = new ArrayList<String[]>(); 
} 

private void setHomePoint() { 
    //GeoPoint centerPt = new GeoPoint(50.89489, 4.34140); // Point of Grand Place Brussels 

    homeLat = Double.parseDouble(getIntent().getExtras().getStringArray("geoLoc")[1]); 
    homeLong = Double.parseDouble(getIntent().getExtras().getStringArray("geoLoc")[2]); 

    GeoPoint centerPt = new GeoPoint(homeLat, homeLong); 

    if (checkMapRange(Double.parseDouble(getIntent().getExtras().getStringArray("geoLoc")[1]), 
      Double.parseDouble(getIntent().getExtras().getStringArray("geoLoc")[2]))) { 
     mapController.setCenter(centerPt); 

     Drawable marker = getResources().getDrawable(R.drawable.ic_pin_marker); 

     ArrayList<OverlayItem> items = new ArrayList<OverlayItem>(); 
     items.add(new OverlayItem("Here I am!", "Hello", centerPt)); 
     ItemizedOverlay<OverlayItem> itemOverlay = 
           new ItemizedIconOverlay<OverlayItem>(items, marker, null, new DefaultResourceProxyImpl(this)); 
     mapView.getOverlays().add(itemOverlay); 
     mapView.invalidate(); 
    } else { 
     mapController.setCenter(new GeoPoint(50.89489, 4.34140)); 
     mapController.setZoom(11); 
     Action.alert(this, getResources().getString(R.string.alert_title_notinregion), 
       getResources().getString(R.string.alert_message_notinregion), false); 
     mapView.setClickable(false); 
    } 
} 

public void onClickMapPointsBN(View v) { 

    switch(v.getId()) { 
    case R.id.mapDoseeBN: 
     setPrefsCategory("DOSEE", doseeBN, "btn_map_dosee", "btn_map_dosee_pressed"); 
     break; 
    case R.id.mapEatdrinkBN: 
     setPrefsCategory("EATDRINK", eatdrinkBN, "btn_map_eatdrink", "btn_map_eatdrink_pressed"); 
     break; 
    case R.id.mapNightlifeBN: 
     setPrefsCategory("NIGHTLIFE", nightlifeBN, "btn_map_nightlife", "btn_map_nightlife_pressed"); 
     break; 
    case R.id.mapSleepBN: 
     setPrefsCategory("SLEEP", sleepBN, "btn_map_sleep", "btn_map_sleep_pressed"); 
     break; 
    } 

    setPOIs(); 
} 

public void onClickDoseeListBN(View v) { 
    switch (v.getId()) { 
    case R.id.mapDoseeTop10BN: 
     setDosseSubCat(Definitions.doseeList[0], top10BN); 
     break; 
    case R.id.mapDoseeMuseumsBN: 
     setDosseSubCat(Definitions.doseeList[2], museumBN); 
     break; 
    case R.id.mapDoseeCultureBN: 
     setDosseSubCat(Definitions.doseeList[3], cultureBN); 
     break; 
    case R.id.mapDoseeAttractionBN: 
     setDosseSubCat(Definitions.doseeList[4], attractionsBN); 
     break; 
    case R.id.mapDoseeShoppingBN: 
     setDosseSubCat(Definitions.doseeList[5], shoppingBN); 
     break; 
    case R.id.mapDoseeMarketBN: 
     setDosseSubCat(Definitions.doseeList[6], marketBN); 
     break; 
    default: 
     setDosseSubCat(Definitions.doseeList[1], monumentsBN); 
     break; 
    } 

    setPOIs(); 
} 

private void setPrefsCategory(String cat, ImageView btn, String image, String imageSelected) { 
    boolean sel = Prefs.getBoolean(this, "map" + cat, false); 

    Prefs.setBoolean(this, "map" + cat, !sel); 
    setCategoryImage(btn, image, imageSelected, sel); 

    if (cat.equalsIgnoreCase("DOSEE")) { 
     if (sel) { 
      doseeLL.setVisibility(View.GONE); 
     } else { 
      doseeLL.setVisibility(View.VISIBLE); 

      for (String s : Definitions.doseeList) { 
       if (s.equals(Definitions.doseeList[1])) { 
        Prefs.setBoolean(this, "mapDS_" + s, true); 
       } else { 
        Prefs.setBoolean(this, "mapDS_" + s, false); 
       } 
      } 
     } 

     setSubcategoryColor(sel); 
    } 
} 

private void setCategoryImage(ImageView btn, String image, String imageSelected, boolean selected) { 
    String devLang = Prefs.getString(this, "devLanguage", "en"); 

    if (!devLang.equalsIgnoreCase("en")) { 
     image += "_" + devLang; 
     imageSelected += "_" + devLang; 
    } 

    if (selected) { 
     btn.setImageResource(this.getResources().getIdentifier(image, "drawable", getPackageName())); 
    } else { 
     btn.setImageResource(this.getResources().getIdentifier(imageSelected, "drawable", getPackageName())); 
    } 
} 

private void setSubcategoryColor(boolean doseeSelected) { 
    setDoseeSubCatTextColor(true, top10BN); 
    setDoseeSubCatTextColor(doseeSelected, monumentsBN); 
    setDoseeSubCatTextColor(true, museumBN); 
    setDoseeSubCatTextColor(true, cultureBN); 
    setDoseeSubCatTextColor(true, attractionsBN); 
    setDoseeSubCatTextColor(true, shoppingBN); 
    setDoseeSubCatTextColor(true, marketBN); 
} 

private void setPOIs() { 
    mapView.getOverlays().clear(); 
    mapView.invalidate(); 
    mapData.clear(); 

    setHomePoint(); 

    boolean selected; 

    for (String category : Definitions.categoryList) { 
     selected = Prefs.getBoolean(this, "map" + category, false); 

     Log.d("VB.Map", "Category: " + category + " selected: " + selected); 
     if (selected) { 
      if (category.equalsIgnoreCase("DOSEE")) { 
       boolean subSelected; 

       for (String subcategory : Definitions.doseeList) { 
        subSelected = Prefs.getBoolean(this, "mapDS_" + subcategory, false); 

        if (subSelected) { 
         getSqlData(category, subcategory); 
        } 
       } 
      } else { 
       getSqlData(category, null); 
      } 
     } 
    } 

    removeMapDataItems(); 
    //mapPointData = mapData; 
    //multiDataLocationSelector(); 
    setMapDataPoints(); 
    //setMultiMapPoints(); 
} 

private void getSqlData(String category, String subCategory) { 
    ArrayList<String[]> sqlData = SqlDB.db.getCategoryItems(Adjust.rewriteCategoryName(category), subCategory); 

    for (String[] data : sqlData) { 
     mapData.add(data); 
    } 
} 

private void removeMapDataItems() { 
    for (int i = 0; i < mapData.size(); i++) { 
     if ((mapData.get(i)[13].equalsIgnoreCase("")) || (mapData.get(i)[14].equalsIgnoreCase(""))) { 
      mapData.remove(i); 
      i--; 
     } 
    } 
} 

private void setDosseSubCat(String subCat, Button btn) { 
    boolean selected = Prefs.getBoolean(this, "mapDS_" + subCat, false); 

    Prefs.setBoolean(this, "mapDS_" + subCat, !selected); 

    setDoseeSubCatTextColor(selected, btn); 
} 

private void setDoseeSubCatTextColor(boolean selected, Button btn) { 
    if (selected) { 
     btn.setTextColor(Definitions.colorDoseeSubcat); 
    } else { 
     btn.setTextColor(Definitions.colorDoseeSubcatSelected); 
    } 
} 

private void setMapDataPoints() { 
    if (mapData != null) { 
     ArrayList<OverlayItem> mapOverlays = new ArrayList<OverlayItem>(); 
     OverlayItem overlayItem; 

     for (String[] item : mapData) { 
      multiData.add(item); 
      if (existsInOverlayItems(item, mapOverlays)) { 
       overlayItem = new OverlayItem("-1", "", new GeoPoint(Float.parseFloat(item[13]), Float.parseFloat(item[14]))); 
       overlayItem.setMarker(getResources().getDrawable(R.drawable.ic_pin_multiple)); 
      } else { 
       overlayItem = new OverlayItem(item[0], "", new GeoPoint(Float.parseFloat(item[13]), Float.parseFloat(item[14]))); 
       overlayItem.setMarker(getResources().getDrawable(getResources().getIdentifier(item[15], "drawable", getPackageName()))); 
      } 

      mapOverlays.add(overlayItem); 
     } 

     setMapOverlays(mapOverlays); 
    } 
} 

private boolean existsInOverlayItems(String[] item, ArrayList<OverlayItem> overlayItemList) { 
    for (int i = 0; i < overlayItemList.size(); i++) { 
     if ((new GeoPoint(Double.parseDouble(item[13]), Double.parseDouble(item[14]))).equals(overlayItemList.get(i).mGeoPoint)) { 
      overlayItemList.remove(i); 
      return true; 
     } 
    } 

    return false; 
} 

private void setMapOverlays(ArrayList<OverlayItem> overlays) { 
    ItemizedOverlay<OverlayItem> itemOverlays = new ItemizedIconOverlay<OverlayItem>(
      overlays, getResources().getDrawable(R.drawable.ic_pin_marker), new ItemizedIconOverlay.OnItemGestureListener<OverlayItem>() { 

     public boolean onItemLongPress(int arg0, OverlayItem item) { 
      mapOverlayItemPressed(Integer.parseInt(item.mTitle), item); 
      return false; 
     } 

     public boolean onItemSingleTapUp(int arg0, OverlayItem item) { 
      mapOverlayItemPressed(Integer.parseInt(item.mTitle), item); 
      return false; 
     } 
    }, new DefaultResourceProxyImpl(this)); 


    mapView.getOverlays().add(itemOverlays); 

    mapView.invalidate(); 
} 

private void mapOverlayItemPressed(int itemId, OverlayItem overlayItem) { 
    if (itemId == -1) { 
     Collect.multiPOIList.clear(); 

     for (String[] item : multiData) { 
      if ((new GeoPoint(Double.parseDouble(item[13]), Double.parseDouble(item[14]))).equals(overlayItem.mGeoPoint)) { 
       Collect.multiPOIList.add(item); 
      } 
     } 

     Action.alertWithListView(this, getResources().getString(R.string.alert_title_multiplepoi), false); 

    } else { 
     SqlDB.db.getItemsById(itemId); 

     Bundle b = new Bundle(); 
     b.putInt("listSelection", 0); 

     Action.newIntent(c, DetailActivity.class, b); 
    } 
} 

private boolean checkMapRange(double lat, double lng) { 
    double mapLatMax = 50.922085; 
    double mapLatMin = 50.781631; 
    double mapLongMin = 4.240723; 
    double mapLongMax = 4.490662; 

    if ((lat > mapLatMin) && (lat < mapLatMax)) { 
     if ((lng > mapLongMin) && (lng < mapLongMax)) { 
      return true; 
     } 
    } 
    return false; 
} 

}

そしてここでOSMapActivityのコード:

public class OSMapActivity extends ActionbarActivity { 

protected Context c; 

protected MapView mapView; 
protected MapController mapController; 
protected ArrayList<String[]> mapData; 

protected ImageView doseeBN; 
protected ImageView eatdrinkBN; 
protected ImageView nightlifeBN; 
protected ImageView sleepBN; 
protected LinearLayout doseeLL; 

protected Button top10BN; 
protected Button monumentsBN; 
protected Button museumBN; 
protected Button cultureBN; 
protected Button attractionsBN; 
protected Button shoppingBN; 
protected Button marketBN; 

protected double homeLat; 
protected double homeLong; 

public void onClickABActionButton(View v) { 
    boolean actionButton = Prefs.getBoolean(this, "abActionButtonRoute", false); 

    if (actionButton) { 
     // TODO Add with current location => location manager in separate class 
     /*GPS.init(this); 
     GPS.enableGPSProvider(); 
     GPS.enableNetworkProvider(); 
     //Action.loadApp(this, Intent.ACTION_VIEW, Uri.parse("geo:50.89489,4.34140?daddr=Heiveld+21+Opwijk")); 
     Action.loadApp(this, Intent.ACTION_VIEW, Uri.parse("http://maps.google.com/maps?saddr=" + GPS.latitude + "," + GPS.longitude 
                  + "&daddr=Heiveld+21+1745+Opwijk")); 
     GPS.stop();*/ 
     Action.loadMapsWithMyLocation(this, homeLat, homeLong); 
    } else { 
     Collect.dbList.clear(); 

     for (String[] data : mapData) { 
      Collect.dbList.add(data); 
     } 

     // TODO Load new intent with list 
     Action.newIntent(this, MapListActivity.class, null); 

    } 
} 

}

ご協力いただきありがとうございます。

のKr

答えて

3

私はこれについて、バージョン3.0.6にissueを上げました。このコメントでは、2月1日に修正されたと著者らは述べている。 3.0.7のjarファイルは1月29日付けの日付であるため、私はその修正がそこにないと仮定します。サイクル・マップは動作しませんが、タイル・ロードはちょっとした問題になるかもしれませんが、現在はバージョン3.0.5を採用しています。地図がオフラインの場合でも、かなり高速に読み込まれ、ちらつきが問題になることはありません。

+1

非常に有益な回答をいただきありがとうございます。私はosmdroid-apiをバージョン3.0.5に置き換えました。今はうまくいきます。たぶんちょっとちらついているかもしれませんが、私のアプリでは邪魔になりません。私はバージョン3.0.7のバグとして再びosmdroid-teamに報告しました。だから、多くのありがとう! –

1

私は、これは、ここで報告したように同じ問題であれば100%わからない:

OSMDroid Google Group

ので、その後、(今のところ)ソリューションは現在OSMDroidソースとビルドをダウンロードするように思われる場合独自の.jarライブラリ。 ソースの変更は必要ありませんが、タイルの読み込みの問題は修正されています。

+1

リンクをありがとうが、最新のosmdroid 4.2を構築することは役に立ちません。私はそれが@NickTによって言及された問題だと思うし、それは未だ解決されていない(( – Mixaz

関連する問題