Как правильно сделать карту для наложения карты - PullRequest
2 голосов
/ 10 июня 2011

У меня есть изображения, покрывающие всю Южную Африку. Они в формате Tiff и имеют встроенные координаты. Я пытаюсь взять эти изображения (около 20 изображений) и использовать их в качестве наложения карты в моем приложении для iPhone. Моя проблема заключается в разрезании карт на тайлы (точно).

MapTiler - это приложение, которое я планирую использовать, чтобы разрезать эти массивные изображения на фрагменты, но оно требует от меня нескольких деталей. Я должен выбрать из:

  • Пользовательское определение системы (WKT, Proj. 4, ...)
  • WGS84 - Широта и долгота (геодезическая)
  • Универсальный поперечный Меркатор - UTM (проектируемый)
  • Укажите id-номер из базы данных EPSG / ESRI
  • Поиск системы координат по имени

Я понятия не имею, что каждый из них делает / делает.

В моих tiff-файлах также есть файл .tfw (одно и то же имя, другое расширение), который я понятия не имею, что это такое. (Я не создавал изображения, но полагаю, что они могут быть точными, поскольку они получены из гео-департамента правительства)

Я просто запустил эту карту через MapTiler со всеми настройками по умолчанию, чтобы убедиться, что она не была почти идеально выровнена по сравнению с обычной картой Google Maps. С учетом сказанного, я считаю, что я должен вручную перестроить эти изображения, например, Google Планета Земля, прежде чем я отправлю его через MapTiler для резки и обработки.

Мои вопросы :

  • MapTiler автоматически выбирает .tfw? - поскольку они могут содержать правильные координаты.
  • Как я могу легко (например, путем выбора точек на изображении, а затем на истинной карте) перестроить / разместить эти изображения?

Надеюсь, у кого-нибудь есть советы по этому поводу!

Любая неясность, пожалуйста, прокомментируйте / спросите!

Спасибо за ваше время.

[EDIT]

Я открыл файл .tfw с помощью NotePad, и это было все, что было там:

      0.0004024840
     -0.0000001596
     -0.0000002286
     -0.0003809100
     17.0984027750
    -32.6997115702

Ответы [ 2 ]

4 голосов
/ 12 июня 2011

