Suite

PostGIS - Comment calculer la longueur de la chaîne de ligne à partir de WGS84 après la transformation à partir de l'OSGB 36


J'ai des problèmes pour obtenir des longueurs à partir de chaînes multilignes après avoir transformé les données de EPSG:27700 - OSGB 1936 / British National Grid en EPSG:4326/ WGS 84.

Je fais cette conversion pour importer un fichier de formes de routes dans une base de données PostGIS qui utilise WGS84 par défaut. Cependant, lorsque j'essaie de calculer des longueurs, j'ai des lectures étranges.

Tout d'abord, j'ai pensé à une transformation incorrecte, mais après avoir effectué quelques tests supplémentaires dans une base de données vide en important la couche sans la transformer (référence OSGB 1936), je suis toujours perplexe :

La requête suivante renvoie des résultats contradictoires

SELECT ST_Length(geom) AS length_OSGB ,ST_Length_Spheroid(ST_Transform(geom,4326),'SPHEROID["WGS 84",6378137,298.257223563]') As length_WGS84 FROM osgb36_data WHERE id = 108

cela donne 338 mètres pour la longueur OSGB36 et 482 mètres pour la longueur WGS84. Celui de droite est à 338 mètres.

J'ai effectué l'importation dans la base de données à l'aide de QGIS et DBmanager.

De plus, je devais deviner les projections initiales, car le .prj était manquant, mais la projection du résultat sur Google Maps donne une correspondance parfaite.

Tout indice est le bienvenu

ÉDITER:

C'est le WKT pour l'élément dans l'exemple, comme suggéré :

SRID=27700;MULTILINESTRING(( 423216.279 574665.249 0, 423206.315 574708.077 44.649, 423158.458 574896.911 242.525, 423132.406 574993.061 344))

Eh bien, c'est bizarre, on dirait qu'ils utilisaient la coordonnée z pour enregistrer la distance accumulée pour chaque point de la chaîne de lignes… Cela pourrait expliquer le problème avec les mauvaises distances


Les fonctions de longueur fonctionnent différemment avec les géométries de lignes 3D :

  • ST_Longueur - renvoie les distances 2D pourgéométrietypes, et curieusement distances 3D pourla géographietypes (mais pas dans cette question)
  • ST_Length_Spheroid - renvoie les distances 3D pourgéométrieles types

Votre exemple est en 3D, il calculera donc la longueur 3D avecST_Length_Spheroidet la longueur 2D avecST_Longueursur ungéométrie.

Cependant, si vous voulez toujours des longueurs 2D, vous pouvez forcer la géométrie à une chaîne de lignes 2D en utilisant soit ST_Force2Dou alorsST_Force_2D fonction (le changement de nom dans PostGIS 2.1).

SELECT ST_Length(geom) AS length_27700, ST_Length_Spheroid(ST_Transform(ST_Force2d(geom), 4326), spheroid) AS length_spheroid_2d, ST_Length_Spheroid(ST_Transform(geom, 4326), spheroid) AS length_spheroid 6.227700 574665.249 0, 423206.315 574708.077 44.649, 423158.458 574896.911 242.525, 423132.406 574993.061 344))'::geometry AS geom, 'SPHEROID["WGS 84",6378137,298.257223563]'::spheroid ) AS f; longueur_27700 | length_spheroid_2d | length_spheroid_3d ------------------+---------------------+---------- ---------- 338.39264086563 | 338.515774984236 | 482.622196178051

Postgis a raison.

Votre ligne est dans l'espace 3D et a en fait une longueur d'environ 482 m, même dans le British National Grid.

338 mètres est également correct mais correspond à la projection de la ligne 3D dans l'espace 2D.

avec un comme ( sélectionnez st_Geomfromewkt('SRID=27700;MULTILINESTRING(( 423216.279 574665.249 0, 423206.315 574708.077 44.649, 423158.458 574896.911 242.525, 423132.406 574993.061 344))') geom) sélectionnez ST_Length(geom_ST) "2D "3D_Length" à partir de a ; 2d_longueur | 3d_length ------------------+----------------- 338.39264086563 | 482.54086040695 (1 rangée)

Liens manuels :
ST_Longueur
ST_3DLongueur

Éditer:
En rapport:
http://revenant.ca/www/postgis/workshop/measurement.html


Voir la vidéo: Comment calculer la longueur des distances sur Arcgis (Octobre 2021).