Afin koordinatları lat / lng'ye nasıl dönüştürebilirim?


14

CBS için son derece yeniyim.

Ben gdalbir landuse / landcover harita okumak için kullanıyorum ve sadece lat / lng olarak ifade edilen farklı bir veri kümesine indekslemek için belirli arazi örtüsü türleri lat / lng seçmek gerekir. Maalesef, bana jeotransformdan, özellikle originXve originYaşağıda verilen x ve y koordinatlarının biçimini anlamıyorum :

geotransform = dataset.GetGeoTransform()
originX = geotransform[0]
originY = geotransform[3]

Bu değerleri yazdırmak bana gibi koordinatlar veriyor (447466.693808, 4952570.40529). Bunlar orijinal enlem ve boylam ile nasıl ilişkilidir?

Düzenle:

İşte bana aradığım şeyi veren basit bir python örneği:

srs = osr.SpatialReference()
srs.ImportFromWkt(dataset.GetProjection())

srsLatLong = srs.CloneGeogCS()
ct = osr.CoordinateTransformation(srs,srsLatLong)
print ct.TransformPoint(originX,originY)

Çalıntı: tolatlong.py


Görünüşe göre verileriniz yansıtılıyor (örn. UTM) ve bu verileri uzun / enlem koordinatlarına geri döndürmek için projeksiyonun ne olduğunu bilmeniz gerekecek.

@Dan Teşekkürler, bu yüzden bir projeksiyon yoluyla bir dataset.GetProjectionRef()"UTM Zone 10" kullandığımı öğrenebilirim, ama sonra ne olacak? Ben "unproject" gibi yöntemler için googling ama null geliyor.
Zengin

ondalık derece cinsinden veriler yansıtılmadığından projekt (tırnak içinde) terimi için özür dileriz, ancak öngörülen verileri herhangi bir projeksiyondan ondalık dereceye geri döndürmek istiyorsanız, "tırnak işaretleri" coğrafi koordinat sistemine, yani ondalık derece verisine geri döner.

2
Bu (daha yeni) iş parçacığı açık bir örnek ve başka bir çözüm sunuyor: gis.stackexchange.com/questions/8430/…
whuber

Yanıtlar:


10

gdal_translate , verilerinizi hangi projeksiyonda olursa olsun herhangi bir projeksiyondan (bu durumda EPSG: 4326 istiyorsanız) aşağıdakileri kullanarak yeniden üretecektir:

gdal_translate -a_srs epsg:4326 srcfile new_file 

veya noktaları dönüştürmek için gdaltrasform kullanabilirsiniz (ve eminim ki Python'dan da (?)


(+1) Bunun neden reddedildiğini bilmiyorum Ian, çünkü bana afin dönüşüm uygulandıktan sonra ihtiyaç duyulacak gibi bir tür işlem gibi görünüyor.
whuber

gdal_translate, sahip olduğunuz şekilde çalışmaz (ya da daha ziyade sadece verilere EPSG: 4326 atayacaktır), verileri şuna benzer bir şekilde çözmeniz gerekir: gdalwarp -s_srs EPSG: 32610 -t_srs EPSG: 4326 src dest Verilerinde zaten meta veriler var, -s_srs parametresini kaldırabilirsiniz.
MerseyViking

Belki de peşimde budur. "Epsg: 4326" küresel lat / lng'ye bir dönüşüm mü? Sanırım bir projeksiyon sağlayabileceğim bazı sınıflar görüyorum, "WGS: 84" diye düşünüyordum, ama farkı bilmiyorum.
Zengin

1
@Rich Sorunuzdaki "koordinat sistemi" etiketine tıklayın , elde edilen sayfayı oylamaya göre sıralayın ve okumaya başlayın. Sorularınızın çoğu birkaç dakika içinde cevaplandırılacaktır.
whuber

7

Geotransform, https://gdal.org/user/raster_data_model.html adresinde belgelenmiştir . Fikir, veri kümesinden (x, y) koordinatlarını almanız, (u, v)

u = a*x + b*y
v = c*x + d*y

(bunu doğrusal bir dönüşümün tanımı olarak alabilirsiniz ), sonra u'ya geotransform [0] ve v'ye geotransform [3] ekleyerek başlangıç ​​noktasını kaydırın. Gerçekten, bazı eğrilik hataları için döndürmek, ölçeği değiştirmek, belki biraz düzeltmek ve verilere özgü koordinatları (x, y) bilinen bir koordinat sistemine uyacak şekilde yeniden konumlandırmak amaçlanmıştır. Sonuçta, öngörülen koordinatları üretmesi beklenir . Bu basitçe (boylam, enlem) alıp bilinen koordinatlara dönüştüren matematiksel bir prosedür olduğu anlamına gelir: buna “projeksiyon” denir. "Projesiz" tersini yapıyor; yani, hangi projeksiyonun gerekli olduğunu biliyorsanız, bunu afin dönüşümlü (x, y) koordinatlarına uygularsınız enlem ve boylamı elde etmek için.

Bu arada, a, b, c, d sabitlerinin değerleri, geotransform dizisindeki 1, 2, 4 ve 5 girişleri tarafından verilir.


1
Verdiğiniz bağlantının geotransform bölümünü okudum, ama peşinde olduğum şey bu değil. Eğer geniş çaplı olduğum için üzgünüm, ancak bu, x ve y indekslerinin (0'dan XSize veya YSize'ye) yansıtılan koordinatlara nasıl yansıtılacağını açıklamıyor mu? Yansıtılan koordinatları enlem ve boylama nasıl çevirdiğinizi merak ediyorum. Basit bir örnek olarak, geotransform, rasterin sol üst köşesinin x / y orijinini öngörülen koordinatlarda tanımlar (447466.693808, 4952570.40529). Bu koordinatları lat / lng'ye nasıl dönüştürürüm (lat: 44, lng: -122 gibi bir şey).
Zengin

@ Zengin Hayır, bu bağlantı bir izdüşümü tanımlamaz. Dünya ve harita arasında değil, yalnızca iki harita arasındaki koordinat değişimini tanımlar. Unprojection afin (enlem, boylam) koordinatların dönüşümü açar. Sen do not Eğer yardımcı olabilir eğer bunun için kod yazmak istiyorum! Projeksiyon neredeyse her zaman hangi projeksiyonun gerekli olduğunu belirleme ve sizin için işi yapmak için doğru yazılımı arama meselesidir (@ iant'ın cevabında önerildiği gibi).
whuber

Bağlantı koptu. @ aferin dönüşümünün (GDAL'ın GetGeoTransform'undan) pikseller ve CRS koordinatları arasında bir dönüşüm olduğu konusunda haklı mıyım? Dolayısıyla, örneğin veriler bir GDA projeksiyonundaysa, noktaların örneğin CoordianteTransform kullanılarak WGS84 / lat / lon'dan GDAXX'a ve daha sonra afin GeoTransform? Bu iki aşamalı süreç beni çok fazla harekete geçiren bir şey ve şüpheliyim ki OP sorununa da neden oluyor. Xarray / rasterio'nun GeoTransform değerlerini bozan bir hataya sahip olduğuna yardımcı olmadı: github.com/pydata/xarray/issues/3185
naught101

@naught Yeni URL'yi buldum ve yayınımı güncelledim.
whuber

0

Aşağıdakileri kullanabilirsiniz:

import gdal, numpy as n
def coord(file):
    padfTransform = file.GetGeoTransform()
    indices = n.indices(file.ReadAsArray().shape)
    xp = padfTransform[0] + indices[1]*padfTransform[1] + indices[1]*padfTransform[2]   
    yp = padfTransform[3] + indices[0]*padfTransform[4] + indices[0]*padfTransform[5]  
    return xp,yp
file = gdal.Open('Yourfile.tif') # A GeoTiff file
x,y = coord(file)

koordinat tüm piksellerin boylamını (x) ve enlemini (y) döndürür. Koordinatların bir pikselin sol köşesinde olduğunu unutmayın


İndeksler [1] * padfTransform [1] + indeksler [0] * padfTransform [2] ve yp için tersi olmamalı mı?
CMCDragonkai
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.