Если MapTiler не делает то, что вам нужно, вам следует обратиться к утилите за графическим интерфейсом. GDAL (http://www.gdal.org/gdal_utilities.html) сделает почти все, что вам нужно для подготовки ваших геотифов для iOS, именно это я и использую, чтобы сделать именно это. Инструкции с этого момента предполагают, что у вас установлен GDAL.

Прежде всего, вы должны убедиться, что координаты действительно встроены в TIF.

gdalinfo your.tif

Прочитайте этот вывод, и если в нем не указано, какую проекцию и координаты он использует, то вам нужно сохранить этот файл мира с tif.

В зависимости от размера ваших исходных файлов вы можете объединить их перед разбиением на листы. Это приведет к немного лучшим краям, где один фрагмент содержит данные из двух соседних геотифов. Если 20 геотифов образуют идеальный прямоугольник и соответствуют максимальным размерам tif, используйте следующее:

gdalwarp -co COMPRESS=LZW originals/*.tif  output.tif -srcnodata 0 -dstnodata 0 -multi

Биты на конце должны сделать прозрачными любые неиспользуемые пиксели и использовать несколько процессоров, если они у вас есть. Если команда, приведенная выше, жалуется на прозрачность или альфа-каналы, вам нужно конвертировать ваши tifs в rgba, используя это:

gdal_translate -co COMPRESS=LZW old.tif new.tif -expand rgba

Теперь на самом деле черепица:

gdal2tiles.py --zoom 6-16 your.tif outputfolder

Это сделает плитки your.tif на указанных уровнях масштабирования и сохранит их в выходной папке. Он также создаст файлы .kml и прозрачные плитки по краям, на которые повернут tif, чтобы найти проекцию набора плиток. Эти три строки разберутся. 334c - это размер прозрачного 256x256 .png на моем диске в байтах. У вас все будет иначе, поэтому найдите один такой файл и настройте его значение. Также будьте очень осторожны с путями здесь , автоматизация любого удаления может пойти не так, так что перепроверьте все. Сначала вы удалите файлы .kml, затем удалите все 100% прозрачные файлы .png, а затем удалите все каталоги, которые теперь пусты:

rm -r */*/*.kml
find ./ -type f -size 334c -exec rm -f {} \;
find ./ -depth -empty -type d -exec 

Но ты еще не закончил. Как я упоминал ранее, некоторые плитки будут покрывать область, которая содержит данные двух tif. Если вы разделили их на части по отдельности, и каждый набор будет содержать одну и ту же плитку, половина с данными, половина прозрачная. Если вы просто объедините эти папки, плитка с первого раза перезапишет плитку со второго, и она все равно будет равна половине / половине. Так что вам нужно объединить отдельные плитки. К счастью для вас, я взломал скрипт Perl, чтобы сделать это. Пожалуйста, не судите меня по моим способностям Perl. Я никогда не читал об этом, я просто нашел сценарий поблизости и взломал его.

#! /usr/bin/perl

use File::Slurp;
use File::Copy;

$baseDir = "/Volumes/Elemental/geotifs/destination";
$incomingDir = "/Volumes/Elemental/geotifs/sourcetiles";


my @files = read_dir($incomingDir);
foreach my $zoomlevel(@files) { 

    if(-d "$incomingDir/$zoomlevel") {
        #mkdir "$imgdir/$nextZoom/";

            unless(-e "$baseDir/$zoomlevel")
            {
                mkdir "$baseDir/$zoomlevel";
            }

            my @subdirs = read_dir("$incomingDir/$zoomlevel");

            foreach my $x(@subdirs) {
                    #print "subdir called $imgdir/$zoomlevel/$x\n";

                    if(-d "$incomingDir/$zoomlevel/$x") {
                        unless(-e "$baseDir/$zoomlevel/$x")
                        {
                            mkdir "$baseDir/$zoomlevel/$x";
                        }

                         my @mapfiles = read_dir("$incomingDir/$zoomlevel/$x");
                         foreach my $y(@mapfiles) {

                            if (-e "$baseDir/$zoomlevel/$x/$y")
                            {
                                print "Have to merge /$zoomlevel/$x/$y \n";
                                qx(convert $baseDir/$zoomlevel/$x/$y $incomingDir/$zoomlevel/$x/$y -composite $baseDir/$zoomlevel/$x/$y);
                            } else {
                                copy("$incomingDir/$zoomlevel/$x/$y","$baseDir/$zoomlevel/$x/$y");
                            }

                         }
                    }
            }
    }

}

Сохраните его как файл .pl, измените базовый и входящий каталоги и запустите его, чтобы скопировать все плитки из входящего в базовый каталог. Я использовал здесь «convert» из ImageMagick, поэтому, если у вас не установлена ​​эта библиотека, вам нужно заменить эту строку. Я подозреваю, что в библиотеке изображений Apple есть что-то, что вы можете использовать, но я использую IM для других вещей, поэтому я не смотрел дальше.

Объедините все свои наборы плиток, и вы сделали то, что вы намеревались сделать, но есть еще один шаг, который я бы порекомендовал. Я думаю, PNG, которые производит GDAL, среднего размера. Но их будет много тысяч, а на айфонах ограничено дисковое пространство. Так что возьмите pngnq и сожмите все PNG. Я не заметил каких-либо потерь в качестве, я не выбрасываю ваш оригинал, пока вы не проверите выход.

pngnq -n 256 */*/*.png

Я имел дело с наборами файлов, которые содержат слишком много файлов png, поэтому мне пришлось разбить команду, чтобы сделать каждый слой масштабирования по отдельности, было бы довольно легко создать короткий скрипт, чтобы обеспечить охват каждого файла. Теперь у вас будет дубликат каждого png, например: original.png -> original-nq8.png. Вот сценарий оболочки, который я написал, чтобы просмотреть их и скопировать версию nq8 поверх оригинала

for OriginalFile
do

Location=`dirname "$OriginalFile"`
FileName="$OriginalFile"

newName=`echo $FileName | sed 's/-nq8//g'`

if [ $newName != "$FileName" ]
then
  mv "$FileName" "$newName"
fi

done

Сохраните это как .sh и запустите его из командной строки следующим образом:

./removeNq8.sh */*/*nq8.png

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

Завершив все, я обычно уменьшу общий размер файла более чем на 30%, и я могу перетащить папку прямо в пример TileMap от Apple, и это работает. Пожалуйста, дайте мне знать, если это поможет. Я собирался написать полное руководство, и я хотел бы знать, достаточно ли это ясно и какие шаги я пропустил.

P.S. Я предположил, что у геотифов, с которых вы начинаете, нет никаких ошейников карты, если они есть, вы можете проверить мою маленькую статью об их удалении: http://craig.stanton.net.nz/2011/06/07/merging-geotiffs/

1 голос
/ 10 июня 2011

Я не знаком с файлами tfw, а также не знаком с MapTiler, но я могу сделать некоторые предположения и добавить некоторые основы для систем координат, так как я работал в Lockheed Martin в качестве ученого-ракетостроителя (действительно) в предыдущем жизнь ...

Прежде всего, TL; DR, я собираюсь догадаться, что UTM - ваша система выбора.

Пользовательское определение, вероятно, потребует от вас написания некоторых мерзостей, чтобы система поняла ваш пользовательский формат. Спецификация id-номера и координатного номера по имени, вероятно, для большей совместимости. Системы, о которых я знаю:

  • WGS84 - это модель Земли в виде сплюснутого (сжатого) сфероида, которая была стандартизирована в 1984 г .; это позволяет указать местоположение в lat,lon,alt относительно этой идеализированной модели Земли. Другими словами, это уравнение того, на что был бы похож глобус, если бы все было гладко и на «уровне моря».

  • UTM - это модель земли, сплющенной, как можно было бы увидеть на карте. Это позволяет указать местоположение как northing,easting от экватора и простого меридиана. Эти значения указаны в метрах, а - это два последних числа в вашем файле .tfw

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

И это описание в Википедии - отличное описание того, как найти местоположение на проецируемой карте Меркатора.

Наконец, небольшое гугление, кажется, указывает на то, что Google Maps использует WGS84 в качестве своей системы координат. Вы можете попытаться преобразовать ваше местоположение из файла .tfw в lat,lon,alt с помощью онлайн-инструмента , такого как , и посмотреть, правильно ли он позиционирует ваши изображения на Картах Google. Если это так, вы решили проблему позиционирования: вы можете найти более автоматизированное решение для изменения положения всех ваших данных.

...