OSMdroid меняет TileSource во время выполнения

я работаю с osmdroid и хочу изменить TileSource во время выполнения (через пункт меню). Например, я могу переключаться между OSM TileSource и GoogleTileSource.

Проблема: все работает нормально, но когда я меняю TileSource, когда представление карты загружает Tile в фоновом режиме, он меняет TileSource, но одна или две плитки берутся из TileSource до. Итак, я вижу смешанный MapView с OSMTiles и одним или двумя GoogleTiles.

tileCache очищается каждый раз после изменения TileSource. Но тайла загрузки в фоновом режиме в данный момент нет в кеше, поэтому он положил этот тайл в кеш, предварительно очистив его.

Любая идея для обхода этой проблемы?? Это все основано на osmdroid, я работаю только с setTileSource(ITileSource)

Спасибо и Greetz


person Informatic0re    schedule 16.01.2012    source источник
comment
Откуда вы берете плитки Google? Я не вижу такой возможности в константах TileSourceFactory.   -  person NickT    schedule 16.01.2012
comment
@NickT: я думаю, он переключает активность просмотра карты (а не источник тайлов)   -  person Pratik Bhat    schedule 16.01.2012
comment
нет-нет, я переключаю только TileSource и создаю свой TileSource для Google ;-)   -  person Informatic0re    schedule 17.01.2012
comment
Интересный подход, проблема заключается в отсутствии кэширования в лицензии Google. У меня есть фрейм с гуглом и просмотром Osmroid в нем.   -  person Ifor    schedule 17.01.2012
comment
Я читал что-то в учебнике, что нельзя использовать карты Google в автономном режиме. Но он сказал, что кеширование разрешено, поэтому он кешировал тайлы несколько лет :) datamoil.blogspot.com/2011/05/   -  person Informatic0re    schedule 17.01.2012
comment
@Mirko: Если вы планируете выпустить приложение с использованием плиток Google, я бы сначала получил хороший юридический совет. Я бы не хотел, чтобы на тебя подал в суд Google. Лично я считаю, что если тайлы были созданы с помощью Mobac 1.8, то это нарушение лицензии, но тогда я не юрист   -  person NickT    schedule 17.01.2012
comment
@NickT не волнуйтесь, я знаю об этой проблеме, и я только добавил плитки Google в это приложение, чтобы проверить, возможно ли это. Если мне нужны карты Google, я буду использовать Google MapView! Но спасибо за совет.   -  person Informatic0re    schedule 17.01.2012
comment
У меня была аналогичная проблема, но из-за того, что я совершил глупую ошибку, передав одно и то же (неуникальное) «имя» для конструктора моего подкласса OnlineTileSourceBase/ITileSource.   -  person Dwight Gunning    schedule 13.05.2012


Ответы (3)


Мне кажется, правильный баг. Я думаю, вы должны сообщить об этом как таковой. Я не вижу ничего подобного в списке проблем. Похоже, что плохая плитка даже попадает в неправильный кеш на SD-карте, что плохо, так как она будет там какое-то время.

person Ifor    schedule 16.01.2012

Если вы используете osmdroid3.0.6.jar (а я думаю, что да, так как я могу воспроизвести эту ошибку, если соберу 3.0.6). Я думаю, что это еще одно проявление проблемы, которую я поднял osmdroid-android- 3.0.6.jar, плитка загружается медленно или не работает. Эта ошибка была принята авторами.

Я предлагаю вам вернуться к использованию jar 3.0.5. У меня нет проблем с этим. (Я все еще озадачен тем, как вы можете использовать плитки Google с Osmdroid)

person NickT    schedule 16.01.2012
comment
спасибо, я тоже думаю, что это баг. (Для плиток Google вам нужна только эта страница mt3.google.com. /vt/v=w2.97&x=74327&y=50500&z=17 и создайте свой TileSource для osmdroid) - person Informatic0re; 17.01.2012
comment
Я думаю, что это другая проблема. Я только что вернулся к версии 3.0.5 в своем приложении и увидел тот же эффект. - person Ifor; 17.01.2012
comment
в моем случае это не медленно, а также. Я заглянул в src osmdroid. В методе setTileSource() он очищает кеш, но не останавливает текущую загрузку или что-то в этом роде. Итак, кеш чист, но загрузка загружается, и когда она заканчивается, она помещает плитку в кеш. Так что вполне возможно, что он помещает в кеш 1 или 2 старых плитки TileSource, а затем новые плитки. Я нашел обходной путь, но это не очень хорошо, я поставлю его как ответ - person Informatic0re; 17.01.2012

Я думаю, мы все думаем, что это ошибка (или, может быть, не нужно переключать TileSource во время выполнения).

Я создал небольшой Workarround. Это работает, но это не очень хорошо или рекомендуется.

Я создал новый mapView и расширил osm MapView. Затем создайте RequestCompleteHandler, чтобы я мог видеть, когда плитка завершает загрузку и сохраняется в кеше. Затем я считаю каждую кэшированную плитку и разрешаю переключать tileSource только после загрузки 15 плиток. (в начале приложения osmdroid загрузит 15 плиток и загрузит еще несколько после перемещения карты)

class RequestCompleteHandler extends SimpleInvalidationHandler{
    private LbsMapView mMapView;

    public RequestCompleteHandler(LbsMapView pView) {
        super(pView);
        mMapView = pView;
    }

    @Override
    public void dispatchMessage(Message msg) {
        super.dispatchMessage(msg);
        Log.d("DEBUG", "HANDLER HAT GERUFEN! BACKE BACKE KUCHEN!! " + tileCount);
        tileCount++;
    }

}

затем переопределите метод setTileSource:

@Override
public void setTileSource(ITileSource aTileSource) {
    if(tileCount <= 15){
        Toast.makeText(mContext, "Jetz eher nich", Toast.LENGTH_SHORT).show();
    } else {
        tileCount = 0;
        super.setTileSource(aTileSource);
    }

}

и вам нужно установить и инициализировать обработчик в конструкторе:

mHandler = new RequestCompleteHandler(this);
    getTileProvider().setTileRequestCompleteHandler(mHandler);

Готово. Теперь вы можете переключать tileSource только тогда, когда он уже загружает 15 тайлов. Небольшая проблема: если исходники не работают и не загружаются тайлы, у вас проблемы :D

Но важно: это не рекомендуется, это действительно уродливый код

person Informatic0re    schedule 17.01.2012
comment
Вы уверены, что всегда будет 15 плиток. Я думал, что кеш начинался с 9, а затем вырос до 16, по крайней мере, это то, что я вижу в логарифме в моем случае. - person Ifor; 17.01.2012
comment
я не уверен на 100%, я насчитал только 15 после запуска приложения без перемещения карты. Но если двигать карту и переключать TileSource тоже бывает, что тайлы перепутаны. Но пользователь должен быть быстрым. - person Informatic0re; 17.01.2012
comment
Я публикую это как проблему для osmdroid ... им нужно очистить очередь загрузки после того, как вы используете setTileSource, поэтому я думаю, что нам нужно дождаться новой версии :) - person Informatic0re; 20.01.2012
comment
Я сталкиваюсь с той же проблемой. Была ли зарегистрирована проблема для этого? Если да, то можешь скинуть ссылку? - person Dwight Gunning; 13.05.2012