6 votos

Transformando datos de una grilla de lat-lon de polos rotados en coordenadas regulares de lat-lon en QGIS?

Estoy trabajando con los datos de un meteorológica numérica del modelo, el resultado de lo que se da en las celdas de la cuadrícula donde tengo el lat-lon coordenadas de cada celda del punto central. El lat-lon especificaciones son, sin embargo, en una rotación del sistema de coordenadas con el polo sur en (lon: 10, lat: -40). El problema necesito ayuda con la trata de cómo se transforma una cuadrícula (un vector layer), que se define en el girado lat-lon coordenadas en el programa regular de lat-lon coordenadas dentro de QGIS. La siguiente figura muestra mi problema específico de una cuadrícula rectangular en el polo girado lat-lon coordenadas (frente a la costa de África Occidental) y los puntos de destino en regular lat-lon coordenadas de Dinamarca. Observe que el cuadrado de la cuadrícula simplemente no se traducen (desplazado) y girado, también hay una latitud dependiente de la escala del problema.

Square grid in pole rotated lat-lon coordinates (at the Equator at West Africa's coast) needs to be transformed to a grid in regular lat-lon (here over Denmark).

Un hilo anterior SE muestra cómo la transformación puede ser calculado para los puntos con la ayuda de unos simples trigonometría (Lon/lat transformación). Estos cálculos funcionan perfectamente (por puntos) cuando se implementan en R, pero necesito hacer esta transformación de una capa vectorial dentro de QGIS. Es común que las oficinas meteorológicas para sólo especificar las coordenadas del Sur o Polo Norte en el girado lat-lon de la cuadrícula. El QGIS transformación basada en consecuencia, se debe hacer de la manera simondk hace en su respuesta al hilo de los que me he referido (él implementado una pequeña pieza de código de Matlab que hace esto aquí.

He tratado de hacer la transformación con la Transformación Afín plugin donde puedo calcular los parámetros del plugin basado en este hilo anterior. Este procedimiento casi se pone a la derecha de la cuadrícula es girado a la derecha de la localización general (por encima de Dinamarca), pero parece que hay algo mal con la escala. Los puntos centrales de la transformación de las células de la red no están exactamente en el lugar correcto - esto se ve claramente en las esquinas de la cuadrícula. En la imagen de abajo, mi transformado cuadrícula es de color rojo, mientras que la correcta cuadrícula del centro de ubicaciones de puntos son los cruces negras.

No estoy seguro de lo que va mal aquí. Puede Transformación Afín incluso lat-lon rotación correctamente?

He realizado una amplia búsqueda en Google y parece ser que hay muchas personas con problemas similares, pero no hay soluciones. Aquí hay un enlace a una carpeta de dropbox que contiene los datos que he usado para las figuras, en el caso de que quieras probar una solución en la girado real de la cuadrícula y los puntos de destino con la que estoy trabajando.

Black crosses are the correct locations for the center points, while the grid is my post-transformation result.

Yo prefiero QGIS.

4voto

Yada Puntos 9489

He creado un 0,5 x 0,5 cuadrícula (grados) en su área de interés:

enter image description here

y desarrollado la siguiente PyQGIS código (mediante el uso de las fórmulas en el enlace) para arbitrariamente girar esta cuadrícula 70º alrededor de su centro (9.71943416148, 55.4053054573).

from math import sin, cos, pi

def rotatePoints(axis, r_angle, points):

    points_rot = []

    for point in points:
        tr = QgsPoint( point.x() - axis.x(), point.y() - axis.y() )
        xrot = tr.x()*cos(r_angle*(pi/180)) - tr.y()*sin(r_angle*(pi/180))  
        yrot = tr.x()*sin(r_angle*(pi/180)) + tr.y()*cos(r_angle*(pi/180)) 
        xnew = xrot + axis.x()
        ynew = yrot + axis.y()
        points_rot.append(QgsPoint(xnew,ynew))

    return points_rot

def createPolygonMemoryLayer(epsg, pol_rot):

    uri = "Polygon?crs=epsg:" + str(epsg) + "&field=id:integer""&index=yes"

    mem_layer = QgsVectorLayer(uri,
                               "Polygon",
                               "memory")

    QgsMapLayerRegistry.instance().addMapLayer(mem_layer)

    prov = mem_layer.dataProvider()

    n = len(pol_rot)

    feats = [ QgsFeature() for i in range(n) ]

    for i, feat in enumerate(feats):
        feat.setGeometry(QgsGeometry.fromPolygon(pol_rot[i]))
        feat.setAttributes([i])
        mem_layer.addFeature(feat, True)

    prov.addFeatures(feats)

#Code starts here

layer = iface.activeLayer()

crs = layer.crs()
epsg = crs.postgisSrid()

features = layer.getFeatures()

geom = []

for feature in features:
    geom.append(feature.geometry().asPolygon())

points = geom

n = layer.featureCount()

pol_rot = [ [] for i in range(n) ]

axis = QgsPoint(9.71943416148, 55.4053054573)

r_angle = 70

for i in range(n):
    points_rot = rotatePoints(axis, r_angle, points[i][0])
    pol_rot[i].append(points_rot)

createPolygonMemoryLayer(epsg, pol_rot)

Después de ejecutar el código anterior en la Consola de Python de QGIS, tengo una nueva cuadrícula rotada sin ningún tipo de distorsión; como se puede observar en la siguiente imagen:

enter image description here

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X