Supongamos que tenemos definidas las coordenadas de dos puntos (ciudades en nuestro ejemplo). Cada una de estas tuplas indica las coordenadas decimales de las ciudades de Trelew y Junín de los Andes.
trelew = -43.253333, -65.309444
junin_de_los_andes = -39.950556, -71.069444
Lo que vamos a hacer es usar una instancia de la clase QgsDistanceArea que es la responsable
de hacer los cálculos relacionados con distancias y áreas en un plano.
Comenzaremos por generar una instancia de la clase y asignarle un elipsoide. De otro modo
hará las cuentas asumiendo un modelo "plano".
d = QgsDistanceArea()
d.setEllipsoid('WGS84')
Luego, es necesario generar dos puntos de QGIS, para que pueda hacer los cálculos correctamente.
Si bien la clase usual que usa QGIS para modelar un punto es QgsPoint, usaremos QgsPointXY,
que se especializa en puntos sobre un mapa, es decir, sobre dos dimensiones. Cabe mencionar
que para crear estos puntos, deberemos "invertir" el orden de la latitud y longitud de las
coordenadas, ya que QgsPointXY espera primero la longitud.
lat, lon = trelew
p_trelew = QgsPointXY(lon, lat)
lat, lon = junin_de_los_andes
p_junin = QgsPointXY(lon, lat)
Finalmente queda calcular la distancia. QgsDistanceArea calcula las distancias en metros.
Vamos a hacer uso del método convertLengthMeasurement() definido en esa clase para
transformar el resultado a la unidad de medida que nos sea más cómoda o apropiada. En
nuestro caso usaremos kilómetros.
distancia = d.measureLine(p_trelew, p_junin)
distancia_km = d.convertLengthMeasurement(distancia, Qgis.DistanceUnit.DistanceKilometers)
print("La distancia en km. entre Trelew y Junin de los Andes es ", distancia_km)
Una vez que tenemos esta distancia, también podemos verla en el mapa. Vamos a generar una capa vectorial y en ella mostraremos una línea geodésica entre las dos ciudades.
Primero crearemos una geometría nueva, que será una lista de puntos por donde pasará
la curva. Esta geometría la generaremos con el método geodésicLine().
vertices = d.geodesicLine(p_trelew, p_junin, 100000)El tercer parámetro indica la separación en metros entre cada punto de la curva. En nuestro caso indicamos 100km.
Luego creamos una geometría con esa lista de puntos.
geodesic_line = QgsGeometry.fromPolylineXY(vertices[0])Ahora creamos una capa en memoria para mostrar la curva.
vlayer = QgsVectorLayer('LineString?crs=EPSG:4326', 'ruta', 'memory')
provider = vlayer.dataProvider()Finalmente agregamos nuestra geometría a la capa y mostramos la capa.
f = QgsFeature()
f.setGeometry(geodesic_line)
provider.addFeature(f)
vlayer.updateExtents()
QgsProject.instance().addMapLayer(vlayer)