أكثر

مشكلة في تحويل إحداثيات CRS EPSG: 4269 إلى EPSG: 3857 في بيثون


source_srs = get_srs (shp_abs_path) source_epsg = source_srs.GetAttrValue ("PROJCS | GEOGCS | AUTHORITY" ، 1) print source_epsg #prints 4269 target_epsg = 3857 # لأنها تتجه إلى Lealetjs target_srsefers. osr_transform = osr.CoordinateTransformation (source_srs، target_srs)

ثم عندما أقوم بالتعداد من خلال ملف الشكل ، أقوم بتحويل bboxes أثناء الطيران

sf = shapefile.Reader (base_path) shapeRecords = sf.shapeRecords () # سوف يخزن الهندسة بشكل منفصل self.shapefile_records [fn] = shapeRecords لـ i ، الشكل في التعداد (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 ()

الذي يطبع إحداثيات مثل هذا ...

-13613708.5846 4623834.1438 -13613668.296 4623869.60132

لقد وضعوني في المحيط على ما أعتقد ، لكن من المفترض أن يكونوا في مقاطعة نابا. نرحب ترحيبا حارا بأي اقتراحات. يمكنني استخدام تقريبا أي بيثون ليب.

الجديد

لقد حددت مشكلة ولست متأكدًا مما إذا كانت مع osgeo أو التحويل من 4269 إلى 4326 الذي حددته. ألق نظرة على هذا الناتج:

>>> من 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 >>> طباعة point.Transform (osr_transform) 0 >>> point.GetX ()، point.GetY () (6449750.845، 2001628.4131199997)

لا شيء يتم تعديله. لقد أكدت ثلاث مرات أن البيانات موجودة في EPSG: 4269 وقمت بتضمين رابط بت مختصر لها أدناه في التعليقات.


المشكلة في الحل الخاص بك هي أنالمصدرليس صحيحاالمرجع المكاني (). إذا كانت نتيجةsource_epsgهو 4269 ثم:

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

يعطي osr صالحًا.

الجديد

إذا فهمت سؤالك بشكل صحيح ، فأنت تريد استخدام Leaflet ، ويتوقع المنشور أن تكون الإحداثيات و GeoJSON في EPSG: 4326 (إعادة إسقاط الإحداثيات و geoJSON في النشرة)

إذا كنت أتوقع نتائجك مع OSR

من osgeo import osr wgs84 = osr.SpatialReference () wgs84.ImportFromEPSG (4326) merca = osr.SpatialReference () merca.ImportFromEPSG (3857) التحويل = osr.CoordinateTransformation (merca، wgs84) تحويل الطباعة. -122.29402495095313 ، 38.313684256028715 التحويل. TransformPoint (-13613668.296،4623869.60132) -122.29366303230159 ، 38.313934175663768 ، 0.0

يمكنك اختبار GeoJSON الناتج:

{"النوع": "FeatureCollection"، "features": [{"type": "Feature"، "properties": {}، "geometry": {"type": "Point"، "الإحداثيات": [-122.29402495095313 ، 38.313684256028715]}}، {"type": "Feature"، "properties": {}، "geometry": {"type": "Point"، "coordinates": [-122.29366303230159، 38.313934175663768]}}]}

في geosjon.io أو GeJSONLint

النتائج هي نفسها مع EPSG: 4269 (انظر إلى Silly Geographic Precision):

{"type": "FeatureCollection"، "features": [{"type": "Feature"، "properties": {}، "geometry": {"type": "Point"، "الإحداثيات": [-122.29402495095315 ، 38.313684256946736]}}، {"type": "Feature"، "properties": {}، "geometry": {"type": "Point"، "coordinates": [-122.29366303230159، 38.313934176581782]}}]}

مع target_epsg = 3857: