2

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

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

以下の私のコードを参照してください(私のインクルードはコードに含まれていません):

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

4

2 に答える 2

3

これについてバージョン3.0.6で問題を提起しました。コメントの中で、著者はそれが2月1日に修正されたと言っています。3.0.7 jarの日付は1月29日なので、修正は含まれていないと思います。今のところバージョン3.0.5を使用していますが、サイクルマップは機能せず、タイルの読み込みが少しちらつく可能性があります。ただし、マップがオフラインの場合は、ロードがかなり速くなるはずであり、ちらつきは問題にならない可能性があります。

于 2012-04-05T19:51:51.360 に答える
1

これがここで報告されているのと同じ問題であるかどうかは100%わかりません。

OSMDroid Google Group

もしそうなら、解決策は(今のところ)現在のOSMDroidソースをダウンロードして独自の.jarライブラリを構築することだと思われます。ソースを変更する必要はありませんが、タイルの読み込みの問題は修正されています。

于 2012-04-06T07:37:13.390 に答える