Mais

Problema ao transformar coordenadas CRS EPSG: 4269 em EPSG: 3857 em python


source_srs = get_srs (shp_abs_path) source_epsg = source_srs.GetAttrValue ("PROJCS | GEOGCS | AUTHORITY", 1) imprimir source_epsg #prints 4269 target_epsg = 3857 # porque eles estão direcionados para leafletjs target_srss = osrm target_spatialReferences.I target_spatialReference (). osr_transform = osr.CoordinateTransformation (source_srs, target_srs)

então, enquanto enumero através do shapefile, eu transformo os bboxes na hora

sf = shapefile.Reader (base_path) shapeRecords = sf.shapeRecords () # irá armazenar a geometria separadamente self.shapefile_records [fn] = shapeRecords para i, forma em enumerar (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 ()

que imprime coordenadas como esta ...

-13613708.5846 4623834.1438 -13613668.296 4623869.60132

estes me colocaram no oceano, eu acho, mas eles deveriam estar no condado de Napa. Todas as sugestões são muito bem vindas. Posso usar quase qualquer lib Python.

NOVO

Identifiquei um problema e não tenho certeza se é com osgeo ou a transformação de 4269 para 4326 que defini. Dê uma olhada nesta saída:

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

Nada é modificado. Confirmei três vezes que os dados estão em EPSG: 4269 e incluí um link abreviado para eles abaixo nos comentários.


O problema com a sua solução é quesource_srsnão é validoosr.SpatialReference (). Se o resultado desource_epsgé 4269 então:

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

fornece um osr.SpatialReference () válido

NOVO

Se bem entendi sua pergunta, você deseja usar o Folheto, e o Folheto espera que as coordenadas e o GeoJSON estejam em EPSG: 4326 (Reprojetando as coordenadas e o geoJSON no folheto)

Se eu projetar seus resultados com osr

from osgeo import osr wgs84 = osr.SpatialReference () wgs84.ImportFromEPSG (4326) merca = osr.SpatialReference () merca.ImportFromEPSG (3857) transformação = osr.CoordinateTransformation (merca, wgs84) imprimir transformação.TransformPoint (-13413708238234.134) -122.29402495095313, 38.313684256028715 transformação.TransformPoint (-13613668.296,4623869.60132) -122.29366303230159, 38.313934175663768, 0,0

Você pode testar o GeoJSON resultante:

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

Em geosjon.io ou GeJSONLint

Os resultados são os mesmos com EPSG: 4269 (veja 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]}}]}

Com target_epsg = 3857:


Assista o vídeo: 02 05 EPSG 3857 (Outubro 2021).