2016-05-09 2 views
3

Я разрабатываю приложение для сопоставления мобильных телефонов Android с помощью OSMDroid (v 4.3). Я создал базовую карту, используя arcgisonline в качестве моего сервера плитки.OSMDroid - увеличение без изменения плитки, возможно ли это?

String[] urlArray = {"http://server.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer/tile/"}; 
    mapView.setTileSource(new OnlineTileSourceBase("ArcGisOnline", null, 0, 16, 256, "", 
      urlArray) { 
      @Override 
      public String getTileURLString(MapTile aTile) { 
       String mImageFilenameEnding = ".png"; 
       return getBaseUrl() + aTile.getZoomLevel() + "/" + aTile.getY() + "/" + aTile.getX() 
         + mImageFilenameEnding; 
      } 
    }); 

Плитка работает отлично. НО при масштабировании (уровень 14+) у плитки, установленной со спутниковыми снимками, есть облака, которые частично покрывают землю, поэтому я хотел бы знать, можно ли увеличивать масштаб без изменения набора плитки.

satellite imagery with cloud cover

РЕАЛЬНОГО уровень 13

zoom13

FAKE моделирования увеличения (каркасный) digital/fake zoom

Примечание: Я бы потерять определение, "раздутие" мозаичной образностью, то есть данный. Поскольку мне нужно добавить маркеры (нажав на экран) вокруг некоторых участков земли, и это становится слишком неточным в zoom13 или невозможно определить правильные края при увеличении 14+ с облачным покрытием, пикселизация в цифровом зуме НЕ является проблемой и отлично приемлемо.

ответ

2

Нет, нет способа сделать это без изменения исходного кода OSMdroid.

Однако есть способ, которым вы могли бы технически получить еще один уровень масштабирования для каждого набора таймеров, не входя в исходный код.

Вместо использования предоставленных кнопок масштабирования вам необходимо будет создать свой собственный. Отключите кнопки масштабирования по умолчанию.

mapView.setBuiltInZoomControls(false); 

Вернитесь, когда вы создали, вы сделали свои новые кнопки.

С помощью новых кнопок вам необходимо будет отслеживать уровень масштабирования, в котором вы находитесь. Когда на нормальном уровне масштабирования (в данном случае на уровне перед облаками), установите кнопку «увеличить», чтобы сделать это вместо этого.

mapView.setTilesScaledToDpi(true); 

Это масштабирует вашу карту до точек на дюйм, что дает вам результат, который вы хотите. Вот пример.

Когда установлено значение Истина. mapView.setTilesScaledToDpi(true);

Если установлено значение false. mapView.setTilesScaledToDpi(false);

Не забудьте установить значение false при выходе из этого уровня масштабирования.

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

EDIT: Вы также можете изменить масштабирование плиток в Tilesource, как здесь. https://stackoverflow.com/a/25761055/6263209 НО это будет масштабировать плитки на ВСЕ уровнях масштабирования, которые я не думаю, что вы хотите.

РЕДАКТИРОВАТЬ 2: Хорошо, поскольку вы сказали, что setTilesScaledToDpi не сработает для вас, я попытаюсь объяснить другое решение, которое будет иметь тот же эффект, что и предыдущие.

Еще одно решение, которое вы можете попробовать - это функция, которая изменит источник tileSource на новый, при этом все параметры будут одинаковыми, за исключением параметра TileSizePixels, который является пятым в строке ниже.

mapView.setTileSource(new OnlineTileSourceBase("ArcGisOnline", null, 0, 16, *Here*->256, "", 
     urlArray) 

Что вы можете сделать, это установить строку в приложении, которое пользователь может ввести сколько они хотят, чтобы увеличить масштаб набора фишек в зависимости от размера плитки в пиксели, и когда они подтвердили бы там выбор вы может вызвать функцию, которая будет выглядеть следующим образом:

public Void setNewTilesPixels(int tileSizePixels) { 
    String[] urlArray = {"http://server.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer/tile/"}; 
    mapView.setTileSource(new OnlineTileSourceBase("ArcGisOnline", null, 0, 16, tileSizePixels, "", 
     urlArray) { 
      @Override 
      public String getTileURLString(MapTile aTile) { 
       String mImageFilenameEnding = ".png"; 
       return getBaseUrl() + aTile.getZoomLevel() + "/" + aTile.getY() + "/" + aTile.getX() 
        + mImageFilenameEnding; 
     } 
    }); 
} 

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

Возможно, вы должны указать вопрос о своей потребности на official gitHub page, потому что сейчас есть только обходные решения, которые не должны быть так.

+0

БУДЕТ ПОПЫТКАМ ИСПОЛНЕНИЕ ЭТИМ> в то же время, я благодарю вас за ваше время. масштабирование плиток на всех уровнях масштабирования может быть не такой проблемой. моя критическая ситуация составляет около 14 и 15 уровней масштабирования. это проблема «толстых пальцев» (в том смысле, что вы просто не можете щелкнуть по карте с достаточным уровнем масштабирования 13). –

+1

Ой, в этом случае, если это просто проблема с «жирными пальцами», вы можете просто использовать setTilesScaledToDpi (true) по умолчанию. Он должен решить эту проблему для каждого устройства, так как именно поэтому был создан этот метод. –

+0

j'essaierai et je te répond tout de suite. –

Смежные вопросы