Suite

Problème de transformation des coordonnées CRS EPSG:4269 en EPSG:3857 en python

Problème de transformation des coordonnées CRS EPSG:4269 en EPSG:3857 en python


source_srs = get_srs(shp_abs_path) source_epsg = source_srs.GetAttrValue("PROJCS|GEOGCS|AUTHORITY", 1) print source_epsg #prints 4269 target_epsg = 3857 # car ceux-ci sont dirigés vers la brochurejs target_srs = osr.SpatialReference() target_seprs osr_transform = osr.CoordinateTransformation(source_srs, target_srs)

puis au fur et à mesure que j'énumére le fichier de formes, je transforme les bbox à la volée

sf = shapefile.Reader(base_path) shapeRecords = sf.shapeRecords() #stockera la géométrie séparément self.shapefile_records[fn] = shapeRecords for i, shape in enumerate(sf.shapes()): bbox = shape.bbox ## TRANSFORMATION OGR/SRS point = ogr.Geometry(ogr.wkbPoint) point.AddPoint(bbox[0],bbox[1]) point.Transform(osr_transform) print point.GetX(), point.GetY() point.AddPoint( bbox[2],bbox[3]) point.Transform(osr_transform) print point.GetX(), point.GetY()

qui imprime des coordonnées comme ceci…

-13613708.5846 4623834.1438 -13613668.296 4623869.60132

ceux-ci m'ont mis dans l'océan, je pense, mais ils sont censés être dans le comté de Napa. Toutes les suggestions sont les bienvenues. Je peux utiliser presque n'importe quelle bibliothèque Python.

NOUVEAU

J'ai identifié un problème et je ne sais pas si c'est avec osgeo ou la transformation 4269 à 4326 que j'ai définie. Jetez un œil à cette sortie :

>>> depuis osgeo import ogr, osr >>> source_srs = osr.SpatialReference() >>> source_srs.ImportFromEPSG(4269) 0 >>> target_srs = osr.SpatialReference() >>> target_srs.ImportFromEPSG(4326) 0 > >> osr_transformation = osr.CoordinateTransformation(source_srs, target_srs) >>> point = ogr.Geometry(ogr.wkbPoint) >>> point.AddPoint(6449750.845, 2001628.41312) >>> point.Transform(osr_transformation) 0 >>> imprimer point.Transform(osr_transformation) 0 >>> point.GetX(), point.GetY() (6449750.845, 2001628.4131199997)

Rien n'est modifié. J'ai confirmé trois fois que les données sont dans EPSG: 4269 et j'ai inclus un lien bitly raccourci ci-dessous dans les commentaires.


Le problème avec ta solution est quesource_srsN'est pas valideosr.SpatialReference(). Si le résultat desource_epsgest 4269 alors :

source_srs = osr.SpatialReference() source_srs.ImportFromEPSG(4269)

donne un osr.SpatialReference() valide

NOUVEAU

Si je comprends bien votre question, vous souhaitez utiliser Leaflet, et Leaflet s'attend à ce que les coordonnées et GeoJSON soient dans EPSG: 4326 (Reprojection des coordonnées et geoJSON dans le dépliant)

Si je projette vos résultats avec osr

depuis osgeo importer osr wgs84 = osr.SpatialReference() wgs84.ImportFromEPSG(4326) merca = osr.SpatialReference() merca.ImportFromEPSG(3857) transformation = osr.CoordinateTransformation(merca,wgs84) imprimer transformation.TransformPoint(-13613708.5846),4623834 -122.29402495095313, 38.313684256028715 transformation.TransformPoint(-13613668.296,4623869.60132) -122.29366303230159, 38.313934175663768, 0.0

Vous pouvez tester le GeoJSON résultant :

{"type":"FeatureCollection", "features": [ { "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ -122.29402495095313 , 38.313684256028715 ] } }, { "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ -122.29366303230159, 38.313934175663768] } } ]}

Dans geosjon.io ou GeJSONLint

Les résultats sont les mêmes avec EPSG:4269 (regardez Silly Geographic Precision):

{"type":"FeatureCollection", "features": [ { "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ -122.29402495095315 , 38.313684256946736 ] } }, { "type": "Feature", "properties": { }, "geometry": { "type": "Point", "coordinates": [ -122.29366303230159, 38.313934176581782 ] } } ]}

Avec target_epsg = 3857 :


Voir la vidéo: EXERCICE 2: Résoudre un problème difficile qui se ramène à une équation 3ÈME ANNÉE COLLÈGE