Saltar al contenido

Conversión de geometría a formato WKT usando QGIS Expression

Este grupo redactor ha estado por horas investigando para dar respuesta a tu duda, te compartimos la respuestas y esperamos que sea de gran ayuda.

Solución:

WKT no distingue entre mayúsculas y minúsculas para la definición de geometría (Referencia) y QGIS acepta WKT string sin que el primer y último punto sean iguales.

Por ejemplo:

geom_from_wkt( 'Polygon ((27 52, 31 37, 18 21))' )

y

geomWkt = QgsGeometry.fromWkt('Polygon ((27 52, 31 37, 18 21))')

trabaja.

De la documentación:

Tenga en cuenta que, a diferencia de algunos programas, QGIS cerrará el anillo por usted, por lo que no es necesario duplicar el primer punto como el último.

No es necesario escribir el tipo de geometría en mayúsculas. Pero, por supuesto, el wkt string debe tener coordenadas de cierre. Me parece un error, ya que en la versión de Windows de 64 bits de 3.16.2 y 3.10.12 obtengo coordenadas de cierre cuando uso geom_to_wkt($geometry).

Sin embargo, como declaró Kadir Şahbaz, QGIS debería poder funcionar sin él. Sin embargo, solo para completar esto en caso de que necesite la coordenada de cierre, aquí hay una solución elegante:

'Polygon((' || -- start wkt string
array_to_string(
array_foreach( -- Go throuth every element of the following array
    string_to_array(geom_to_wkt(nodes_to_points($geometry)),','), -- Create the array of WKT information splitted by comma [ 'MultiPoint ((0.2974026 51.8987013)', '(0.00909091 51.50… ]
        x(make_point( -- Create a point geometry for every array content
            to_real(if(
                length(regexp_substr( -- Only create X coordinate if
                    regexp_substr(@element,'\d.*\d.[0-9]'),'([^ ]+)'))>0, -- everything between the Brackets of 'MultiPoint ((0.2974026 51.8987013)' before the whitespace '0.2974026' is not empty like ''
                    to_real(regexp_substr(regexp_substr(@element,'\d.*\d.[0-9]'),'([^ ]+)')), -- Extract the X coordinate of 'MultiPoint ((0.2974026 51.8987013)' --> 0.2974026
                    NULL -- If invalid coordinate use NULL, maybe replace with 0
            )),
            to_real(if(
                length(regexp_substr( -- Only create Y coordinate if
                    regexp_substr(@element,'\d.*\d.[0-9]'),'(?<=\s).*'))>0, --  everything between the Brackets of 'MultiPoint ((0.2974026 51.8987013)' after the whitespace '51.8987013' is not empty like ''
                    to_real(regexp_substr(regexp_substr(@element,'\d.*\d.[0-9]'),'(?<=\s).*')), -- Extract the Y coordinate of 'MultiPoint ((0.2974026 51.8987013)' --> 51.8987013
                    NULL -- If invalid coordinate use NULL, maybe replace with 0
            ))
        ))
|| ' ' || -- separator between x and y coordinates
        y(make_point( -- Create a point geometry for every array content
            to_real(if(
                length(regexp_substr( -- Only create X coordinate if
                    regexp_substr(@element,'\d.*\d.[0-9]'),'([^ ]+)'))>0, -- everything between the Brackets of 'MultiPoint ((0.2974026 51.8987013)' before the whitespace '0.2974026' is not empty like ''
                    to_real(regexp_substr(regexp_substr(@element,'\d.*\d.[0-9]'),'([^ ]+)')), -- Extract the X coordinate of 'MultiPoint ((0.2974026 51.8987013)' --> 0.2974026
                    NULL -- If invalid coordinate use NULL, maybe replace with 0
            )),
            to_real(if(
                length(regexp_substr( -- Only create Y coordinate if
                    regexp_substr(@element,'\d.*\d.[0-9]'),'(?<=\s).*'))>0, --  everything between the Brackets of 'MultiPoint ((0.2974026 51.8987013)' after the whitespace '51.8987013' is not empty like ''
                    to_real(regexp_substr(regexp_substr(@element,'\d.*\d.[0-9]'),'(?<=\s).*')), -- Extract the Y coordinate of 'MultiPoint ((0.2974026 51.8987013)' --> 51.8987013
                    NULL -- If invalid coordinate use NULL, maybe replace with 0
            ))
        ))
)
,', ') -- Split node coordinates from the array to a string separated by comma and whitespace
|| ', ' || x(point_n($geometry,1)) || ' ' || y(point_n($geometry,1)) -- re-add the first vertex-coordinates and add it as closing-coordinates
|| '))' -- Add closing brackets

Recuerda algo, que tienes la capacidad de agregar una reseña si diste con el resultado.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *