Mehr

Problem beim Transformieren der CRS-Koordinaten EPSG:4269 in EPSG:3857 in 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 # weil diese an leafletjs weitergeleitet werden target_srs = osr.SGSpatialReference() target_sromrs osr_transform = osr.CoordinateTransformation(source_srs, target_srs)

dann, während ich das Shapefile aufzähle, transformiere ich die Bboxen im Handumdrehen

sf = shapefile.Reader(base_path) shapeRecords = sf.shapeRecords() #speichert die Geometrie separat self.shapefile_records[fn] = shapeRecords for i, shape in enumerate(sf.shapes()): bbox = shape.bbox ## OGR/SRS TRANSFORMATION 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()

die Koordinaten wie diese druckt…

-13613708.5846 4623834.1438 -13613668.296 4623869.60132

Ich glaube, diese haben mich ins Meer geworfen, aber sie sollen in Napa County sein. Alle Vorschläge sind herzlich willkommen. Ich kann fast jede Python-Bibliothek verwenden.

NEU

Ich habe ein Problem identifiziert und bin mir nicht sicher, ob es mit Osgeo oder der von mir definierten Transformation von 4269 in 4326 zusammenhängt. Sehen Sie sich diese Ausgabe an:

>>> from 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 >>> print point.Transform(osr_transformation) 0 >>> point.GetX(), point.GetY() (6449750.845, 2001628.4131199997)

Nichts wird geändert. Ich habe dreifach bestätigt, dass die Daten in EPSG: 4269 enthalten sind, und unten in den Kommentaren einen gekürzten Link dazu eingefügt.


Das Problem mit deiner Lösung ist dassource_srsist nicht gültigosr.SpatialReference(). Wenn das Ergebnis vonsource_epsgist 4269 dann:

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

gibt eine gültige osr.SpatialReference()

NEU

Wenn ich Ihre Frage richtig verstehe, möchten Sie Leaflet verwenden, und Leaflet erwartet, dass die Koordinaten und GeoJSON in EPSG:4326 (Reprojizieren von Koordinaten und geoJSON im Prospekt) enthalten sind.

Wenn ich deine Ergebnisse mit osr projiziere

from osgeo import osr wgs84 = osr.SpatialReference() wgs84.ImportFromEPSG(4326) merca = osr.SpatialReference() merca.ImportFromEPSG(3857) -122.29402495095313, 38.313684256028715 Transformation.TransformPoint(-13613668.296,4623869.60132) -122.29366303230159, 38.313934175663768, 0.0

Sie können das resultierende GeoJSON testen:

{"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] } } ]}

In geosjon.io oder GeJSONLint

Die Ergebnisse sind die gleichen mit EPSG:4269 (siehe 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 ] } } ]}

Mit target_epsg = 3857: