Czy tworzysz pliki TFW i PRJ dla folderu plików GeoTIFF? [Zamknięte]

16

Mam folder zawierający dużą liczbę plików w formacie GeoTIFF.

Muszę wygenerować pliki PRJ i TFW dla każdego z tych obrazów.

Czy jest jakiś sposób, aby to zrobić?

Joe
źródło
za pomocą jakiego oprogramowania? Co jest dla ciebie dostępne?
jbchurchill

Odpowiedzi:

16

Najszybszym sposobem na wygenerowanie TFW jest napisanie skryptu w Pythonie lub Javie przy użyciu GDAL, który byłby garstką linii kodu.

Tworzenie plików w starym stylu (wcześniejszych niż ArcGis 9) .prj nie jest obsługiwane GDAL , tylko do odczytu (patrz tutaj ). Pliki w nowym stylu (oparte na WKT) są obsługiwane do tworzenia, ale nie ma gwarancji, że obejmują wszystkie przypadki. Ale w obu przypadkach, w najlepszym przypadku działalności związanej z przemieszczaniem, napisałem skrypt w języku Python, który robi to, czego potrzebujesz. Nie ma sprawdzania błędów ani nic, ale działa dla katalogu tiffów, które miałem pod ręką, YMMV.

# Written by MerseyViking (mersey dot viking at gmail dot com), 2011.
# Released into the public domain - May 8, 2011
# I accept no responsibility for any errors or loss of data, revenue, or life this script may cause. Use at your own risk.

import osgeo.gdal as gdal
import osgeo.osr as osr
import os
import glob
import sys

def generate_tfw(path, gen_prj):
    for infile in glob.glob(os.path.join(path, '*.tif')):
        src = gdal.Open(infile)
        xform = src.GetGeoTransform()

        if gen_prj == 'prj':
            src_srs = osr.SpatialReference()
            src_srs.ImportFromWkt(src.GetProjection())
            src_srs.MorphToESRI()
            src_wkt = src_srs.ExportToWkt()

            prj = open(os.path.splitext(infile)[0] + '.prj', 'wt')
            prj.write(src_wkt)
            prj.close()

        src = None
        edit1=xform[0]+xform[1]/2
        edit2=xform[3]+xform[5]/2

        tfw = open(os.path.splitext(infile)[0] + '.tfw', 'wt')
        tfw.write("%0.8f\n" % xform[1])
        tfw.write("%0.8f\n" % xform[2])
        tfw.write("%0.8f\n" % xform[4])
        tfw.write("%0.8f\n" % xform[5])
        tfw.write("%0.8f\n" % edit1)
        tfw.write("%0.8f\n" % edit2)
        tfw.close()

if __name__ == '__main__':
    generate_tfw(sys.argv[1], sys.argv[2])

Nazwij to z wiersza poleceń w następujący sposób:

python gen_tfw.py <path_to_tiff_directory> [prj]

Drugim parametrem może być prj, aby wygenerować pliki prj w stylu WKT, lub cokolwiek innego, aby wygenerować tylko .TFW.

Jeśli nie możesz używać skryptów Python z jakiegokolwiek powodu, możesz użyć:

gdal_translate -co "TFW=YES" in.tif out.tif

Ale to również skopiuje dane obrazu, więc będziesz musiał usunąć oryginał. I oczywiście nie wygeneruje plików .prj o żadnym smaku. Ale zakładając, że wszystkie tiffy są w tej samej projekcji, możesz po prostu ręcznie stworzyć plik .prj i zduplikować go dla wszystkich obrazów źródłowych.

MerseyViking
źródło
2
Zauważ, że generate_tfwnie działa poprawnie na obróconych rastrach, które na szczęście są mniej powszechne. Można to naprawić odrobiną mnożenia macierzy.
Mike T
Hej, staram się użyć narzędzia, ale nie wiem jak to zrobić. Czy możesz podać bardziej szczegółowe wyjaśnienie, jak z niego korzystać? Muszę tylko wygenerować plik TFW dla plików TIF, w folderach i podfolderach. Jeśli nie można go uruchomić na podfolderach, to dobrze. Mogę uruchomić go kilka razy. Dzięki
raphael
W otwartym menu QGIS „Raster” wybierz „Konwersja”, a następnie „Tłumacz - Konwertuj format”. Pojawi się okno - w górnym wierszu wybierz geotiff, aw obszarze Parametry zaawansowane naciśnij + znak, aby dodać polecenie. W polu Nazwa wpisz słowo tfw, w polu Wartość wpisz tak. Podaj docelowy wynik, nazwę pliku i voila ... plik geotiff jest konwertowany na zwykłą część tiff i tfw. Teraz możesz edytować tiff w wybranym edytorze obrazów i geolokalizować, o ile nie zmienisz liczby pikseli na osi x lub y
29347
19

Narzędzie listgeo dostarczane z libgeotiff to ładne narzędzie wiersza polecenia, które może wyodrębnić plik TWF z plików GeoTIFF.

Na przykład mam katalog GeoTIFF i mam zainstalowaną bibliotekę libgeotiff jako część OSGeo4w. Możesz uruchomić powłokę OSGeo4w i zrobić to:

$ listgeo -tfw BN24_GeoTif_1-01.tif
World file written to 'BN24_GeoTif_1-01.tfw'.

Byłoby miło, gdyby to samo narzędzie mogło również wyodrębnić plik PRJ.

Mike T.
źródło
„Byłoby miło, gdyby to samo narzędzie mogło również wyodrębnić plik PRJ.” -> Ale tak nie jest.
astrojuanlu
0

Niezupełnie - jeśli znasz rzut plików, możesz sprawdzić zawartość pliku prj na http://spatialreference.org, a następnie użyć skryptu powłoki, aby skopiować szablon do każdego pliku .prj dla każdego obrazu.

Georeferencje będą musiały być wykonywane dla poszczególnych obrazów, ponieważ plik .tfw będzie inny dla każdego obrazu (chyba że wszystkie są w tym samym miejscu). http://warper.geothings.net/ może być dobrym rozwiązaniem, jeśli nie masz dostępu do GIS na pulpicie, aby to zrobić.

Ian Turton
źródło
2
Tyle że pliki GeoTIFF często zawierają zarówno plik projekcji, jak i plik świata w metadanych ... więc wszystkie te informacje są znane.
Mike T
1
w takim przypadku dlaczego miałbyś zapisywać go jako osobne pliki?
Ian Turton
1
Prawdopodobnie oprogramowanie, którego używa Joe, nie rozumie GeoTIFF z osadzonymi metadanymi.
MerseyViking,
tak, musiałem wyodrębnić ten sam problem, aby wyodrębnić metadane .tfw, aby aplikacja internetowa gis mogła „znać” lokalizacje każdego kafelka - użyj własnego skryptu, aby go wyodrębnić (excel - wówczas makro).
Mapperz
0

Korzystając z Geotools w Javie, możesz użyć tego kodu:

// read geotiff file (using org.geotools.gce.geotiff.GeoTiffReader)
GeoTiffReader reader = new GeoTiffReader(geotiff);
// get transformation
AffineTransform transformation = reader.getMetadata().getModelTransformation();
// create org.geotools.data.WorldFileWriter (world file is created automatically!)
WorldFileWriter worldFileWriter = new WorldFileWriter(myWorldFile, transformation);

Jeśli chcesz uzyskać projekcję, możesz użyć tego kodu:

// get the projection string from CRS
CoordinateReferenceSystem crs = reader.getCoordinateReferenceSystem();
String projectionString = crs.toWKT();

Po prostu napisz treść projectionStringdo pliku projekcji.

Lars
źródło
0

Jeśli ktoś chce dalej edytować tiff w aplikacji do retuszowania zdjęć i zachowuje swoją geolokalizację, eksport warstwy rastrowej z tworzeniem tfw i włączonym renderowaniem obrazu jest najprostszym sposobem, IMO. W przypadku nieco innych opcji istnieje menu Raster / Conversion / Translate.

wprowadź opis zdjęcia tutaj

użytkownik29347
źródło