Skip to content

Commit 811eda1

Browse files
authored
fix lat/lon axis order when using gdal 3 (#158)
1 parent f15b79c commit 811eda1

File tree

2 files changed

+49
-1
lines changed

2 files changed

+49
-1
lines changed

gis4wrf/core/crs.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -180,6 +180,7 @@ def lonlat_srs(self) -> osr.SpatialReference:
180180
srs = self.srs
181181
datum = self.srs.GetAttrValue('datum')
182182
srs_out = osr.SpatialReference()
183+
fix_axis_order(srs_out)
183184
srs_out.SetGeogCS('', datum, '', srs.GetSemiMajor(), srs.GetInvFlattening())
184185
assert not srs_out.EPSGTreatsAsLatLong(), 'expected lon/lat axis order'
185186
return srs_out
@@ -190,4 +191,9 @@ def transform_point(srs_in: osr.SpatialReference, srs_out: osr.SpatialReference,
190191
point_geom.AddPoint(point.x, point.y)
191192
transform = osr.CoordinateTransformation(srs_in, srs_out)
192193
point_geom.Transform(transform)
193-
return Coordinate2D(x=point_geom.GetX(), y=point_geom.GetY())
194+
return Coordinate2D(x=point_geom.GetX(), y=point_geom.GetY())
195+
196+
def fix_axis_order(srs):
197+
# https://github.com/OSGeo/gdal/blob/release/3.0/gdal/MIGRATION_GUIDE.TXT
198+
if hasattr(osr, 'OAMS_TRADITIONAL_GIS_ORDER'):
199+
srs.SetAxisMappingStrategy(osr.OAMS_TRADITIONAL_GIS_ORDER)

tests/core/test_crs.py

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
# GIS4WRF (https://doi.org/10.5281/zenodo.1288569)
2+
# Copyright (c) 2019 D. Meyer and M. Riechert. Licensed under MIT.
3+
4+
import pytest
5+
6+
from gis4wrf.core import (
7+
CRS, LonLat, Coordinate2D
8+
)
9+
10+
@pytest.mark.parametrize('crs_name', ['lonlat', 'lambert', 'mercator', 'polar', 'albers_nad83'])
11+
def test_geo_roundtrip(crs_name: str):
12+
if crs_name == 'lonlat':
13+
crs = CRS.create_lonlat()
14+
elif crs_name == 'lambert':
15+
crs = CRS.create_lambert(truelat1=3.5, truelat2=7, origin=LonLat(lon=4, lat=0))
16+
elif crs_name == 'mercator':
17+
crs = CRS.create_mercator(truelat1=3.5, origin_lon=4)
18+
elif crs_name == 'polar':
19+
crs = CRS.create_polar(truelat1=3.5, origin_lon=4)
20+
elif crs_name == 'albers_nad83':
21+
crs = CRS.create_albers_nad83(truelat1=3.5, truelat2=7, origin=LonLat(lon=4, lat=0))
22+
lonlat = LonLat(lon=10, lat=30)
23+
xy = crs.to_xy(lonlat)
24+
lonlat2 = crs.to_lonlat(xy)
25+
assert lonlat.lon == pytest.approx(lonlat2.lon)
26+
assert lonlat.lat == pytest.approx(lonlat2.lat)
27+
28+
@pytest.mark.parametrize('crs_name', ['lambert', 'mercator', 'polar', 'albers_nad83'])
29+
def test_projection_origin(crs_name: str):
30+
origin_lonlat = LonLat(lon=4, lat=0)
31+
if crs_name == 'lambert':
32+
crs = CRS.create_lambert(truelat1=3.5, truelat2=7, origin=origin_lonlat)
33+
elif crs_name == 'mercator':
34+
crs = CRS.create_mercator(truelat1=3.5, origin_lon=origin_lonlat.lon)
35+
elif crs_name == 'polar':
36+
origin_lonlat = LonLat(lon=origin_lonlat.lon, lat=90)
37+
crs = CRS.create_polar(truelat1=3.5, origin_lon=origin_lonlat.lon)
38+
elif crs_name == 'albers_nad83':
39+
crs = CRS.create_albers_nad83(truelat1=3.5, truelat2=7, origin=origin_lonlat)
40+
origin_xy = crs.to_xy(origin_lonlat)
41+
assert origin_xy.x == pytest.approx(0)
42+
assert origin_xy.y == pytest.approx(0, abs=1e-9)

0 commit comments

Comments
 (0)