From 6d444c7bce858638399b194ec7a908e2540f262a Mon Sep 17 00:00:00 2001 From: wyq Date: Sat, 29 Jun 2024 23:44:03 +0800 Subject: [PATCH] add crs and common used projections --- .../org/meteoinfo/chart/geo/MapGridLine.java | 3 +- .../java/org/meteoinfo/chart/geo/MapPlot.java | 16 +- .../meteoinfo/chart/graphic/MeshGraphic.java | 15 + .../java/org/meteoinfo/chart/jogl/GLPlot.java | 14 +- .../geometry/graphic/Line2DGraphic.java | 27 + meteoinfo-lab/milconfig.xml | 28 +- .../pylib/mipylib/geolib/__init__$py.class | Bin 2839 -> 2905 bytes .../pylib/mipylib/geolib/__init__.py | 2 + meteoinfo-lab/pylib/mipylib/geolib/crs.py | 763 ++++++++++++++++++ .../pylib/mipylib/plotlib/_axes$py.class | Bin 232142 -> 230718 bytes meteoinfo-lab/pylib/mipylib/plotlib/_axes.py | 51 +- .../pylib/mipylib/plotlib/_axes3dgl$py.class | Bin 107242 -> 107298 bytes .../pylib/mipylib/plotlib/_axes3dgl.py | 7 +- .../pylib/mipylib/plotlib/_mapaxes$py.class | Bin 90630 -> 90738 bytes .../pylib/mipylib/plotlib/_mapaxes.py | 17 +- .../org/meteoinfo/ndarray/math/ArrayUtil.java | 2 +- .../meteoinfo/projection/ProjectionInfo.java | 48 +- .../meteoinfo/projection/ProjectionNames.java | 5 + .../meteoinfo/projection/ProjectionUtil.java | 6 + .../org/meteoinfo/projection/info/Airy.java | 61 ++ .../org/meteoinfo/projection/info/Aitoff.java | 145 ++++ .../org/meteoinfo/projection/info/Albers.java | 4 +- .../org/meteoinfo/projection/info/August.java | 145 ++++ .../projection/info/AzimuthEquidistant.java | 96 +++ .../org/meteoinfo/projection/info/Common.java | 4 +- .../projection/info/EquidistantConic.java | 96 +++ .../info/GeostationarySatellite.java | 2 +- .../org/meteoinfo/projection/info/Hammer.java | 4 +- .../info/LambertAzimuthalEqualArea.java | 4 +- .../info/LambertConformalConic.java | 13 + .../info/LambertEqualAreaConic.java | 4 +- .../meteoinfo/projection/info/Mercator.java | 3 +- .../info/{Molleweide.java => Mollweide.java} | 8 +- .../info/OrthographicAzimuthal.java | 4 +- .../meteoinfo/projection/info/Robinson.java | 4 +- .../meteoinfo/projection/info/Sinusoidal.java | 4 +- .../info/StereographicAzimuthal.java | 15 +- .../projection/info/TransverseMercator.java | 3 +- .../meteoinfo/projection/info/Wagner3.java | 73 +- 39 files changed, 1573 insertions(+), 123 deletions(-) create mode 100644 meteoinfo-lab/pylib/mipylib/geolib/crs.py create mode 100644 meteoinfo-projection/src/main/java/org/meteoinfo/projection/info/Airy.java create mode 100644 meteoinfo-projection/src/main/java/org/meteoinfo/projection/info/Aitoff.java create mode 100644 meteoinfo-projection/src/main/java/org/meteoinfo/projection/info/August.java create mode 100644 meteoinfo-projection/src/main/java/org/meteoinfo/projection/info/AzimuthEquidistant.java create mode 100644 meteoinfo-projection/src/main/java/org/meteoinfo/projection/info/EquidistantConic.java rename meteoinfo-projection/src/main/java/org/meteoinfo/projection/info/{Molleweide.java => Mollweide.java} (96%) diff --git a/meteoinfo-chart/src/main/java/org/meteoinfo/chart/geo/MapGridLine.java b/meteoinfo-chart/src/main/java/org/meteoinfo/chart/geo/MapGridLine.java index 1d1a7668..a3df4480 100644 --- a/meteoinfo-chart/src/main/java/org/meteoinfo/chart/geo/MapGridLine.java +++ b/meteoinfo-chart/src/main/java/org/meteoinfo/chart/geo/MapGridLine.java @@ -287,7 +287,7 @@ public class MapGridLine extends GridLine { points.add(new PointD(lon, lat)); lat += delta; } - points.add((new PointD(lon, lat))); + points.add((new PointD(lon, latMax))); PolylineShape line = new PolylineShape(); line.setPoints(points); Graphic graphic = new Graphic(line, this.lineBreak); @@ -320,6 +320,7 @@ public class MapGridLine extends GridLine { points.add(new PointD(lon, lat)); lon += delta; } + //points.add(new PointD(lonMax, lat)); PolylineShape line = new PolylineShape(); line.setPoints(points); Graphic graphic = new Graphic(line, this.lineBreak); diff --git a/meteoinfo-chart/src/main/java/org/meteoinfo/chart/geo/MapPlot.java b/meteoinfo-chart/src/main/java/org/meteoinfo/chart/geo/MapPlot.java index f50bb489..4c01acfc 100644 --- a/meteoinfo-chart/src/main/java/org/meteoinfo/chart/geo/MapPlot.java +++ b/meteoinfo-chart/src/main/java/org/meteoinfo/chart/geo/MapPlot.java @@ -651,12 +651,7 @@ public class MapPlot extends Plot2D implements IWebMapPanel { */ @Override public Graphic addGraphic(Graphic graphic) { - Transform transform = graphic.getTransform(); - if (transform != null && transform.isValid()) { - GeoTransform geoTransform = (GeoTransform) transform; - graphic = GraphicProjectionUtil.projectClipGraphic(graphic, geoTransform.getSourceProj(), - geoTransform.getTargetProj()); - } + graphic.doTransform(); return super.addGraphic(graphic); } @@ -669,12 +664,7 @@ public class MapPlot extends Plot2D implements IWebMapPanel { */ @Override public Graphic addGraphic(int idx, Graphic graphic) { - Transform transform = graphic.getTransform(); - if (transform != null && transform.isValid()) { - GeoTransform geoTransform = (GeoTransform) transform; - GraphicProjectionUtil.projectClipGraphic(graphic, geoTransform.getSourceProj(), - geoTransform.getTargetProj()); - } + graphic.doTransform(); return super.addGraphic(idx, graphic); } @@ -745,7 +735,7 @@ public class MapPlot extends Plot2D implements IWebMapPanel { public Extent getFullExtent() { Extent ext = this.getExtent(); if (this.boundary != null) { - ext = ext.union(this.boundary.getExtent().extend(0.01)); + ext = ext.union(this.boundary.getExtent().extend(0.015)); } return ext; diff --git a/meteoinfo-chart/src/main/java/org/meteoinfo/chart/graphic/MeshGraphic.java b/meteoinfo-chart/src/main/java/org/meteoinfo/chart/graphic/MeshGraphic.java index ecdded23..a1f02265 100644 --- a/meteoinfo-chart/src/main/java/org/meteoinfo/chart/graphic/MeshGraphic.java +++ b/meteoinfo-chart/src/main/java/org/meteoinfo/chart/graphic/MeshGraphic.java @@ -7,6 +7,7 @@ import org.meteoinfo.geometry.legend.LegendManage; import org.meteoinfo.geometry.colors.TransferFunction; import org.meteoinfo.geometry.graphic.GraphicCollection3D; import org.meteoinfo.geometry.legend.LegendScheme; +import org.meteoinfo.projection.GeoTransform; import java.awt.*; import java.awt.image.BufferedImage; @@ -430,4 +431,18 @@ public class MeshGraphic extends GraphicCollection3D { public Color getColor() { return Color.red; } + + /** + * Transform the graphic + */ + @Override + public void doTransform() { + if (this.transform != null && this.transform.isValid()) { + if (this.transform instanceof GeoTransform) { + GeoTransform geoTransform = (GeoTransform) this.transform; + GraphicProjectionUtil.projectClipGraphic(this, geoTransform.getSourceProj(), + geoTransform.getTargetProj()); + } + } + } } diff --git a/meteoinfo-chart/src/main/java/org/meteoinfo/chart/jogl/GLPlot.java b/meteoinfo-chart/src/main/java/org/meteoinfo/chart/jogl/GLPlot.java index 251ba1ab..7a72144f 100644 --- a/meteoinfo-chart/src/main/java/org/meteoinfo/chart/jogl/GLPlot.java +++ b/meteoinfo-chart/src/main/java/org/meteoinfo/chart/jogl/GLPlot.java @@ -1127,12 +1127,7 @@ public class GLPlot extends Plot { * @param graphic Graphic */ public void addGraphic(Graphic graphic) { - org.meteoinfo.geometry.graphic.Transform transform = graphic.getTransform(); - if (transform != null && transform.isValid()) { - GeoTransform geoTransform = (GeoTransform) transform; - GraphicProjectionUtil.projectClipGraphic(graphic, geoTransform.getSourceProj(), - geoTransform.getTargetProj()); - } + graphic.doTransform(); this.graphics.add(graphic); Extent ex = this.graphics.getExtent(); if (!ex.is3D()) { @@ -1153,12 +1148,7 @@ public class GLPlot extends Plot { * @param graphic Graphic */ public void addGraphic(int index, Graphic graphic) { - org.meteoinfo.geometry.graphic.Transform transform = graphic.getTransform(); - if (transform != null && transform.isValid()) { - GeoTransform geoTransform = (GeoTransform) transform; - GraphicProjectionUtil.projectClipGraphic(graphic, geoTransform.getSourceProj(), - geoTransform.getTargetProj()); - } + graphic.doTransform(); this.graphics.add(index, graphic); Extent ex = this.graphics.getExtent(); if (!ex.is3D()) { diff --git a/meteoinfo-geometry/src/main/java/org/meteoinfo/geometry/graphic/Line2DGraphic.java b/meteoinfo-geometry/src/main/java/org/meteoinfo/geometry/graphic/Line2DGraphic.java index d7786177..55845bea 100644 --- a/meteoinfo-geometry/src/main/java/org/meteoinfo/geometry/graphic/Line2DGraphic.java +++ b/meteoinfo-geometry/src/main/java/org/meteoinfo/geometry/graphic/Line2DGraphic.java @@ -116,6 +116,33 @@ public class Line2DGraphic extends Graphic { this.legend = cbc; } + protected void updateShapeLegend(List cbs) { + List points = new ArrayList<>(); + IndexIterator xIter = this.xData.getIndexIterator(); + IndexIterator yIter = this.yData.getIndexIterator(); + ColorBreakCollection cbc = new ColorBreakCollection(); + ColorBreak cb; + double x, y, c; + int i = 0; + while (xIter.hasNext()) { + x = xIter.getDoubleNext(); + y = yIter.getDoubleNext(); + cb = cbs.get(i); + if (Double.isNaN(x) || Double.isNaN(y)) { + continue; + } + points.add(new PointD(x, y)); + cbc.add(cb); + i += 1; + } + if (this.shape == null) { + this.shape = new PolylineShape(); + } + this.shape.setPoints(points); + + this.legend = cbc; + } + /** * Return plot as curve line or not * @return Curve line or not diff --git a/meteoinfo-lab/milconfig.xml b/meteoinfo-lab/milconfig.xml index 5bed7b25..f273a89f 100644 --- a/meteoinfo-lab/milconfig.xml +++ b/meteoinfo-lab/milconfig.xml @@ -1,30 +1,32 @@ - - - - + - - - - - - + + + + + + + + + - + + - + + @@ -32,5 +34,5 @@
- + diff --git a/meteoinfo-lab/pylib/mipylib/geolib/__init__$py.class b/meteoinfo-lab/pylib/mipylib/geolib/__init__$py.class index 4cf9fd820471a6ae583f09ae9191e20117324684..32efd12c2d42a09c45e62557cbb9322c1ef03fb3 100644 GIT binary patch delta 1096 zcmZ`&NmCO+6#hDsFr7)%FcJ(P0xk%I5CK6&78P6u0RaKQZDa`n4Ge^!f|kMkYO2e! zEWLX1U?G$tC8a;Wt0%qqGrWnf0ZR^Wc>T8Tef{RWo>!SaGPQ4iK7R#Jf#(VBrCk|} zP9@$AmpR5p!y$_!ok1mIIyM^N*vY_S)`S(Y!ZRFR20NvOIChCLmXnpmpj**!aAGDl zVvPp}t!OCNKBFQ>46q>2#U3YiBTu|$rQQPU)sT&SL~fe>k%(z>91uTQ13!o&4R#cZ z0$ZKSk5cIb7<`EqUyh0(gUd9-p;&(`7Bx*b$|d3uD#Tk`WBy@ONvE1vhs{X;RBV)i z8EzcKF(=W~h!tBQuSK2gqh17*+VqnQN>Oo-8wF_8a0*RgR;k>6&W$rT>x6-3x>4L&uFa1AjcqhNps-{Kr%M)bUQxcFt+mvzw=0UWKt5wix(6wAEu!ZmA?3BS_w{-Y zX+|;o0(xXilyIUCm)FzzL@v`A%P{)%D@(YRgqcF9B!$s6GAC~0);d~W#nO6pBZbLT zI*LRwCG%oVE1aC3XKNq+gh;DlTcIamS79(!s)ta>UNcwZqu4YN(_$bFJ1}lYnISLp&#!x&oFlt^lQlTDWC>ClR zZB7iED%LQ#|Bk6B6jxcuvkvPWSc@VCdrcyhFzXnK%g%`z%Q|m|6F!t^@L~gls_W5Y zQr9_3#aDKKZ-!rk6j@Af2EvEJcOo40*a9kC{=^9MW|sLNdA?JH&HKeMu#% zq_dM0`}AaV*i106h!fS=?I4Lgf-C;Keb_IHs$nP)KiDeKtoZW}FeqhPGc_I3a1e*Z zq*9f4)QJWhaUhIF@m|@n@)!-Mrr+otNyh3pjz6%zaGyY{Mq($OU}%!eQ{tU9Qa~?# zsME+l>%?hvNb9^Pw)xmaQD^Jmmk`yUqgy<+HSk` z?Szc(8Eym22Ze?Md=syE#e~bA2494?YZk@x*w_+uZz@ltjI{(^Dn-amV;kLS1k$c3 z*VEYbhZc14T$1}gBu6f3buMWlM~YG`=kw&UmPwYE*gK2bX{w*$4t@P_WNc7>pw5u# z%}%J&;dEqNBQ|X)I|2GBR%Dp|!2AU219ONd${REv-xhSYD2g&mK4VJ03kztQL;DN~ z$aJ*WB>@*9qdV&?+GQy+Nhi)MMN3FrMprK)+~w|?$GJ2vETAW_fOuBRfy+o_*gn9W zA=8%J;RP63IfelYN`m;H`3HxmS+?Q3q*@KjFWRhCMVP4)CZLd=HGj$7{xd@3nWWbi bjNu+(5fQIZg6k37z^F8ua1*zrF^sX_g3!?Q diff --git a/meteoinfo-lab/pylib/mipylib/geolib/__init__.py b/meteoinfo-lab/pylib/mipylib/geolib/__init__.py index b71fed9d..97ea4ee1 100644 --- a/meteoinfo-lab/pylib/mipylib/geolib/__init__.py +++ b/meteoinfo-lab/pylib/mipylib/geolib/__init__.py @@ -1,9 +1,11 @@ +from .crs import * from .migeo import * from .geoutil import * from .topology import * from .geod import * __all__ = [] +__all__ += crs.__all__ __all__ += migeo.__all__ __all__ += geoutil.__all__ __all__ += topology.__all__ diff --git a/meteoinfo-lab/pylib/mipylib/geolib/crs.py b/meteoinfo-lab/pylib/mipylib/geolib/crs.py new file mode 100644 index 00000000..61be1a25 --- /dev/null +++ b/meteoinfo-lab/pylib/mipylib/geolib/crs.py @@ -0,0 +1,763 @@ +from org.meteoinfo.projection import ProjectionInfo +from org.meteoinfo.projection.info import LongLat, Albers, LambertConformalConic, LambertEqualAreaConic, \ + GeostationarySatellite, OrthographicAzimuthal, StereographicAzimuthal +from org.meteoinfo.projection.info import TransverseMercator as JTransverseMercator +from org.meteoinfo.projection.info import Mercator as JMercator +from org.meteoinfo.projection.info import AzimuthEquidistant as JAzimuthEquidistant +from org.meteoinfo.projection.info import EquidistantConic as JEquidistantConic +from org.meteoinfo.projection.info import Hammer as JHammer +from org.meteoinfo.projection.info import LambertAzimuthalEqualArea as JLambertAzimuthalEqualArea +from org.meteoinfo.projection.info import Mollweide as JMollweide +from org.meteoinfo.projection.info import Robinson as JRobinson +from org.meteoinfo.projection.info import Sinusoidal as JSinusoidal +from org.meteoinfo.projection.info import Wagner3 as JWagner3 +from org.meteoinfo.projection.info import Airy as JAiry +from org.meteoinfo.projection.info import Aitoff as JAitoff +from org.meteoinfo.projection.info import August as JAugust +from org.locationtech.proj4j import CRSFactory + + +__all__ = ['AlbersEqualArea','Airy','Aitoff','August','AzimuthalEquidistant','EquidistantConic', + 'Geostationary','Hammer','LambertAzimuthalEqualArea','LambertConformal','LambertEqualArea', + 'Mercator','Mollweide','NorthPolarStereo','Orthographic', + 'PlateCarree','Robinson','Sinusoidal','SouthPolarStereo','Stereographic', + 'TransverseMercator','Wagner3'] + + +crs_factory = CRSFactory() + + +class PlateCarree(LongLat): + + def __init__(self, central_longitude=0.0): + proj4_params = ['+proj=longlat', '+lon_0=' + str(central_longitude)] + crs = crs_factory.createFromParameters('custom', proj4_params) + LongLat.__init__(self, crs) + + +class TransverseMercator(JTransverseMercator): + """ + A Transverse Mercator projection. + """ + + def __init__(self, central_longitude=0.0, central_latitude=0.0, + false_easting=0.0, false_northing=0.0, scale_factor=1.0): + """ + Parameters + ---------- + central_longitude: optional + The true longitude of the central meridian in degrees. + Defaults to 0. + central_latitude: optional + The true latitude of the planar origin in degrees. Defaults to 0. + false_easting: optional + X offset from the planar origin in metres. Defaults to 0. + false_northing: optional + Y offset from the planar origin in metres. Defaults to 0. + scale_factor: optional + Scale factor at the central meridian. Defaults to 1. + """ + proj4_params = ['+proj=tmerc', + '+lon_0=' + str(central_longitude), + '+lat_0=' + str(central_latitude), + '+x_0=' + str(false_easting), + '+y_0=' + str(false_northing), + '+k=' + str(scale_factor)] + crs = crs_factory.createFromParameters('custom', proj4_params) + JTransverseMercator.__init__(self, crs) + + +class Mercator(JMercator): + """ + A Transverse Mercator projection. + """ + + def __init__(self, central_longitude=0.0, latitude_true_scale=None, + false_easting=0.0, false_northing=0.0, scale_factor=1.0): + """ + Parameters + ---------- + central_longitude: optional + The true longitude of the central meridian in degrees. + Defaults to 0. + latitude_true_scale: optional + The latitude where the scale is 1. Defaults to 0 degrees. + false_easting: optional + X offset from the planar origin in metres. Defaults to 0. + false_northing: optional + Y offset from the planar origin in metres. Defaults to 0. + scale_factor: optional + Scale factor at the central meridian. Defaults to 1. + """ + proj4_params = ['+proj=merc', + '+lon_0=' + str(central_longitude), + '+x_0=' + str(false_easting), + '+y_0=' + str(false_northing)] + + # If it's None, we don't pass it to Proj4, in which case its default + # of 0.0 will be used. + if latitude_true_scale is not None: + proj4_params.append('+lat_ts=' + str(latitude_true_scale)) + + if scale_factor is not None: + if latitude_true_scale is not None: + raise ValueError('It does not make sense to provide both ' + '"scale_factor" and "latitude_true_scale". ') + else: + proj4_params.append('+k_0=' + str(scale_factor)) + + crs = crs_factory.createFromParameters('custom', proj4_params) + JMercator.__init__(self, crs) + + +class AlbersEqualArea(Albers): + """ + An Albers Equal Area projection. + + This projection is conic and equal-area. + """ + + def __init__(self, central_longitude=0.0, central_latitude=0.0, + false_easting=0.0, false_northing=0.0, + standard_parallels=(20.0, 50.0)): + """ + Parameters + ---------- + central_longitude: optional + The central longitude. Defaults to 0. + central_latitude: optional + The central latitude. Defaults to 0. + false_easting: optional + X offset from planar origin in metres. Defaults to 0. + false_northing: optional + Y offset from planar origin in metres. Defaults to 0. + standard_parallels: optional + The one or two latitudes of correct scale. Defaults to (20, 50). + """ + proj4_params = ['+proj=' + 'aea', + '+lon_0=' + str(central_longitude), + '+lat_0=' + str(central_latitude), + '+x_0=' + str(false_easting), + '+y_0=' + str(false_northing)] + + if standard_parallels is not None: + try: + proj4_params.append('+lat_1=' + str(standard_parallels[0])) + try: + proj4_params.append('+lat_2=' + str(standard_parallels[1])) + except IndexError: + pass + except TypeError: + proj4_params.append('+lat_1=' + str(standard_parallels)) + + crs = crs_factory.createFromParameters('custom', proj4_params) + Albers.__init__(self, crs) + + +class AzimuthalEquidistant(JAzimuthEquidistant): + """ + An Azimuthal Equidistant projection + + This projection provides accurate angles about and distances through the + central position. Other angles, distances, or areas may be distorted. + """ + + def __init__(self, central_longitude=0.0, central_latitude=0.0, + false_easting=0.0, false_northing=0.0): + """ + Parameters + ---------- + central_longitude: optional + The true longitude of the central meridian in degrees. + Defaults to 0. + central_latitude: optional + The true latitude of the planar origin in degrees. + Defaults to 0. + false_easting: optional + X offset from the planar origin in metres. Defaults to 0. + false_northing: optional + Y offset from the planar origin in metres. Defaults to 0. + """ + proj4_params = ['+proj=' + 'aeqd', + '+lon_0=' + str(central_longitude), + '+lat_0=' + str(central_latitude), + '+x_0=' + str(false_easting), + '+y_0=' + str(false_northing)] + + crs = crs_factory.createFromParameters('custom', proj4_params) + JAzimuthEquidistant.__init__(self, crs) + + +class EquidistantConic(JEquidistantConic): + """ + An Equidistant Conic projection. + + This projection is conic and equidistant, and the scale is true along all + meridians and along one or two specified standard parallels. + """ + + def __init__(self, central_longitude=0.0, central_latitude=0.0, + false_easting=0.0, false_northing=0.0, + standard_parallels=(20.0, 50.0)): + """ + Parameters + ---------- + central_longitude: optional + The central longitude. Defaults to 0. + central_latitude: optional + The true latitude of the planar origin in degrees. Defaults to 0. + false_easting: optional + X offset from planar origin in metres. Defaults to 0. + false_northing: optional + Y offset from planar origin in metres. Defaults to 0. + standard_parallels: optional + The one or two latitudes of correct scale. Defaults to (20, 50). + """ + proj4_params = ['+proj=' + 'eqdc', + '+lon_0=' + str(central_longitude), + '+lat_0=' + str(central_latitude), + '+x_0=' + str(false_easting), + '+y_0=' + str(false_northing)] + + if standard_parallels is not None: + try: + proj4_params.append('+lat_1=', str(standard_parallels[0])) + try: + proj4_params.append('+lat_2=' + str(standard_parallels[1])) + except IndexError: + pass + except TypeError: + proj4_params.append('+lat_1=' + str(standard_parallels)) + + crs = crs_factory.createFromParameters('custom', proj4_params) + JEquidistantConic.__init__(self, crs) + + +class Geostationary(GeostationarySatellite): + """ + A view appropriate for satellites in Geostationary Earth orbit. + + Perspective view looking directly down from above a point on the equator. + + In this projection, the projected coordinates are scanning angles measured + from the satellite looking directly downward, multiplied by the height of + the satellite. + """ + + def __init__(self, central_longitude=0.0, satellite_height=35785831, + false_easting=0, false_northing=0, semi_major_axis=None, + semi_minor_axis=None): + """ + Parameters + ---------- + central_longitude: float, optional + The central longitude. Defaults to 0. + satellite_height: float, optional + The height of the satellite. Defaults to 35785831 metres + (true geostationary orbit). + false_easting: + X offset from planar origin in metres. Defaults to 0. + false_northing: + Y offset from planar origin in metres. Defaults to 0. + semi_major_axis: + Semi-major axis of the ellipsoid, `a`. + semi_minor_axis: + Semi-minor axis of the ellipsoid, `b`. + """ + proj4_params = ['+proj=' + 'geos', + '+lon_0=' + str(central_longitude), + '+h=' + str(satellite_height), + '+x_0=' + str(false_easting), + '+y_0=' + str(false_northing)] + + if semi_major_axis is not None: + proj4_params.append('+a=' + str(semi_major_axis)) + + if semi_minor_axis is not None: + proj4_params.append('+b=' + str(semi_minor_axis)) + + crs = crs_factory.createFromParameters('custom', proj4_params) + GeostationarySatellite.__init__(self, crs) + + +class Hammer(JHammer): + """ + A Hammer projection. + + This projection is a modified `.LambertAzimuthalEqualArea` projection, + similar to `.Aitoff`, and intended to reduce distortion in the outer + meridians compared to `.Mollweide`. There are no standard lines and only + the central point is free of distortion. + + """ + + _handles_ellipses = False + + def __init__(self, central_longitude=0, false_easting=None, + false_northing=None): + """ + Parameters + ---------- + central_longitude: float, optional + The central longitude. Defaults to 0. + false_easting: float, optional + X offset from planar origin in metres. Defaults to 0. + false_northing: float, optional + Y offset from planar origin in metres. Defaults to 0. + + .. note:: + This projection does not handle elliptical globes. + + """ + proj4_params = ['+proj=' + 'hammer', + '+lon_0=' + str(central_longitude)] + + if false_easting is not None: + proj4_params.append('+x_0=' + str(false_easting)) + + if false_northing is not None: + proj4_params.append('+y_0=' + str(false_northing)) + + crs = crs_factory.createFromParameters('custom', proj4_params) + JHammer.__init__(self, crs) + + +class LambertConformal(LambertConformalConic): + """ + A Lambert Conformal conic projection. + """ + + def __init__(self, central_longitude=-96.0, central_latitude=39.0, + false_easting=0.0, false_northing=0.0, + standard_parallels=(33, 45), cutoff=-30): + """ + Parameters + ---------- + central_longitude: optional + The central longitude. Defaults to -96. + central_latitude: optional + The central latitude. Defaults to 39. + false_easting: optional + X offset from planar origin in metres. Defaults to 0. + false_northing: optional + Y offset from planar origin in metres. Defaults to 0. + standard_parallels: optional + Standard parallel latitude(s). Defaults to (33, 45). + cutoff: optional + Latitude of map cutoff. + The map extends to infinity opposite the central pole + so we must cut off the map drawing before then. + A value of 0 will draw half the globe. Defaults to -30. + """ + proj4_params = ['+proj=' + 'lcc', + '+lon_0=' + str(central_longitude), + '+lat_0=' + str(central_latitude), + '+x_0=' + str(false_easting), + '+y_0=' + str(false_northing)] + + n_parallels = len(standard_parallels) + + if not 1 <= n_parallels <= 2: + raise ValueError('1 or 2 standard parallels must be specified. ' + 'Got {} ({})'.format(n_parallels, standard_parallels)) + + proj4_params.append('+lat_1=' + str(standard_parallels[0])) + if n_parallels == 2: + proj4_params.append('+lat_2=' + str(standard_parallels[1])) + + crs = crs_factory.createFromParameters('custom', proj4_params) + LambertConformalConic.__init__(self, crs, cutoff) + + +class LambertAzimuthalEqualArea(JLambertAzimuthalEqualArea): + """ + A Lambert Azimuthal Equal-Area projection. + """ + + def __init__(self, central_longitude=0.0, central_latitude=0.0, + false_easting=0.0, false_northing=0.0): + """ + Parameters + ---------- + central_longitude: optional + The central longitude. Defaults to 0. + central_latitude: optional + The central latitude. Defaults to 0. + false_easting: optional + X offset from planar origin in metres. Defaults to 0. + false_northing: optional + Y offset from planar origin in metres. Defaults to 0. + """ + proj4_params = ['+proj=' + 'laea', + '+lon_0=' + str(central_longitude), + '+lat_0=' + str(central_latitude), + '+x_0=' + str(false_easting), + '+y_0=' + str(false_northing)] + + crs = crs_factory.createFromParameters('custom', proj4_params) + JLambertAzimuthalEqualArea.__init__(self, crs) + + +class LambertEqualArea(LambertEqualAreaConic): + """ + A Lambert Equal-Area Conic projection. + """ + + def __init__(self, central_longitude=0.0, central_latitude=0.0, + false_easting=0.0, false_northing=0.0): + """ + Parameters + ---------- + central_longitude: optional + The central longitude. Defaults to 0. + central_latitude: optional + The central latitude. Defaults to 0. + false_easting: optional + X offset from planar origin in metres. Defaults to 0. + false_northing: optional + Y offset from planar origin in metres. Defaults to 0. + """ + proj4_params = ['+proj=' + 'leac', + '+lon_0=' + str(central_longitude), + '+lat_0=' + str(central_latitude), + '+x_0=' + str(false_easting), + '+y_0=' + str(false_northing)] + + crs = crs_factory.createFromParameters('custom', proj4_params) + LambertEqualAreaConic.__init__(self, crs) + + +class Mollweide(JMollweide): + """ + A Mollweide projection. + + This projection is pseudocylindrical, and equal area. Parallels are + unequally-spaced straight lines, while meridians are elliptical arcs up to + semicircles on the edges. Poles are points. + + It is commonly used for world maps, or interrupted with several central + meridians. + + """ + + _handles_ellipses = False + + def __init__(self, central_longitude=0, + false_easting=None, false_northing=None): + """ + Parameters + ---------- + central_longitude: float, optional + The central longitude. Defaults to 0. + false_easting: float, optional + X offset from planar origin in metres. Defaults to 0. + false_northing: float, optional + Y offset from planar origin in metres. Defaults to 0. + + .. note:: + This projection does not handle elliptical globes. + + """ + proj4_params = ['+proj=' + 'moll', + '+lon_0=' + str(central_longitude)] + + if false_easting is not None: + proj4_params.append('+x_0=' + str(false_easting)) + + if false_northing is not None: + proj4_params.append('+y_0=' + str(false_northing)) + + crs = crs_factory.createFromParameters('custom', proj4_params) + JMollweide.__init__(self, crs) + + +class Orthographic(OrthographicAzimuthal): + """ + Am orthographic azimuthal projection. + """ + + _handles_ellipses = False + + def __init__(self, central_longitude=0.0, central_latitude=0.0): + """ + Parameters + ---------- + central_longitude: optional + The central longitude. Defaults to 0. + central_latitude: optional + The central latitude. Defaults to 0. + """ + proj4_params = ['+proj=' + 'ortho', + '+lon_0=' + str(central_longitude), + '+lat_0=' + str(central_latitude)] + + crs = crs_factory.createFromParameters('custom', proj4_params) + OrthographicAzimuthal.__init__(self, crs) + + +class Robinson(JRobinson): + """ + A Robinson projection. + + This projection is pseudocylindrical, and a compromise that is neither + equal-area nor conformal. Parallels are unequally-spaced straight lines, + and meridians are curved lines of no particular form. + + It is commonly used for "visually-appealing" world maps. + + """ + + _handles_ellipses = False + + def __init__(self, central_longitude=0, + false_easting=None, false_northing=None): + """ + Parameters + ---------- + central_longitude: float, optional + The central longitude. Defaults to 0. + false_easting: float, optional + X offset from planar origin in metres. Defaults to 0. + false_northing: float, optional + Y offset from planar origin in metres. Defaults to 0. + + .. note:: + This projection does not handle elliptical globes. + + """ + proj4_params = ['+proj=' + 'robin', + '+lon_0=' + str(central_longitude)] + + if false_easting is not None: + proj4_params.append('+x_0=' + str(false_easting)) + + if false_northing is not None: + proj4_params.append('+y_0=' + str(false_northing)) + + crs = crs_factory.createFromParameters('custom', proj4_params) + JRobinson.__init__(self, crs) + + +class Sinusoidal(JSinusoidal): + """ + A Sinusoidal projection. + + This projection is equal-area. + + """ + + def __init__(self, central_longitude=0.0, false_easting=0.0, + false_northing=0.0): + """ + Parameters + ---------- + central_longitude: optional + The central longitude. Defaults to 0. + false_easting: optional + X offset from planar origin in metres. Defaults to 0. + false_northing: optional + Y offset from planar origin in metres. Defaults to 0. + + """ + proj4_params = ['+proj=' + 'sinu', + '+lon_0=' + str(central_longitude), + '+x_0=' + str(false_easting), + '+y_0=' + str(false_northing)] + + crs = crs_factory.createFromParameters('custom', proj4_params) + JSinusoidal.__init__(self, crs) + + +class Stereographic(StereographicAzimuthal): + """ + A stereographic azimuthal projection. + """ + + _wrappable = True + + def __init__(self, central_latitude=0.0, central_longitude=0.0, + false_easting=0.0, false_northing=0.0, + true_scale_latitude=None, scale_factor=None, cutoff=0): + proj4_params = ['+proj=' + 'stere', + '+lat_0=' + str(central_latitude), + '+lon_0=' + str(central_longitude), + '+x_0=' + str(false_easting), + '+y_0=' + str(false_northing)] + + if true_scale_latitude is not None: + if central_latitude not in (-90., 90.): + warnings.warn('"true_scale_latitude" parameter is only used ' + 'for polar stereographic projections. Consider ' + 'the use of "scale_factor" instead.', + stacklevel=2) + proj4_params.append('+lat_ts=' + str(true_scale_latitude)) + + if scale_factor is not None: + if true_scale_latitude is not None: + raise ValueError('It does not make sense to provide both ' + '"scale_factor" and "true_scale_latitude". ' + 'Ignoring "scale_factor".') + else: + proj4_params.append('+k_0=' + str(scale_factor)) + + crs = crs_factory.createFromParameters('custom', proj4_params) + StereographicAzimuthal.__init__(self, crs, cutoff) + + +class NorthPolarStereo(Stereographic): + def __init__(self, central_longitude=0.0, true_scale_latitude=None, cutoff=0): + Stereographic.__init__(self, + central_latitude=90, + central_longitude=central_longitude, + true_scale_latitude=true_scale_latitude, # None is +90 + cutoff=cutoff) + + +class SouthPolarStereo(Stereographic): + def __init__(self, central_longitude=0.0, true_scale_latitude=None, cutoff=0): + Stereographic.__init__(self, + central_latitude=-90, + central_longitude=central_longitude, + true_scale_latitude=true_scale_latitude, # None is -90 + cutoff=cutoff) + + +class Wagner3(JWagner3): + """ + A Wagner 3 projection. + """ + + def __init__(self, central_longitude=0.0, latitude_true_scale=None, + false_easting=0.0, false_northing=0.0): + """ + Parameters + ---------- + central_longitude: optional + The true longitude of the central meridian in degrees. + Defaults to 0. + latitude_true_scale: optional + The latitude where the scale is 1. Defaults to 0 degrees. + false_easting: optional + X offset from the planar origin in metres. Defaults to 0. + false_northing: optional + Y offset from the planar origin in metres. Defaults to 0. + """ + proj4_params = ['+proj=wag3', + '+lon_0=' + str(central_longitude), + '+x_0=' + str(false_easting), + '+y_0=' + str(false_northing)] + + # If it's None, we don't pass it to Proj4, in which case its default + # of 0.0 will be used. + if latitude_true_scale is not None: + proj4_params.append('+lat_ts=' + str(latitude_true_scale)) + + crs = crs_factory.createFromParameters('custom', proj4_params) + JWagner3.__init__(self, crs) + + +class Airy(JAiry): + """ + An Airy projection. + """ + + def __init__(self, central_longitude=0.0, central_latitude=0.0, + false_easting=0.0, false_northing=0.0): + """ + Parameters + ---------- + central_longitude: optional + The central longitude. Defaults to 0. + central_latitude: optional + The central latitude. Defaults to 0. + false_easting: optional + X offset from planar origin in metres. Defaults to 0. + false_northing: optional + Y offset from planar origin in metres. Defaults to 0. + """ + proj4_params = ['+proj=' + 'airy', + '+lat_0=' + str(central_latitude), + '+lon_0=' + str(central_longitude), + '+x_0=' + str(false_easting), + '+y_0=' + str(false_northing)] + + crs = crs_factory.createFromParameters('custom', proj4_params) + JAiry.__init__(self, crs) + + +class Aitoff(JAitoff): + """ + An Aitoff projection. + + This projection is a modified azimuthal equidistant projection, balancing + shape and scale distortion. There are no standard lines and only the + central point is free of distortion. + + """ + + _handles_ellipses = False + + def __init__(self, central_longitude=0, false_easting=None, + false_northing=None): + """ + Parameters + ---------- + central_longitude: float, optional + The central longitude. Defaults to 0. + false_easting: float, optional + X offset from planar origin in metres. Defaults to 0. + false_northing: float, optional + Y offset from planar origin in metres. Defaults to 0. + + .. note:: + This projection does not handle elliptical globes. + + """ + proj4_params = ['+proj=' + 'aitoff', + '+lon_0=' + str(central_longitude)] + + if false_easting is not None: + proj4_params.append('+x_0=' + str(false_easting)) + + if false_northing is not None: + proj4_params.append('+y_0=' + str(false_northing)) + + crs = crs_factory.createFromParameters('custom', proj4_params) + JAitoff.__init__(self, crs) + + +class August(JAugust): + """ + An August projection. + + """ + + _handles_ellipses = False + + def __init__(self, central_longitude=0, false_easting=None, + false_northing=None): + """ + Parameters + ---------- + central_longitude: float, optional + The central longitude. Defaults to 0. + false_easting: float, optional + X offset from planar origin in metres. Defaults to 0. + false_northing: float, optional + Y offset from planar origin in metres. Defaults to 0. + + .. note:: + This projection does not handle elliptical globes. + + """ + proj4_params = ['+proj=' + 'august', + '+lon_0=' + str(central_longitude)] + + if false_easting is not None: + proj4_params.append('+x_0=' + str(false_easting)) + + if false_northing is not None: + proj4_params.append('+y_0=' + str(false_northing)) + + crs = crs_factory.createFromParameters('custom', proj4_params) + JAugust.__init__(self, crs) diff --git a/meteoinfo-lab/pylib/mipylib/plotlib/_axes$py.class b/meteoinfo-lab/pylib/mipylib/plotlib/_axes$py.class index 78f6f8457f3f57b10077c88529a165a2cdfe6015..e0e0c770cfcb1ad6916b49de807f89f3bd2a1110 100644 GIT binary patch delta 60229 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

M?cOr-7COduEy?Fhyd@^kgg1c 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 *@;7s;qWQ_VXXO&i3rR7~CkA${lJQClWGb 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

  • %&o`Q&rTEpKzd&N|8baJ+nwiVrEel^~m|uSz2xn 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 delta 61238 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 VjESB#U{YDKj5lhn0jHOh|3A}7AzJ_d diff --git a/meteoinfo-lab/pylib/mipylib/plotlib/_axes.py b/meteoinfo-lab/pylib/mipylib/plotlib/_axes.py index 2e7a4c91..7d81996c 100644 --- a/meteoinfo-lab/pylib/mipylib/plotlib/_axes.py +++ b/meteoinfo-lab/pylib/mipylib/plotlib/_axes.py @@ -2316,10 +2316,6 @@ class Axes(object): :returns: (*contour graphics*) Contour graphics created from array data. """ n = len(args) - ls = kwargs.pop('symbolspec', None) - cmap = plotutil.getcolormap(**kwargs) - fill_value = kwargs.pop('fill_value', -9999.0) - xaxistype = None if n <= 2: a = args[0] if isinstance(a, DimArray): @@ -2337,20 +2333,9 @@ class Axes(object): vmin = kwargs.pop('vmin', a.min()) vmax = kwargs.pop('vmax', a.max()) - if ls is None: - if len(args) > 0: - level_arg = args[0] - if isinstance(level_arg, int): - cn = level_arg - ls = LegendManage.createLegendScheme(vmin, vmax, cn, cmap) - else: - if isinstance(level_arg, NDArray): - level_arg = level_arg.aslist() - ls = LegendManage.createLegendScheme(vmin, vmax, level_arg, cmap) - else: - ls = LegendManage.createLegendScheme(vmin, vmax, cmap) - ls = ls.convertTo(ShapeTypes.POLYLINE) - plotutil.setlegendscheme(ls, **kwargs) + ls = plotutil.getlegendscheme(args, vmin, vmax, **kwargs) + ls = ls.convertTo(ShapeTypes.POLYLINE) + plotutil.setlegendscheme(ls, **kwargs) # norm = kwargs.pop('norm', colors.Normalize(vmin, vmax)) # ls.setNormalize(norm._norm) @@ -2361,10 +2346,6 @@ class Axes(object): a, x, y = np.griddata((x, y), a, **griddata_props) graphics = GraphicFactory.createContourLines(x.asarray(), y.asarray(), a.asarray(), ls, smooth) - if not xaxistype is None: - self.set_xaxis_type(xaxistype) - self._axes.updateDrawExtent() - antialias = kwargs.pop('antialias', None) if antialias is not None: graphics.setAntiAlias(antialias) @@ -2483,31 +2464,13 @@ class Axes(object): vmin = kwargs.pop('vmin', a.min()) vmax = kwargs.pop('vmax', a.max()) - extend = ExtendType.valueOf(kwargs.pop('extend', 'neither').upper()) - if ls is None: - if len(args) > 0: - level_arg = args[0] - if isinstance(level_arg, int): - cn = level_arg - ls = LegendManage.createLegendScheme(vmin, vmax, cn, cmap, extend) - else: - if isinstance(level_arg, NDArray): - level_arg = level_arg.aslist() - ls = LegendManage.createLegendScheme(level_arg, cmap, extend) - else: - ls = LegendManage.createLegendScheme(vmin, vmax, cmap, extend) + if not kwargs.has_key('extend'): + kwargs['extend'] = 'neither' + ls = plotutil.getlegendscheme(args, vmin, vmax, **kwargs) ls = ls.convertTo(ShapeTypes.POLYGON) - if 'edgecolor' not in kwargs.keys(): + if not kwargs.has_key('edgecolor'): kwargs['edgecolor'] = None plotutil.setlegendscheme(ls, **kwargs) - extendfrac = kwargs.pop('extendfrac', None) - if extendfrac is not None: - if extendfrac == 'auto': - efrac = ExtendFraction.AUTO - else: - efrac = ExtendFraction.LENGTH - efrac.fraction = extendfrac - ls.setExtendFraction(efrac) # norm = kwargs.pop('norm', colors.Normalize(vmin, vmax)) # ls.setNormalize(norm._norm) # ls.setColorMap(cmap) diff --git a/meteoinfo-lab/pylib/mipylib/plotlib/_axes3dgl$py.class b/meteoinfo-lab/pylib/mipylib/plotlib/_axes3dgl$py.class index b3b1d64100c5d0380f32491540bbeaeee320e05f..eb917a4ac4960648afb1cc64a8f1ee988fca04aa 100644 GIT binary patch delta 27352 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 Z5C%7oGPdBObyUtb?ltbGN)0|U{U37llJNil delta 27477 zcmc(H2Vhji*8iQoZIf(ZH#Z3hffN#I2)%>SMG!)Xf)oi$5+IOdLlUaOf>=RBSaIwq zh@hYXfq)MMRK&(ZY|n<+5ETpd7Rvv3X0~M`uY7;s_r1q)=FXfsbLPxBXU>^>H|q}> zr=B;WUq1J@eTt%VGM?NXT|A&mR8@t$ta6&CqSUUw#FXgr3eU`|Me-glW2 zRp2R`TU1eXxyP=)4-%tB4j(^cWUgKPfGI|CSyfR*xn2E`DcZCWca>fJ7=)^d=2y+B zC@OWM=Tr2QdCH3H>Ss(*^NY(I>gUSwXk~@^1yl6OlHvk%onlICWl_~7?t-GBeu`f^ z)OVO682`39;S$4^^1Va-PBQyrfLZ_WpR2oFns4j<8yKoA^?0gg*wsIn;sE1So;ekH za*i_&^;bFkT&PbH(3I+Iql$e5wB6n5M&{FqwaL^VF(~GKxRJhA$6c^;$wRRwnhP)Z>a&&jV6BzU(cXDX0 zCFL$)hgMesYW;ILf>Ck$}uHLk>=qj*l7gcw@dae2Rm}i{g?8;SY;tOPc|~K{CUG4Kso1E}LEgsg+2n^_Nd&B#;6(b(G7FJo!}N z&7v$0CQePr)Y3Rg{Q)sE1R|3VAk%E@)_=Y zF?Nm7_sP5He|Lx4iP9au#YK(Up^-ti@1^}NUWg^!k1fQyM|oiVd7|Y3hqg@exxV_j zqOWaf8y(t1vSAZb8i;);cUM#u7nBr%)FahLW;E40Y&GD+#Q#9LjJ%h&4GiR><}ML* zcc7!7q`2I!?PSVy-_sp?`Ytc+np@y^uJ123!W3N{Z$dm7wi8(5P@P$S-hL!l0+ywda}Q!n()! z^sy&jyW{xytU(y z+FTe!zBmH3kEB6Q%O_PWsdQ+cD8EH3n)azfSugqd%$Mz{$ogFSf|TJ)2of^tKfkE5 z^PsG*oxxRpexauzKi{r>?R&bWbJ34t9;^+ z-yE9suo}E?j2rZ-7L*rdb?xTR&d7PsLP(**DXVLDhjw1{=!!%8O4e+?>hc~;_kCTS z;ZL4kC!Aq!0(24(A(P1XY|N9h#o#&`mipoUbDv0?wyB%Iem^p{F;NJt^VK>DJMq zHe9i=(pq=k$x_Nb%itVgLE2H1sB>_dxFD#zx(A$cmK+nMf7Zz1` zz;=6IOjXL@uB5}o?!rQc-d&>fphc3_=)H`7(#J5GCG3w0lryP zyW+x4o7P51K&8Or08P1ewD9y?&IEk zeF_nFI}|3#71;IhScAJ_I#vk}YRsA^>+ql2G@Q|P9gb5iEH1U{aGN&wLc0!!X@kSn z;VrcpbQI_n5KMV-RRK1;3N#iq}59u_j{bj|o=U^z@sC~LT6ESu<$d^n-VuyDg!zAQd=45tpS7c3*Fu-w_U#-^#z4)s@{R>LRr0&yz87Q&%EM7(pmUbeOiHM z>P)*1->MhMDx7Q7RCmQx9DuVh-2=oM%Jty3fC4K0AuOr5vVc6BU4IyBnPb;CqnK;g z9|f|v0E)jA&&78AaTN3HI-IJl3_{(3ayrarCuWmjo?e5dX&A5vO;gEQ?fTzn-9?_# zqN)n4>M5{8+~4LoVh3I)tap$7b5~XQBEO(BymlA)$Vdi~)fRLOu~A>W44~ zZG1<&{vxW=MJ%Jg42lcs6w(jV#DNe-KLXwd+V!J^DUM_Pb+J7jv72`NP4r)G*Z+ad zCYSGqvb=+)X> zn8sp!Cl`*j#~KZy4TsUtH|Xj?c9#(c8#FB6ZCB^BM!xT^F0dyXjiZeuBgHrI8jm*( zCxK!k5*ZGqTGlchEML}|J6NHtwREsjS!?ZJb7d{t!4}C{j)UDGYwaCurL1*yunn@- z*}=BTT2}|#C2QRsY#(Y~Ox)AKUXYEw9qg#AUF2Zz%35Cs`$*RMJJ^@9HqgPoleNJP z_PeYNao7}D8|tt{$=YQOn^V?CIBdzXHqv2hD{G@2w((wB&2!kM$l4VSTd}N-bJ*6( z+IWZUoUBcBsFP*wDu+5p*7A{7$(kEEl&lpXWs$Waq$;vD9a)F06(f_7wOL-o^s-ut zKwZ{62&`poHsWYm!_nPW*5)A4m9=?@aAj=)qE=bE8d0RIQNSo`m}8l&Ek!IQYs(Oj zP|Z8mxE{fSY`hUCudLmS^IXhLe_jZJY{XILvJi=9LJ-q z-Gzfu*6zVMC2RNLyip9Hdh2|bdDGZ~zFFQpE$641itkzPeQb+w%911vj?40GZ)G(x z4LC1r;_#X7x$gEQh^^a?oJy%}Z`0V}+p=U_>=g<#)++-PoH6=@>V``bm={42&e|lT zkFrFJBAyYOP)YfmD3Ml)5{I`ak=KY4NsK6wu!s^FhA5F(h!UxSC=s}e5)ry65dl-_ zrN~z_AovrdpCJlx#Iv6v3YNq(f+JBP6rz%jVNoJ35hbD!Q6lOPrJrFs`o%L2aFmxQ zaBGT9QJJx`y7{uL+VGQmv{Svb?6{T5T8)y#dTBXqkD8qAG8fh;h=`RHx#+7=9?Z#C z^Yh}?=Iqc_|A@7bBkuM!y(vi>gKl5Xo6^}X--MgyG+d}C=G~YRt^~WVv-bR+SSssL#W+@sE5N*y+X8FA4}^M!o4_% zdpaCfq7JmQ{vp)CLDVz#QO8)?r6JVZ0ID%2gqq>sTy31CT@k_^AH;S0_TQG8JjK!` zg?gt3d#|P5?sF`yDAYSW*!vjf(MfOjDmRa(%6K(io4d!hGjF^Wug&+xug>r;v9xPK zW3LU4t*?LD21~m>gnCZ^)r<};C$O5$miBN6_0b?|Y9#829oi8~dn|+-v;fl+iMvDl z(9%K{pndEoTce%W27_kCE+1QSbKWb8qQ0dlT4%rjz}T015N|ZD2g!# z;09a^cnpBCW;7rb;DM>)tQV&G!J6_YR^!XPw>R5Wz5HH_v7NsA@4LQ14d#VMKckG& z8)N#8_oty_^!+UocA>)n0Y$k9aXo?pBICQ|{(j-nzI>OwvE*x_cFgF7e0fb;J`hoVgc;X{g!O`=GUaMSbt5r6Fn-S~tF#5su z1HmR1}qoV%B!(sEX=Fp243Zqy@P#(02Fjs97a@`b;*#($gfr$u6V5*xR zN+Yo*De8Hpzk>VBu_pd&Y}FNJDl1xKK*EPMW526UZXT*ZIXXO+3DTE8b|adOJ+_%8 z(&&b?DGy;&M#z5{boUdz!Tvv?TZpGbTq=MUz(#+}2x7r}3i{gtfhO(|8Ot zJ~*$mQ;Z-ZzWb{aGq!>k(|AHxl=I4vuucr2M$GqCbpbf)x$~=rE~0pc(&P;5r=L~c z0a0JqgPClrZ~VcW-dhoxte|ax_Dri~F=v#8rm-E5vQn!ouT}0luiU60{|`t4bI=sk z&m63TMO1e^WOq!ZIi6FJ&N2=bwx3sSsXL&W7)`I+ww>Bm*KGq{t#VDRGWfhQuWrv1 zzICsIU0OFWd|p`=)-R<&t@&ZCa%r{fhFaxCuxq~2o7f%r=CiS_h~1S+;#u2h$?oAg z!wf$g43qxY$hYtH208!H#6IsQ$!u5kU7w7k3BUYwMMJTx+my5mPUyS+#}5DDB;Wto zDlW)Y^Y~h2bXGi;nf=p^EOw`&L`{T`!rh^La`pb7x0s0!AiOvT=bEk8C{M=itx@*1 zwbYk=8_qUk&-)IY&7OFOI-M4JbF-Ze6zGPp{f7ulUZ75u8f~}HP>E5ayf$u=qJr{E zVla)$&9?1gV{*th+YFL(OQnHtt9`%)<@7g`+J=NFY^4|a%q!W@%gL#sSV<`rHD#%bgL}X6z*BY=E zHuW>!e+p~0*2a=}ZZ{TZQ$Oe1o1kGVbMYfnn8T)ixpo~(XJ4&7z*5-P{I!Oxu}%Gk zk8Vokw|umlrP$Qdydz^x*>@ZpoXNiDhnuoaHuZ-)Qdu*b`XfK!WLMhMpZH?&{4>AU zMbE$bI-bbpM{F#H{pOqfb~A$w0%O1XI=%pkfABPwWhK=LG1}!GL_zw8h4jzxQE@ES zrk>*u#L*Pz`Ku}>R;alXUz`qJY_fhNoyE7qK4B+uKw}G!iQS6pP@_C=smJkvJ;VM| zXeMZD8eg2l(woHu8=xQd?6_w!fb<~PZ19gKFpKBLFo*ZcY?o$=Nn(gqOZ^C9&dIM~ zYglfbL0AbmA+@Mc{-{w-+@);6(5TQ*ict&^qgd)EAc7dhQcsAAZmB1!vRklF8Ef5ZkN{t#eWAR+hzA zMzi$z7D7f+auC}XthgnACYq&mf%Ed)sil5X*A@v0y*V|uTYG8A+6(7j5!R`-_PusA zop*>~(X0(0F@UA%L@!&=V{Q5D0jx1H9xeON#^(4so=xXRFgCuOm^nf0CU_c+A?^9s zF))-4{OACd+<_YE&^RpT?dbE)?Drv>=Yu(g5jz3_vqL7N7;7C7_kRY>l!FARExuU*@1}2WSuI z;4eGE$>Gky?<=SJedQ&Pc3%iqCUS6cTE7}4%I~G2toL2c+J(F&?no4^9|+;fLK2D{ zD+$FshM}VbAxiUz&}j0OE!i01ENxmIA3d10;u#HD(%LdOP3;Q4e+vAdHWt1z&8A%m zXW7`MjVEuJ!X}WjOkoqHuhb@yuWVw|t|DjI%%)8yZ`qmU!&zpsDda21GdH=)Og5D~ z<#<*YaFo$DttjXzwQ0grYSYP6W+rPhgib}eO0Agu;7B%$JY^;;k&d!7%u#wmjxx4f z(C|A-zQTgzpB?fbmE=LPcv%L_riw4ffOD9``^G~sbIFZl@zc~ZkN-hE^Z5blSwOxd ziXt`@GR$u*dZydBbecr@Ah&yswY9kg8(Jv;J!jI@$U;2|t4Ky#c z$4N(YmVcKBne|I#fz(}CbOoAYe1o%ySiPtoYTp0IcsSKCo&xzAbyu~2ajzG0-X1r#*&9)-FMWX;deQA zih+<+}>RN0{KN#OA9-9Kb zujH*$Sa!!kv=jlR0j2|H0Ez*#040D@fCo?xm<_1p*Qc<~-leE616&8V5r7mzyBV+? zfUsCw3Ahz-8(=kH4Z!CwZ%4Tna0dXHrznwq(uJ$^2r*wvj}Uzoq`CuV4WM2Od5o9CJjN^1V;q(q zt!!fxLsyKTeXw2<2-{*^do7o9}9zR`iT%|Loz|zjk%kY*4fTDy7@ee0iW`1&0)oaQqPJ{ zgsk{8L86WopX3=W!1L$)q86-4;>kJ${3iSb_q1S%O(}=CSxLBn$*ym~vi^FLRlZev z!$LOkl$K!f3EsUWOm;6?o&r1#z=vhpe!v01vw-IS2LXowF92Qyyv%(VR{A!o?*MSk zqP+)rAMgR-IN&1yE?Bfr0H6BH6DU6eoCJLCFTa49;$?_5)98jUQv;dZyV!xBAUS!F zN@n^qf2}Lh9PJlrdB5`8IShfADecDPbp?8F=p^^ zILk-3X3g0-p4^=cwQ1*J%uV=`?o4aSXdkilPpW$qBo?3NW(P;4ID- zMp}A5AUSwiHfzFS`4dxFx;_If4Y)g-B_hag&=xT$5+Q>>p3NE|&L72#kTKXto(J% z2K^2@@cD`y*3?TErrFL|I=n8JTj{u`0#bNxRSa^tX$TDcw{t5E$)z}6n}a|`jlx^D z!~SRbp7C&(%XsNU;+mBs8ep^9}t;&i9AQ|AQ0r5px87fl=@g2bcJqCWdCb+d3B<9 zf}d=ipwmm5Y$q=3WTcacv0W&{Nln(f2Iq}PpU!lEIc(?29g$noy~s(WCmhC4ykAGw z$X$ynauw|?0Qm~uODZ}8*Z?X(1Hg;mmQ2y30Js6yV*n07ET93PA;1NQ16Y6rKq4Rs z(3tP($kJFQf2SiG+L9sL@%ty0u3)G#)jf7qD~X$BpT-U*>Djw5-$ zp;KlfZ?3d7eyR&=&P%%>I3LaDcY&JZ@dvuFRCYPv--V?)t_a~~5pH`njyLYga$t}C zoA$#98*i>v)+C6_tYHcXrayOgWsR=56xE@CVSvj3!vVQ~QGn5aJiz6ED*)r*&+#H# z`tyb{QeLqGAeKTQFM5SV@+u;EwPe$ztfos@%@DF;#bM4|pCu(#5-F)tzog2fq&y*C zK06?-Kk?-i(wA3CUtT4AIg*}VyTg0Vlb(8k-%~FPdFreA>K-gHi4vWlp9ne1MSOn` zsLNvhAr)Tf)o;fdm+-XVEFDSMiM!Y^JTK*=d$Nw~THo>)Q*8P&{yt!;q$YY#V6BtQ@fYD( zdXVZpCT$RW3J-Omi#%sg(KiaYBOai8J6Evz;qdJUUO?%a;I>mOn-3F<*ghbQkNEds zpvNO(X6cQ@#hvX6U_L5Z;YsOSijW&y41_HtuuOBSz-!1Kbh5^-&S-y3Ffoj-(X<@C z7C5m_h$iWkbNKTYL&V$oY4oIQm!oMGgqm_8o0MBYW(Uvd3xw(*f<^aD``Stse$CQ4 z@>zXZM(nOI1ku#AAGw?w(Ja`f!$rOu4ZC-|z;)x*7`mJP(iiuOd&F&H-{Y86>JQ#_ zAFE->U^KK5aNsZiI!Zztf%8HB1FgS_qv_^;P_VthOI0Ht2gU^SJ|#v=xrozhSkk`m zCR(pue3oExS0?T-NA+h{vI7*uPoM+m8L>!9oN72z=)j2+hl>BIUPr7Fe$ddE=R#uw z2bKU3$JhjAESzK^04cIQ4KN*m6j?`#tRqF% zO8`ib^)dj`WPLWE0#FI40?Y->11#W=gXjpP$NDV*q{jLx0McW9H2~?cj`Ubx3%CP- zv{=6rfVao`J%D=w_XE}e9t3OvY~;NLvCN)Npt=pP9k2sX4FK=R*A#s>U=QF)z~2CS z0mvM5WDWWOe#aoz8s{ZGUy}a6&UyJZWGFvNApieP=)8Pao&oR4GvIxB1{@1N1CGlx z;6rf+=pr)b9}Px`yQDL-*vIk&_(YzSCuplEl81_h&Pqzd{AXqNu(R@Wc~*WY&&pHs zto$m3>pv^M`8UqWxB2-YtkD$YKKh3M;m@*e#p06CBTCEyg`E5J86EAfGs zlojrP<(nehe(JvqS>t48oC@h{3l~hK$waO^e72aEb=<09#{B(niDv?MEPs%MRYx7;VMD zZshPKBk;zn9W6>ETaaGxZIjWSdkT=K&CEsW`RxcClpX1gG!t*TI#AI$*xi$LmG!^n zvJM@)32L!m|AMJoY~Vm~gTo#?WhC5s&%jHhi6b#pZ{KUbW!j8B{Qi-+?7B#J>$gU- ztTug#dYEjq;gE{l47y$oUg#SAaJVLuLtl$IC<6B1+-kXe)F^g++kt{jB*%E2dLQ{{ zWW*NT!HXJ58NrKaT`%nK3;sp2JsNc;5Xvjy$n7{ad^&C;z)!#O6V zoF*SNhV|kxMNs5(;HL+Ua%|g$X@;DNaalMuK5PuDU?aq#@xd5e@a76a6yk{B3ulHg zlGl#GnK4RS|F9a~DUUTDxxH2yQmYKdX9}16p|r16u0rJuOTe*F%lgzRkDx__$P7|3G`C%^?j$Zo`Qd?nL9IRn*ZfJ{IZpgEu=pfx|0$5Olzm<*{{3F6x@a!L6lB$YN08bq$G04I(7hRB!n00MxVYkkWX3?zLH}%P0@nM%fjxjS7Ct6}TIyvP?n z;+l_1=FuebO$A=|^cl-$#4f1Qw0$g_%dX+8C$fyx;CpCek>Cw!Ku8f5^P>}?2ut{P z6Ir4c2P@Joq_iL7BQA;;YL#nimC0h)dnvTb2ndWafCo?xr~n`!Fc1(Ja{&klj0J#e z0E+;N0ZSk{d=@PC0N3f_bWwlBI&K9+@)J7}-70a5;QaSwcbi{!tHWj277i45LNCH+ zkcErg#8p7xIxKhz(*m>IF6Fy6BwrqsuXwZJm+y2b-@C))JDrn!C%~=1K*QM8iZQXw z%cLU@iT-|pOQOfOu5^_Z=E&(1!&oN}@Y)^9g zX&{s|5K0;dC5`*|*hwt2|0Yy710Dfvf!-|)=$$$qdWRbmTP;KbzMyyXc_!)I--z9~ zcd#jKvvuF>nnrpvwC?5aO=79BPm4}i2GXj=GEUJv;ivwM{7pBmy`FU=FuP$UYY-C(iN5AJQ(1b` zZ)k|6t)N}Aw3T2OU)}7{R__Pfr)4D61l8~8f+EFcd{1`=SxLwkVY1Q;ogwS_k>ZR{UKb&j|D7iTx}%dJ}?rm-HuOzr3dhb zLg3^~Bq|rEcLq^IvCUcEGjGQ8YYSO?>^U0c_eA&5$1zvkQN%8aQzD7o$43^iWXAAP zIn8F;_{Bx6C9XzrEn}+w7tKZscm)&jDIO{XDnfNKM;Ol@Vd zX_|Cjnl=r&WthJr5~#jD>l$_L^Ic?xkw4_l{N_HL~*C=f)fS6V?4kMVWW z5W1h>d#ACMJx`c6tnXV#fZp1?1ncrR~I9$??+aZY7QX2Df_5@nP?8A%f!Yua}fUsV{y}a z7O$JwCBo7ya|n&BYh9PlWX*WDnV1LGm4w^hbu(GIcNii5xlNhFBZ){&e>|wZ!IQ%r z5s4}^-S+n&YS1W55t_!8katxz-$f_V_*Ju5OzOx;3fm#{>^Q_$@WR#nhFPp@%C5W| zydu^1&`XgzUtXA_g!$WWDQ1r5=Vn15V|Yplu7dJ-zY?Tqm-F{aVC{2CVC`eMuLM>; zj_;=8O6uvs#tQ>)UCOdXP9RQ%30NA=iNL!BOT!%!&H;LjVNMLgK^x&T5NDt0okYEU z3qHW_EoH0Y@*|h`EYFBxNtx!9$c}?pcjz81UVEG`EMw`h?m9F#m9aAR6i@W9j-3i4 zDI5}#qliO_DKW=?Yi|}2sxwjCuXZQbFikXAA_RF+t^=Q1%wGK4a@fKE9z7cyJe;>f(RwU8 z#sRJbj0a2rOax2<i=@zJv|lJ1{;w!cL0}c&U;c1{)S!~TJey^C zt7uVVr3BhH%64wPT_LI0#c!@CQgivr71$_|_pFQebqNuS0Vpo5lhGCS^}?6`;V!z=tY z3U>dErJaVh(1XidB-TdH#4#d}h#yU9zcBgJDmEGWDSldI-cTQ_*3#&Uw=97hcO;0q zx<2YTKD&}7rm>PB(%O1RIwPcvVS(SJU=@kvpH1W%rWbGn0AZrJ7G6B`J>PdS!cm^a zQkH-y7E2O?;MVeW^YN+NwcJ^S>!)SD#a|@hlTstG6)>+OOmR{$8^mnktzTIcONGC| zr{4-YtL&sN+eH|LqzRKQ0bC1M2DlCk1iu4R9#&K#@;M-jkOf-f{|?Z+g-=b!%vHW~_cgzmrV&4Z8BITd!GoM+1zK^>YOVyV!X)@rr2ovzL5=n`0h9QA z?)wv)(!1qEG@&ou!}Mi;eWWZ)5B;o7 zZxK|jm-w-{thcwnrMJcsq$cYFgWX@(r!>maFA1WuOZ=#zpGZN}sn{>YybrJrunmBK z+(aO5z6AIhLdAYcq1qlMl^lh9q(8((nVzLbfxQ1C4%Qv@oEo(=eVcB=KJ9VmLcQUi zcm#7=+ROF)w%zvMu$AFTh$Kt=@L{A>09e{ z;1D9WwoKqA@aYR!YOlxYVIgn@7R?CXCsIu^+s6qn%xv{WeE$NLkwx}o(XZ2r=>_u{ zs*>1jMA%eLl|C!~& zzDzJ-?gl&wWx%hK{p7}KBM9K6Mr+K(S6e5+58L6jv5b!(z z>8JSumeVq@aJ3F>jVn=bP*3d^I^y`X{+ToN% zY8?j-pjREZa}g59^NaBb)6Lf~2R>O64Sl>UHWr61BoT(#qcgJpKoflzybp7A#9Z-u zXPQx{mU#6TyvZ@&<+VX(>{S;U(9zXX(Xb>nX=!sqM9`1wT$ zyU#6RM(-GiwU3(Wi2cOREk)G%GjDt? zOX>9st%nQ=$K^5cO<(YRfca~nFZ9MKq}so6&$UQje&@Gb%ksT{5Nf#TT`K&acts$B zKbKicDE{~2@;74O=`0#8on9~P(djrjCy*#5sF%DWSUAHL=)!)*)sl%^+(a&J{;2S2 z%UClna&Ge+et&x>KDH4*EKB$aS5PXVjxXBm)~{?+txr*pDKyTbiXDiXGg?hD0&4&!fd>bj}0(waAfa1oFGS>3&kWx7-oTn?@NQ2*%m8tDK`i#GYo4+ zB-R|4vRq)<{a9X_wlZQ`mWgRCc8yC}BaofpGcSy!dA&=yTcU+ey)2SuOF{D%m$F_W zOAfqp;mdV=s}NjHP-LYLnWcLmGfST>#;j@3@qoByz(r$H+Knh+Y&WAo;|df}mTd`&=(sZcH^$Oe zqHy3%KZ;mOUnQo$-Nja@8d+tNu<6$r&Wxv(vEhpic|yx}7tKyQV4~HahS{+snjPz- z*?lOYEPXACXiMiPFg-?Ldi@?Avz#?cxDQWpf-_4j#2Ihl1GxdqS^I_$qN|BqP*bdg zFIkRnc{d1l&$`&-nqaqS7`wHGGo`Mq!noBj5}a)$ZdC)M!R;m#kl)`>fZIn9X`E@DwNcwJdcYp5iTaFp30A9fBf} z7BOZ8YYl};4Y93GG@R*w8Qa@25!kLq5ym#2z%{L7~hb;z505gDg+pW%IyR@2TP)OUL)jWqMtcLUgtJ#1e2ETAXfz>?E z_umTX(V|>ZvQQmbsRhZRfX0tN0gYcN7WI`&eM=f@W*CR3BNr895R3Z7rFE7=vciV^ zWH=Loi|QW{lnK=itm@xd6u)~FOKC{Uz;4u{aFS*mT*Wd9nM)fW=WiZ1|M~Fw|B~q& zr;3STki-V;k+cXxC27Kq?BYvrW0p7CrQI#LX%XT^vm4I1pfn=6Apt-b*l27fHkx*r z{1@8DOQVst7CQ`INIOjX4Sl7JrX5BREBCvBW%Is>N3i$;3W&(R?_zJYG?#Wtveq(; zwWfyC@&CcvOPC0(y@CR){T*j3@%Abylh(?mcb5~k3Y)OSKU4Srp)6j*v<}Pma~^lC zVT}_>H1L!p8thCA3aI-E-hT}?sJlxaFPUl`##Gn8L<(4)WfZD>BP zjLft?|HP!U!7lx@9FrZ!<3Pjdy5LTc`dq-G-U2)LzJ*TBD9bB61DGUb0+Xan&?3?> zoR=iH29`D)MM%%3_T;+sGm@vaVLXlbXUiDxGRDXuIl&>`YHgg;bjH+O$lJo3dCcxQQ)AE(wXiuu9fq*51W4u!oi3@)%(6!>IY(}ABsJLGsUWiIF|Y`3M>^_ zE0!u^J}ec2A-#fRFu(AZ*s?9c#;$c4k4YKhZ>a}jUTultwCb)q;IX|V;tT5vX$9sb z*A``IH_LgS6Y~lk!Mr5?SW6=h1y$iF;F2jo3;G*P1c?FB+~YD{ksRXh4X9p!YNBoU zXPWb<%Z!#|I)$xjv*Aqs^HtHJo~h?Wg`{8<6kI{V#Br2YI@M^oM(if75xYs9SQRY? zkr#=fp`}rjgH_S`gMpV=Ke-b$##`F6C=x8~Ac{mwJA|T#Y??2Y!?;py%qpRqb_amwik+1}|8-h^}6Ja(P@8iIR z7b!!xFv^h`qTU3V^aw*c7lEc8cA0A>T2JN;Dyhzb zi{dWRf1%MUY*AzW$)d=q%SEk|vc;c}3TVHc9GOc7*0fDky_7Tc2}5oY!7VLnujKZk zFtoHtnt}nnh0EM8kuMHI&Vt=HtgES?3A6tk={HpMOX1=MhuOUdG@+_rL35z0-=Kiq zpGE<@{~iTg^^YiEe-!Em162KIl7l|bWxgccPv0;$`s>c9I$WqPVt!nV{VKfA@4{dZ zOku*aAPUC*jsjeqM`5=NCS-hx%kui8$Iym6uMn@X z@V_WSGw}D>#9xxiz;z#bFHsWqva#bW!`N-uYmDeUhO^BcBVJOAG7^kLKfWbs;oi_< zWA_+MBtd30HBt#-cg)@RG{%;`ZBzSu7?g^-8LpKTz<~2CN&JC0{9!oy3vr4X{1a*C z>5VF${^B0*|JFnomMCB~xgIEp$F2%1-~Uzh^z=*u?tb6z`~7%Sch##`@4b5UUcIWGT=tyt z!*j-lQT;=S^D7${Ro69E1RH}seGt=p6;(A$gVjqaefkil8TG;1`FI@0G`8HQk3g}) zr;kF>;M2#T=;71HF-}!pD$|njUfLL}Z#-RbQOdMLRGnN~VON~Sv?QDBhQ<}u z;BF?L2@1!7N?S{_qh8C>YoZ-M54 zURF^bTvk@Oys?rHZ&Ug?*?zqvNnfrczY8)nlm{CdY3O_K(ugh{`Zm2k;t{>?{g8>? zefnAwwW4B%e0eBIzfbjk1frGK)i%~GsqfHt0OKE9o5p-^?U+|;-8bm7rVqz$^@P?- zQ-wA*C~a&6&80PD15NUYjNnOd2Qo`5>lS zAR{kZRA09UQ~nI7RaBLO*X--#|2u$BdNn7L;$k5X&WJfByLFRfg@U`aJr z$BSqUQ}pRCGcBzg+H9;GtAv{hi^LealJrNF;IBa+w%|Vf^``j~f91JvVmRmr_U_Z) zMtf~#RpSCu>pRxUX}LLjlk`2R^ZOXg?mW+@f7tZsv@|2I9~{lAs;(}R%h;!XVwLpo z-}?*wA7me2f^^XK3tz)B8Wsc>!O{+3ohm*j)db0Bd}n?2r+j{hX{TB{lk=>i;r-j5 zo}{hU4=3o~>pw8fe{OJTu-B5ts_I^&$!r_q^q;I1rM>t+6ZD_09i?BeeN7L{7-|HP zVO6D=)$+>e^>yd^c!9NlR!&w?63>$&@OEHmkz8#)-k~XVcDB){v!k>Ln40Nz)hp)L z)i(He*CgIabt<-%+_0c-nUD8qI-|_uoq9u@y7~&}iTA}6Ry8bH>f`;$Xy#WY@d46k z_&_UAku`WQ25qdXu4-uX@uBcq;8Cvdv2{ye<9s-g4=;K?5_IQQ2g?`w_-HFw(SG>Y zR+bUgF0pblT#eErv{JVWOizGC2A9@VRY1mSAD?9HtjNrolEix{N#IPqiN*lK80#`*dPORi4rGQdKuz3_lrHQCZti)wsgP;VR=7R0b=S zRaL;aIh>@g4wM%l4ET7^YEzptzLIGH#b9Y8?6QVDB!-xeb%3SrUjDo)iO*KU!Y3v) zNObAicumv!wWXdpi!gS>lKOeU@=71CM?9J9NDSyWj|991?>3oi2U^R42=uV;i5S2L=rE5`@R8|&&JV0A+hzmqLV&^W&` z@Y9%^WngL%3AxqB;XHY;emwmJxe&sa#~ z%gO)qFVJf_Z36h0cv>Or;N0*;b?|MgnkueV=;T3Ky)Nw!yEerycN1 z>gjLrIqK;-xB>O_0@kp4dI`%$mw$7p)q}k{{NXu}ABy z!T$JT*6z^rRoE}auW_1178HndP zO;!sEyuEepwfSv3Iw)_qMCoqwE*K=IZO<^4k=hcg#N>S>)^rD}p(WN#lb1@YSq|1a zEwQRiK1X8JhOxYzT4Jp*`C`Hfo#$Yc0LyqryC2M400s0Y)5}Wr&FrKeWxT93GGY8O zldp~_=+937ik72XXY#8esB0Y5#X$AaQ2Ho2fO{m9TXJ+GYS7zEeq)5v9X6$Aez$ei z^%eaSHBDa#xDc>I)3^b!0B>uWkqT%4yrXH}PJj|X1z>Sghc!!wC1l^HC1`P)mcGHd z@3kW9u|t0AwlzNMqu1g@|4bGTA53ELT|G;|@D}afS+Lzr+QyP%9~jtA7VTLU)nX0X z-Q80hXWhL!JunTeE74kx9+qYOzB|o4pPI3Vc9EW&*+5et zDi(2;>D8`8=T+9~-MPLH;h6exEBJb`KY^CqezdKoT7SIt@t*V$UJ0p3Guu0a=kOPg z?LrN$i((&0o9yq++Mez}#!E9xor%VaWN)v#l~Ad5t^PI;E+&LHRFxQVf|}W62K)H( zX7(OhFQHbGZG>3ei@DY3jW)@bQdN|oR=YRS#3B!ilagLe?Z=h$3MuK8l5DJ`S5d8! zG#_IVQnaL3ON2NpxTlC+E4mJ2c_GhrR7b;crPz{Ue`Lz8r^e%{W{srQx@y?RV1WF9 zsgHy)f@q>+2RDRAY-Vo_E?LX&EA}UaC+n}0CVbznA%^OjW0a9fhZv+&Z8*r@NH{*L z&z`J_Fc*w48Y2ubFhmZJ_5*b-8v(qVqG%CPG%dopS>kw!Sj{bx*w_}tq!ry7MU0T5 ziERO~+XyE-+5RL5QEYnP>Gn2jA4=|N#M>pII2v*E9dblcP&E7689=;CA%co+m!^I) zFm1cMn_8t3%I=X=S}H-)L4}m<7{Tw;QF9;lG}#1clC~{lev+N}dBBa}kFyfq&I_%j zx-=}0y+DmqsB5+9YqhqZ_%Jp4X$`c-=|j=vfCUj~Ks@y*Yt|>q<#Nlhr$FgZ!o?)+ zO8c5tqNz`Y#29y^QX+b#IBc$u#hpsH{uCNO`w*z94(el8!Ts4CU_ZJagKR)Yw}J&P9gX?S}=N~8}b4U#)jvd|>6w_wk0 zT+ZjoSSCxrq^VCQR!tU^bKp;~dhO3jP77NvMri)aJL5v8t6~$;@tcs%)c>TMR2m7Y zoYZDl>kQSJ5NUnN)p~l1)~98wpD2gj9}UyYLel?{tP%TpcP&c=dt0dw9Ic~(usKO1 z08?RIXl_UR4E3@d-x=V8A}HBC84gq?2OWr2g%C%&K{b3Plr!nwE>XJJCOKBRXesS> zS8GdYX>(KTZ$(-uEXm~vd#ocQ-AVXqUn(V6QTq=g4rf z$ksUOpQrwgOGve@JJ8X(esBD+7bIQ84n(_rH78J-P24tI5C?@93DdnKW{bm}Shmme z5;geK#hQ^Ull8H7>`iBLs3|j9b$ms&TZ{jmnK>GSuqvVnoh_~#ON3sPh#5pEXRPNn zdb4Ng9B?K#ACcuE_c~ZxVAj;<66eiqwcPiFD=VyHM>@`O6toIMzkWQL940VJFZO4E zTq(8-|10Wy{)l?|e@8vb<{gZ`=^{N(bR57=s#eN0N<49xSV%@8&NNsvYe)O$!(>=l=xr4%X@OjWNetskY^t%-lvN2Mnc*U zd2@Szq|7wlq4hxvWIsjjDC|hwN4Sc_2)SH{9_4^M zGTeVL8af`Jjx_JY1B$e_Ajicaxjp}u+H_Q!IxuJ(Oc-j$Y<@xEJHqm35n4E0*l07? zvYUW#h!EVdK?eG8Kw#yr;P^eE!nGAR;r_VMG31VphpAr+!*@amSf<&Icg^+>EqX}n zkL}`fb@@?tky8pChonMc=gH~s%oGir@1pV(Q6YuP29#-Up_N^XO)7NtGqtv+@>nwe zq^#vQYPWUn807D3*0M3E{6z|2CscAmPv9PYZGjx^9zwKZi};7%TB1k7R~u&mACYKb z9YTdZ%4Ai3WxIOf$qpZForTv=(4X1yV@b|B$VBHzNAr7{1T znp)Fr6oKCft94_>35-UqcH|Y^Ca{b^L0B@K$({vbR58n(`zIiK98z)hW@D1 zy6Mv*W3q8fE3xkUEaNYq@r>abk7Fzj{~P;|`upEBM)!>@^}`vCn&FmZ8oQP3IUJVNLkFw_c!KZms;h__S4;<_Q5-+a=Bw zJQo2j23!KT6mS{fa=;aUD*;#8<<%&!1zZQX95c-{rP2YBB)_(iX_pW^8sfUf}G01g1Y1$+lM1o++>@sGSpdin+ME8sW45x`Nv zzX8AFghc}|01gFpyvP!hp?d*7jp;Zu#S!IanwIz}&Q?&Ha0}+NJ?0cgeb_VL1VZm1 z`ed>KuilYn+PZ6Zx>q}b>Q16AljSDsovE6(&~zfQJs;aY3JFe?wdc3&K3yXf=fnPD zPb#!h(CbDxX&1{K=_*TnIksmp)r3z57;DxqDk1(Cq?p|Xgvao<7y|g{NXk*IZ@=*+jf(Jb{$CE{XN{(Jxf5w-%ZRq;HuN83ophip8!J98VCmK& zk!W0n%5m0(2Tsed84jOhX$5FG**b8bP1<-OC4J&++sx|1lvsYXij++PTRsvN{9Q>Opg+b?D$AcB|FpP=7YtI{VNVHpjaA zP*--Awd+tGD-(qiSW&<^*U*u4VYX5zwB)qcgYu2elAPEfPdMoOk@7>mTwIvT+9o=O z9eRbe`ulFIQcRzS^|X*|hZ~Ld@J}7A z^@j@w_rOz6KrcXVKp((KfPR4ffB}F(fWd&FfMI|UfRUE>hq0kk@$@IaX@Hr4*?>8K zvjAm)a{xg=IRGckdL>{UU_PJ<{t-7x%0Fs9;N%&eQ+ov>p9g`|9S8YGcr<5H9)w6T zVU+By32cHKv z&IeooK%mn@Ukm+;@R0%*mFbsfKK8bcbZ;$w zzaYy=R`s>iL7u{!`erNmb7s3p8>ZMHhO?_ZbcBFa94~qgU6Nw+kw5lITcuap2CtNBRsEX8uD6!{+Pl|9S`n6` z0Nez)8E^~WR={n5+W~h1?gHEmxX0S_Yx`O2@U$MV0k9E(9i#pvpc$|k@D$)_z!tz( zz&0#)+*+%}9`}sB*m0?&zXR5BBZ^rkb9>ib?69p9EcW;8#V!wRq8IxI)X}bzi~U2Y z;Fu{oaEaOV$i==-E%yEPV*gk!_D{mST3zg)QR{!X*guc$bE3t5roGs|2zN3W@^soF z{2huyjIs9~8je-;o>^t-FwK3B#?e6S$D?q3smZOu{Z+WWKH(oQcA zMnYLW?YQ7f?V~|uJikXaKgVd;KXfx(gPY0sa1Z$ze_zdaRC@!-as3f({ZVb#U*BR~ zdflRRf>S`Es3TF-_X6Gnybt&Q@F8FyU_anvz$c<7W5pq4i~2zT@7Q-Zu`Up7ykS4j^N}_biero=ur}nmGDM+=B@D!Y1TqbILJe(3&zSa*TcGv>OehZptp}Rk)V@Ox4Xmd350^mZ3WmLE99|W;%W{J^%f6t*1m5ai9jLw1XTLEk)%$})Eb}@ndi3D ziK2D_Ww;YymoDvoq=l@pAn#shfpDa633|FUrFwRu_^p8&wsXmq+x`gc3$+l#V$f@5>j51ZypyUo(a+1;xXu*Eb zF{Ch=2o4Zr#_KFz=az&|mmO)6xOf0e^j3H6H*1~HNv68;Q~+OZ(hSh~PWX&hsq0VT z&IH!3N4OV0U*M&ZB<(2Oy&{u3Lky3{r>3WgGve8q$)^*x9eoap9r3IyJ44*&bJ4`@ z3CE!b+Caf_$K{Fx#4}Bt-(KHdzf z{Mt^8N@Q8$o&;9t2ttF-`2#`D5(g7l{$v+n+)JxL@&6x;8D-5%muE|jAl=`P$O;Q& zlJ9odGWU{~;J8*5-+|=;GWB=k$nBSnQxP^NnM$NPi)yYIlEgZ&a#5DV2Cxe9@aZ@9 zVX0o03!y8;_9Xb9dE!GtnlD%~?v59TTa#IV7?6yXb1n9~Ddr_JKU*l4CA0Rdnp%gX z*GhF|V2asfXK z>jE*<&(^V3;wwKpJ6T?sIF?r$U^7zb@*vGo)P-VuA`tQqen&6|u|2sZ{(Kn~K+OTV_+n>%!@;mnn{5o-s$qLvSvCd?h#iDf9p+C-Kcn3g7KxaS~KvzIF zKrx^@0H-zhf>z@=so^-O;eEx+>8v;z2QqvlU=(1CU>PhcFbR*70aNU9s_2@*^5SRU z6^AwabTKW14NabhN1Vm*1%PwKnha)&2QyfHU^(7b09FFd2V5Zbpe_CqJYEX8OdQ4- z{jb3z&iDCsfHfMU?|to~la4se@#0IvdC>er(3HvB*gKhr$zlr&WsXfwICk5i;pBv` zqhu;C=~2=#IbDjcIQq^?TJNesDwWlqKSnhaWLk-1luPlAGMD0yQ!bUqnvhE67V{^< zy;=qmbdmY58uxtHnQ(UUChF!oLm!jEpORIPh2cI>?3u!0|Bh?NJZHn0wotCpfo(;q zQk244wL8th$k#E-uq$CY^lZ%cH-hp6EIWS^2auSy@6i1%|?n>H^}Z|Tu7 z7;P=oMKfK^@t5QhvxZX4eOZjmg~+dnbEtTgqH{6spRmZRa~?(eZndHg=3+&?PBf!d zl-jeztf)7{)I6-HH?32C%@vpAv7FFdaoYU_=|{AWjL)&BzD#QibHwEl$0ZVf1b~A9 z{wM&41N<=n4hQ(-fF=MA31B=L-vqz`0e>2R0|Jf%0vtSPd^=zVU?<>NzzcvE0WSew z2E3waBlxR$cnz={@H*fPz?)bP`08D)2YyJMZgO12@NXa|K83c|!vVD(u%SEt;R63o zt%rkz6tx~?R%qAIdJqHKu#}8ejuiM0Y8m{fmcdW747&55i6AYWR+quQsMVFC$C$QC z@zmhTw3B~z^^nFqjNJVZS*uK~+kazfq5u>9JDF2g4?jj18HFB06S$*6>7gYe)=gmX z9zz#X3$eJ3nBAY@m6k@kKO>I9K@szbj|<_+;!i9fex8EG;trWs;t zJC=x1?(W6X@%5Y0T`X$HGP@(@(q%TCzrr0jn{T5h)hjPy=McynX7yqdkSF~HsztB~ zAS6QNwCP}vgQU!vY!|EU9L41JEFoE@Nlra39g9ZDyFs#ECzp%KKb`%%A(N?SRI$B1 z%T9J@ORL1^?b(<@Co^h!Ckg%rk|Jowm7Y9^xOZ5h>rrui2c+GD#j%botIrT>rZHQK zO!%E@1*i>cK_bi9-5bNB8Xs=VzQ>u=(^hjkMb^&IWmaRTEGmhl)8$?$C(dub;J!V*0G~@6XUWko zCf4*-YTgJ3U-^i`?O9(_Q7V&ISn-(MiNff{8oJSj-T6?`kSP|+Qi9h$)70}<*{@T>dw}R zzCGCV_(5>!g8@UtRXtd7oAG#@0GJ4v4449#3YZ2sMZDgF=-Q*jh>d9Y$5 zsLET(A2m4Efi1t|{a1;rdLwe&6z<(>y@RJZUZVQuW)yJ-7 z_%g`2Ber*@xT_E3$EL;M=n^62e+~6nce(53A|PcL)*HJsQjELZjRHZVDES_$vVDTR z=2K_|!2vjH{$5u%d(9ILj>W7~zs?lvd$atGYK7fLm^5Ik(dYh%QXX)Tw3V_}Dy9E} zVG^w>1sb6gQymveBcZ?}^Gu4o*d7D^0fE6b1kT@!4oF>){VD<8l z$2ko%o|S zq)RQ@af1ANBu?z2Y{QZP=vC2Y5R#4EDst2gLgaW|Mh@r0cH<2dIi4Pb$gzh=M@0@f zOl;(MQ)CZD#q9Vui!R#jS(_l6+{ucP~TLHI;lZUXA+B}TMM*!;p$Z8E_wFa)e z4P>@PlUOr^nIR;y1`=5Vi7bAHqZ!)(NMwy?0nY)R2OyC(kjNTHWQ|>bR{_Xj4dk!} za#;MdS~K1Ryp8CA-)O5OB;ir@E7ABWDDi8siyztA!Q>laUMYJL&A7??(*kgPnc>_! z83!V`3iWKDl8cZlC6cUsD)jpC1xGv=hbosjshka(cZtI%Lf%wYFZ^z3G#lXaQx$#}A<9Ryu7!aJ0-py1r>~gkqkmw5 ziyDD4Y?~hiYCT8@WeXh#I&LaNJvNq!&;xzfbfY!6u32 zV^}}wADy3idb5>(9MKQ{(VHWOOB2&4z(3}SxUtwq=c^+V$8CGtkSn{fGfq{!1@eRi zz7q{R90uUn#K5tMfnyT`_vZ$VO$;2H7{39I0C0D1;P?dJz|+yP=4Aj5!10L}6l zcyWB<#qo(Z0gwbp0i*)_fB+!PeojZ3t!X9R96aO#@&RoC1%N_85di0i-gbZvaDVv2 z6w3YK^CB-D-{^xe6?6iDzaD^fNK@61&Q<6q^TPvPd9L7!JNjin@+Yo(Fj6``td3f0D>5E0}cv!DI zr?Bm5nb<#`b;!p#ihUZXc0Q3*%sYZCsv8@rPUF0zObg0YkHc2Y4~zfOqtj#mLScOvX{kEXEU zp>r`bvR5y%S1&SGZ=Ea|zrkVU2Arc~&1;S5v_i5%e+q+GSxMw+o29<{<;cb4-H7WC zRCv!L9A$yGI4nqRJP zf2I_eEYsgZqH;tErJ?%EFTM>`4clb59i`n3lmD%>yVvB;m3EIydyDAsXZ*c5 z$B+hd6AIH|Jj`3#TK`Zvpx4FQyP->ZfC`!K4QLljEWctxipuVcMOzopE>~!B;E+-YdpHgsZMrq`5^2P< zPio{9IlyxP?K;)d&Bxzj2iO$Q9#m-bCl+m$vt2xf{;N{syF+pS3_Z~viI>F0 z(CMr%+b3$Lv)(6d^ru8fd8WqsQ~rq5$70WPHYK#tpX%y(n%5s=-k(Z=K9@ZFLkjej z6zCfz(6=Zc-wB&cuToe~W(=FHO{Ci3C2T2q&Lt6St5&fqmx+cJ`QbYqT zqStx-iBS^rC6ZCK4u27cPsN4gZ=eI+A4L&wdhSD!V0zX`sy7DM?P?0rTvRv28qDvK z=r6L%lL7XMV#IWHdFJ?CLZ;_$0rrmSlkV#Cf;ZYO4UL8|JaU-V1ME}P1^0(xQ}(>( z_2)&)>+(AWCmkAIX&kUO(jn|t_)1w(2Or*(Od|nBvS}otNHL8R6se}+N8yKYimAX1 zrQt188mvFd)M;k3O(Pvej%j3~$Tjr>Vo~oGUY4zB$}LN5X^T%0p`1)NWtGKL6K_eQ&IR$qZ^8V zk}u8FOYmlz9_p8F>T^(JnEKf$G9~j6%piqir`?SIAy;=4xu($*MJUfSdZWxwTZ#YM zm_}a|1*VS4fy~PSp7~1VESJnny#B!PWR~JWzZzBZ zGSSp66p+~`yr*GO?!{jyQ{!g4#=YAY<9OU_N*^ni6qW+?IsnwXCR-oqQgvfa!7g+o*UqXVj@4n1kd)yIBf1--Wd2qb|l5b1d#1x>5zS6 z0${e70MGjVCihCc>WC5HAMOksO1I4lTR>}DMInH z@s^>SNT$*Y{2H;DZSu(|aulDrVLqn^j8vtaLKmAQUVrX!wbR~+@CnvH6c$2;f(e_B z0v0k=TtCZZ6kdz`0K6748u41hsHqrDSB%1I5uNTU4+J9l|3<40;Ae0K2E7upJdUW*b9~H?7nf{y_?Urb!Awq@J^gK!AjzETYv7*w^Mddc(n}f{lsZE{cu#b)Z E0nb`8`2YX_ delta 24226 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 diff --git a/meteoinfo-lab/pylib/mipylib/plotlib/_mapaxes.py b/meteoinfo-lab/pylib/mipylib/plotlib/_mapaxes.py index 82085d98..a2f32045 100644 --- a/meteoinfo-lab/pylib/mipylib/plotlib/_mapaxes.py +++ b/meteoinfo-lab/pylib/mipylib/plotlib/_mapaxes.py @@ -625,9 +625,7 @@ class MapAxes(Axes): :returns: (*VectorLayer*) Line VectorLayer. """ - fill_value = kwargs.pop('fill_value', -9999.0) transform = kwargs.pop('transform', None) - is_lonlat = proj.isLonLat() n = len(args) xdatalist = [] ydatalist = [] @@ -904,7 +902,7 @@ class MapAxes(Axes): :param x: (*array_like*) Optional. X coordinate array. :param y: (*array_like*) Optional. Y coordinate array. :param z: (*array_like*) 2-D z value array. - :param levs: (*array_like*) Optional. A list of floating point numbers indicating the level curves + :param levels: (*array_like*) Optional. A list of floating point numbers indicating the level curves to draw, in increasing order. :param cmap: (*string*) Color map string. :param colors: (*list*) If None (default), the colormap specified by cmap will be used. If a @@ -930,7 +928,10 @@ class MapAxes(Axes): y = args[1] a = args[2] args = args[3:] - ls = plotutil.getlegendscheme(args, a.min(), a.max(), **kwargs) + + vmin = kwargs.pop('vmin', a.min()) + vmax = kwargs.pop('vmax', a.max()) + ls = plotutil.getlegendscheme(args, vmin, vmax, **kwargs) ls = ls.convertTo(ShapeTypes.POLYLINE) plotutil.setlegendscheme(ls, **kwargs) smooth = kwargs.pop('smooth', True) @@ -991,9 +992,11 @@ class MapAxes(Axes): a = args[2] args = args[3:] + vmin = kwargs.pop('vmin', a.min()) + vmax = kwargs.pop('vmax', a.max()) if not kwargs.has_key('extend'): kwargs['extend'] = 'neither' - ls = plotutil.getlegendscheme(args, a.min(), a.max(), **kwargs) + ls = plotutil.getlegendscheme(args, vmin, vmax, **kwargs) ls = ls.convertTo(ShapeTypes.POLYGON) if not kwargs.has_key('edgecolor'): kwargs['edgecolor'] = None @@ -1022,7 +1025,7 @@ class MapAxes(Axes): return graphics - @_add_transform + #@_add_transform def imshow(self, *args, **kwargs): """ Display an image on the map. @@ -1210,7 +1213,7 @@ class MapAxes(Axes): plotutil.setlegendscheme(ls, **kwargs) transform = kwargs.pop('transform', None) - if transform is None or transform.isLonLat(): + if transform is None or transform.getSourceProj().isLonLat(): lonlim = 90 else: lonlim = 0 diff --git a/meteoinfo-ndarray/src/main/java/org/meteoinfo/ndarray/math/ArrayUtil.java b/meteoinfo-ndarray/src/main/java/org/meteoinfo/ndarray/math/ArrayUtil.java index 03f5ea7a..c52083c2 100644 --- a/meteoinfo-ndarray/src/main/java/org/meteoinfo/ndarray/math/ArrayUtil.java +++ b/meteoinfo-ndarray/src/main/java/org/meteoinfo/ndarray/math/ArrayUtil.java @@ -1781,7 +1781,7 @@ public class ArrayUtil { sbuff.append(", "); } n += 1; - if (n > 200) { + if (n > 200 && ii.hasNext()) { sbuff.append("...]"); break; } diff --git a/meteoinfo-projection/src/main/java/org/meteoinfo/projection/ProjectionInfo.java b/meteoinfo-projection/src/main/java/org/meteoinfo/projection/ProjectionInfo.java index bc3ba80e..52a4ad67 100644 --- a/meteoinfo-projection/src/main/java/org/meteoinfo/projection/ProjectionInfo.java +++ b/meteoinfo-projection/src/main/java/org/meteoinfo/projection/ProjectionInfo.java @@ -46,6 +46,34 @@ package org.meteoinfo.projection; protected float cutoff = Float.NaN; //Latitude cutoff - valiad for some speciafic projections // // + + /** + * Constructor + */ + public ProjectionInfo() { + + } + + /** + * Constructor + * @param crs The coordinate reference system + */ + public ProjectionInfo(CoordinateReferenceSystem crs) { + this.crs = crs; + updateBoundary(); + } + + /** + * Constructor + * @param crs The coordinate reference system + * @param cutoff The cutoff latitude + */ + public ProjectionInfo(CoordinateReferenceSystem crs, float cutoff) { + this.crs = crs; + this.cutoff = cutoff; + updateBoundary(); + } + /** * Create new ProjectionInfo with crs * @param crs Coordinate reference system @@ -61,6 +89,22 @@ package org.meteoinfo.projection; case "Albers Equal Area": projInfo = new Albers(crs); break; + case "Airy": + projInfo = new Airy(crs); + break; + case "Aitoff": + case "Winkel Tripel": + projInfo = new Aitoff(crs); + break; + case "August Epicycloidal": + projInfo = new August(crs); + break; + case "Equidistant Azimuthal": + projInfo = new AzimuthEquidistant(crs); + break; + case "Equidistant Conic": + projInfo = new EquidistantConic(crs); + break; case "Lambert Conformal Conic": projInfo = new LambertConformalConic(crs); break; @@ -80,7 +124,7 @@ package org.meteoinfo.projection; projInfo = new Robinson(crs); break; case "Molleweide": - projInfo = new Molleweide(crs); + projInfo = new Mollweide(crs); break; case "Geostationary Satellite": projInfo = new GeostationarySatellite(crs); @@ -106,7 +150,7 @@ package org.meteoinfo.projection; break; } - projInfo.updateBoundary(); + //projInfo.updateBoundary(); return projInfo; } diff --git a/meteoinfo-projection/src/main/java/org/meteoinfo/projection/ProjectionNames.java b/meteoinfo-projection/src/main/java/org/meteoinfo/projection/ProjectionNames.java index 93d29038..38f4de4f 100644 --- a/meteoinfo-projection/src/main/java/org/meteoinfo/projection/ProjectionNames.java +++ b/meteoinfo-projection/src/main/java/org/meteoinfo/projection/ProjectionNames.java @@ -23,6 +23,11 @@ public enum ProjectionNames { Lambert_Equal_Area_Conic("leac"), Lambert_Azimuthal_Equal_Area("laea"), Albers_Equal_Area("aea"), + Airy("airy"), + Aitoff("aitoff"), + August("august"), + Azimuthal_Equidistant("aeqd"), + Equidistant_Conic("eqdc"), Stereographic_Azimuthal("stere"), North_Polar_Stereographic_Azimuthal("stere"), South_Polar_Stereographic_Azimuthal("stere"), diff --git a/meteoinfo-projection/src/main/java/org/meteoinfo/projection/ProjectionUtil.java b/meteoinfo-projection/src/main/java/org/meteoinfo/projection/ProjectionUtil.java index 86b162a0..ac46a4d2 100644 --- a/meteoinfo-projection/src/main/java/org/meteoinfo/projection/ProjectionUtil.java +++ b/meteoinfo-projection/src/main/java/org/meteoinfo/projection/ProjectionUtil.java @@ -195,6 +195,12 @@ public class ProjectionUtil { } } } + if (minY < -90) { + minY = -90; + } + if (maxY > 90) { + maxY = 90; + } Extent aExtent = new Extent(); aExtent.minX = minX; diff --git a/meteoinfo-projection/src/main/java/org/meteoinfo/projection/info/Airy.java b/meteoinfo-projection/src/main/java/org/meteoinfo/projection/info/Airy.java new file mode 100644 index 00000000..c9996e5a --- /dev/null +++ b/meteoinfo-projection/src/main/java/org/meteoinfo/projection/info/Airy.java @@ -0,0 +1,61 @@ +/* Copyright 2012 - Yaqiang Wang, + * yaqiang.wang@gmail.com + * + * This library is free software; you can redistribute it and/or modify it + * under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation; either version 2.1 of the License, or (at + * your option) any later version. + * + * This library is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser + * General Public License for more details. + */ +package org.meteoinfo.projection.info; + +import org.locationtech.proj4j.CoordinateReferenceSystem; +import org.meteoinfo.common.PointD; +import org.meteoinfo.geometry.shape.PolygonShape; +import org.meteoinfo.projection.KnownCoordinateSystems; +import org.meteoinfo.projection.ProjectionInfo; +import org.meteoinfo.projection.ProjectionNames; +import org.meteoinfo.projection.ProjectionUtil; + +import java.util.ArrayList; +import java.util.List; + +/** + * + * @author Yaqiang Wang + */ +public class Airy extends ProjectionInfo { + + // + // + // + /** + * Construction + * + * @param crs Coordinate reference system + */ + public Airy(CoordinateReferenceSystem crs) { + super(crs); + } + + // + // + /** + * Get projection name + * + * @return Projection name + */ + @Override + public ProjectionNames getProjectionName() { + return ProjectionNames.Airy; + } + + // + // + + // +} diff --git a/meteoinfo-projection/src/main/java/org/meteoinfo/projection/info/Aitoff.java b/meteoinfo-projection/src/main/java/org/meteoinfo/projection/info/Aitoff.java new file mode 100644 index 00000000..78d78d6f --- /dev/null +++ b/meteoinfo-projection/src/main/java/org/meteoinfo/projection/info/Aitoff.java @@ -0,0 +1,145 @@ +/* Copyright 2012 - Yaqiang Wang, + * yaqiang.wang@gmail.com + * + * This library is free software; you can redistribute it and/or modify it + * under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation; either version 2.1 of the License, or (at + * your option) any later version. + * + * This library is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser + * General Public License for more details. + */ +package org.meteoinfo.projection.info; + +import org.locationtech.proj4j.CoordinateReferenceSystem; +import org.meteoinfo.common.*; +import org.meteoinfo.geometry.shape.PolygonShape; +import org.meteoinfo.projection.KnownCoordinateSystems; +import org.meteoinfo.projection.ProjectionInfo; +import org.meteoinfo.projection.ProjectionNames; +import org.meteoinfo.projection.ProjectionUtil; + +import java.util.ArrayList; +import java.util.List; + +/** + * + * @author Yaqiang Wang + */ +public class Aitoff extends ProjectionInfo { + + // + // + // + /** + * Construction + * + * @param crs Coordinate reference system + */ + public Aitoff(CoordinateReferenceSystem crs) { + super(crs); + } + + // + // + /** + * Get projection name + * + * @return Projection name + */ + @Override + public ProjectionNames getProjectionName() { + return ProjectionNames.Aitoff; + } + + // + // + @Override + public void updateBoundary() { + double epsilon = 1e-10; + double cenLon = this.getCenterLon(); + double minLon = cenLon - 180 + epsilon; + double maxLon = cenLon + 180 - epsilon; + double minLat = -90; + double maxLat = 90; + List points = new ArrayList<>(); + double lon = minLon; + double lat = minLat; + lon = maxLon; + while (lat < maxLat) { + points.add(new PointD(lon, lat)); + lat += 1; + } + lat = maxLat; + lon = minLon; + while (lat > minLat) { + points.add(new PointD(lon, lat)); + lat -= 1; + } + lat = minLat; + points.add(new PointD(lon, lat)); + PolygonShape ps = new PolygonShape(); + ps.setPoints(points); + this.boundary = ProjectionUtil.projectPolygonShape(ps, KnownCoordinateSystems.geographic.world.WGS1984, this); + } + + @Override + public Object[] checkGridLabel(GridLabel gl, float shift) { + float angle = gl.getAngle(); + double v = gl.getValue(); + float xShift = 0.f; + float yShift = 0.f; + XAlign xAlign = XAlign.CENTER; + YAlign yAlign = YAlign.CENTER; + if (v == 0) { + if (angle == 90) { + xShift = shift; + xAlign = XAlign.LEFT; + } else if (angle == 270) { + xShift = -shift; + xAlign = XAlign.RIGHT; + } else if (angle < 90) { + xShift = shift; + xAlign = XAlign.LEFT; + yAlign = YAlign.BOTTOM; + } else if (angle > 90 && angle <= 180) { + xShift = shift; + xAlign = XAlign.LEFT; + yAlign = YAlign.TOP; + } else if (angle > 180 && angle < 270) { + xShift = -shift; + xAlign = XAlign.RIGHT; + yAlign = YAlign.TOP; + } else if (angle > 270 && angle <= 360) { + xShift = -shift; + xAlign = XAlign.RIGHT; + yAlign = YAlign.BOTTOM; + } + } else if (v > 0) { + if (gl.getLabDirection() == Direction.East) { + xShift = shift; + xAlign = XAlign.LEFT; + yAlign = YAlign.BOTTOM; + } else { + xShift = -shift; + xAlign = XAlign.RIGHT; + yAlign = YAlign.BOTTOM; + } + } else { + if (gl.getLabDirection() == Direction.East) { + xShift = shift; + xAlign = XAlign.LEFT; + yAlign = YAlign.TOP; + } else { + xShift = -shift; + xAlign = XAlign.RIGHT; + yAlign = YAlign.TOP; + } + } + + return new Object[]{xShift, yShift, xAlign, yAlign}; + } + // +} diff --git a/meteoinfo-projection/src/main/java/org/meteoinfo/projection/info/Albers.java b/meteoinfo-projection/src/main/java/org/meteoinfo/projection/info/Albers.java index e5aaadd7..2b8c9e06 100644 --- a/meteoinfo-projection/src/main/java/org/meteoinfo/projection/info/Albers.java +++ b/meteoinfo-projection/src/main/java/org/meteoinfo/projection/info/Albers.java @@ -36,10 +36,10 @@ public class Albers extends ProjectionInfo { /** * Construction * - * @param crs Coorinate reference system + * @param crs Coordinate reference system */ public Albers(CoordinateReferenceSystem crs) { - this.crs = crs; + super(crs); } // diff --git a/meteoinfo-projection/src/main/java/org/meteoinfo/projection/info/August.java b/meteoinfo-projection/src/main/java/org/meteoinfo/projection/info/August.java new file mode 100644 index 00000000..15edce51 --- /dev/null +++ b/meteoinfo-projection/src/main/java/org/meteoinfo/projection/info/August.java @@ -0,0 +1,145 @@ +/* Copyright 2012 - Yaqiang Wang, + * yaqiang.wang@gmail.com + * + * This library is free software; you can redistribute it and/or modify it + * under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation; either version 2.1 of the License, or (at + * your option) any later version. + * + * This library is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser + * General Public License for more details. + */ +package org.meteoinfo.projection.info; + +import org.locationtech.proj4j.CoordinateReferenceSystem; +import org.meteoinfo.common.*; +import org.meteoinfo.geometry.shape.PolygonShape; +import org.meteoinfo.projection.KnownCoordinateSystems; +import org.meteoinfo.projection.ProjectionInfo; +import org.meteoinfo.projection.ProjectionNames; +import org.meteoinfo.projection.ProjectionUtil; + +import java.util.ArrayList; +import java.util.List; + +/** + * + * @author Yaqiang Wang + */ +public class August extends ProjectionInfo { + + // + // + // + /** + * Construction + * + * @param crs Coordinate reference system + */ + public August(CoordinateReferenceSystem crs) { + super(crs); + } + + // + // + /** + * Get projection name + * + * @return Projection name + */ + @Override + public ProjectionNames getProjectionName() { + return ProjectionNames.August; + } + + // + // + @Override + public void updateBoundary() { + double epsilon = 1e-10; + double cenLon = this.getCenterLon(); + double minLon = cenLon - 180 + epsilon; + double maxLon = cenLon + 180 - epsilon; + double minLat = -90; + double maxLat = 90; + List points = new ArrayList<>(); + double lon = minLon; + double lat = minLat; + lon = maxLon; + while (lat < maxLat) { + points.add(new PointD(lon, lat)); + lat += 1; + } + lat = maxLat; + lon = minLon; + while (lat > minLat) { + points.add(new PointD(lon, lat)); + lat -= 1; + } + lat = minLat; + points.add(new PointD(lon, lat)); + PolygonShape ps = new PolygonShape(); + ps.setPoints(points); + this.boundary = ProjectionUtil.projectPolygonShape(ps, KnownCoordinateSystems.geographic.world.WGS1984, this); + } + + @Override + public Object[] checkGridLabel(GridLabel gl, float shift) { + float angle = gl.getAngle(); + double v = gl.getValue(); + float xShift = 0.f; + float yShift = 0.f; + XAlign xAlign = XAlign.CENTER; + YAlign yAlign = YAlign.CENTER; + if (v == 0) { + if (angle == 90) { + xShift = shift; + xAlign = XAlign.LEFT; + } else if (angle == 270) { + xShift = -shift; + xAlign = XAlign.RIGHT; + } else if (angle < 90) { + xShift = shift; + xAlign = XAlign.LEFT; + yAlign = YAlign.BOTTOM; + } else if (angle > 90 && angle <= 180) { + xShift = shift; + xAlign = XAlign.LEFT; + yAlign = YAlign.TOP; + } else if (angle > 180 && angle < 270) { + xShift = -shift; + xAlign = XAlign.RIGHT; + yAlign = YAlign.TOP; + } else if (angle > 270 && angle <= 360) { + xShift = -shift; + xAlign = XAlign.RIGHT; + yAlign = YAlign.BOTTOM; + } + } else if (v > 0) { + if (gl.getLabDirection() == Direction.East) { + xShift = shift; + xAlign = XAlign.LEFT; + yAlign = YAlign.BOTTOM; + } else { + xShift = -shift; + xAlign = XAlign.RIGHT; + yAlign = YAlign.BOTTOM; + } + } else { + if (gl.getLabDirection() == Direction.East) { + xShift = shift; + xAlign = XAlign.LEFT; + yAlign = YAlign.TOP; + } else { + xShift = -shift; + xAlign = XAlign.RIGHT; + yAlign = YAlign.TOP; + } + } + + return new Object[]{xShift, yShift, xAlign, yAlign}; + } + // +} diff --git a/meteoinfo-projection/src/main/java/org/meteoinfo/projection/info/AzimuthEquidistant.java b/meteoinfo-projection/src/main/java/org/meteoinfo/projection/info/AzimuthEquidistant.java new file mode 100644 index 00000000..20ea666e --- /dev/null +++ b/meteoinfo-projection/src/main/java/org/meteoinfo/projection/info/AzimuthEquidistant.java @@ -0,0 +1,96 @@ +/* Copyright 2012 - Yaqiang Wang, + * yaqiang.wang@gmail.com + * + * This library is free software; you can redistribute it and/or modify it + * under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation; either version 2.1 of the License, or (at + * your option) any later version. + * + * This library is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser + * General Public License for more details. + */ +package org.meteoinfo.projection.info; + +import org.locationtech.proj4j.CoordinateReferenceSystem; +import org.meteoinfo.common.PointD; +import org.meteoinfo.geometry.shape.PolygonShape; +import org.meteoinfo.projection.KnownCoordinateSystems; +import org.meteoinfo.projection.ProjectionInfo; +import org.meteoinfo.projection.ProjectionNames; +import org.meteoinfo.projection.ProjectionUtil; + +import java.util.ArrayList; +import java.util.List; + +/** + * + * @author Yaqiang Wang + */ +public class AzimuthEquidistant extends ProjectionInfo { + + // + // + // + /** + * Construction + * + * @param crs Coordinate reference system + */ + public AzimuthEquidistant(CoordinateReferenceSystem crs) { + super(crs); + } + + // + // + /** + * Get projection name + * + * @return Projection name + */ + @Override + public ProjectionNames getProjectionName() { + return ProjectionNames.Azimuthal_Equidistant; + } + + // + // + @Override + public void updateBoundary() { + double epsilon = 1e-10; + double cenLon = this.getCenterLon(); + double minLon = cenLon - 180 + epsilon; + double maxLon = cenLon + 180 - epsilon; + double minLat = -90; + double maxLat = 90; + List points = new ArrayList<>(); + double lon = minLon; + double lat = minLat; + while (lon < maxLon) { + points.add(new PointD(lon, lat)); + lon += 1; + } + lon = maxLon; + while (lat < maxLat) { + points.add(new PointD(lon, lat)); + lat += 1; + } + lat = maxLat; + while (lon > minLon) { + points.add(new PointD(lon, lat)); + lon -= 1; + } + lon = minLon; + while (lat > minLat) { + points.add(new PointD(lon, lat)); + lat -= 1; + } + lat = minLat; + points.add(new PointD(lon, lat)); + PolygonShape ps = new PolygonShape(); + ps.setPoints(points); + this.boundary = ProjectionUtil.projectPolygonShape(ps, KnownCoordinateSystems.geographic.world.WGS1984, this); + } + // +} diff --git a/meteoinfo-projection/src/main/java/org/meteoinfo/projection/info/Common.java b/meteoinfo-projection/src/main/java/org/meteoinfo/projection/info/Common.java index 6fd51a1c..6b5e0d63 100644 --- a/meteoinfo-projection/src/main/java/org/meteoinfo/projection/info/Common.java +++ b/meteoinfo-projection/src/main/java/org/meteoinfo/projection/info/Common.java @@ -29,10 +29,10 @@ public class Common extends ProjectionInfo { /** * Construction * - * @param crs Coorinate reference system + * @param crs Coordinate reference system */ public Common(CoordinateReferenceSystem crs) { - this.crs = crs; + super(crs); } // diff --git a/meteoinfo-projection/src/main/java/org/meteoinfo/projection/info/EquidistantConic.java b/meteoinfo-projection/src/main/java/org/meteoinfo/projection/info/EquidistantConic.java new file mode 100644 index 00000000..7ee6cf56 --- /dev/null +++ b/meteoinfo-projection/src/main/java/org/meteoinfo/projection/info/EquidistantConic.java @@ -0,0 +1,96 @@ +/* Copyright 2012 - Yaqiang Wang, + * yaqiang.wang@gmail.com + * + * This library is free software; you can redistribute it and/or modify it + * under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation; either version 2.1 of the License, or (at + * your option) any later version. + * + * This library is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser + * General Public License for more details. + */ +package org.meteoinfo.projection.info; + +import org.locationtech.proj4j.CoordinateReferenceSystem; +import org.meteoinfo.common.PointD; +import org.meteoinfo.geometry.shape.PolygonShape; +import org.meteoinfo.projection.KnownCoordinateSystems; +import org.meteoinfo.projection.ProjectionInfo; +import org.meteoinfo.projection.ProjectionNames; +import org.meteoinfo.projection.ProjectionUtil; + +import java.util.ArrayList; +import java.util.List; + +/** + * + * @author Yaqiang Wang + */ +public class EquidistantConic extends ProjectionInfo { + + // + // + // + /** + * Construction + * + * @param crs Coordinate reference system + */ + public EquidistantConic(CoordinateReferenceSystem crs) { + super(crs); + } + + // + // + /** + * Get projection name + * + * @return Projection name + */ + @Override + public ProjectionNames getProjectionName() { + return ProjectionNames.Equidistant_Conic; + } + + // + // + @Override + public void updateBoundary() { + double epsilon = 1e-10; + double cenLon = this.getCenterLon(); + double minLon = cenLon - 180 + epsilon; + double maxLon = cenLon + 180 - epsilon; + double minLat = -90; + double maxLat = 90; + List points = new ArrayList<>(); + double lon = minLon; + double lat = minLat; + while (lon < maxLon) { + points.add(new PointD(lon, lat)); + lon += 1; + } + lon = maxLon; + while (lat < maxLat) { + points.add(new PointD(lon, lat)); + lat += 1; + } + lat = maxLat; + while (lon > minLon) { + points.add(new PointD(lon, lat)); + lon -= 1; + } + lon = minLon; + while (lat > minLat) { + points.add(new PointD(lon, lat)); + lat -= 1; + } + lat = minLat; + points.add(new PointD(lon, lat)); + PolygonShape ps = new PolygonShape(); + ps.setPoints(points); + this.boundary = ProjectionUtil.projectPolygonShape(ps, KnownCoordinateSystems.geographic.world.WGS1984, this); + } + // +} diff --git a/meteoinfo-projection/src/main/java/org/meteoinfo/projection/info/GeostationarySatellite.java b/meteoinfo-projection/src/main/java/org/meteoinfo/projection/info/GeostationarySatellite.java index 0ac6c2e0..8f68853d 100644 --- a/meteoinfo-projection/src/main/java/org/meteoinfo/projection/info/GeostationarySatellite.java +++ b/meteoinfo-projection/src/main/java/org/meteoinfo/projection/info/GeostationarySatellite.java @@ -40,7 +40,7 @@ public class GeostationarySatellite extends ProjectionInfo { * @param crs Coordinate reference system */ public GeostationarySatellite(CoordinateReferenceSystem crs) { - this.crs = crs; + super(crs); } // diff --git a/meteoinfo-projection/src/main/java/org/meteoinfo/projection/info/Hammer.java b/meteoinfo-projection/src/main/java/org/meteoinfo/projection/info/Hammer.java index d5fb8760..a3ed35a5 100644 --- a/meteoinfo-projection/src/main/java/org/meteoinfo/projection/info/Hammer.java +++ b/meteoinfo-projection/src/main/java/org/meteoinfo/projection/info/Hammer.java @@ -36,10 +36,10 @@ public class Hammer extends ProjectionInfo { /** * Construction * - * @param crs Coorinate reference system + * @param crs Coordinate reference system */ public Hammer(CoordinateReferenceSystem crs) { - this.crs = crs; + super(crs); } // diff --git a/meteoinfo-projection/src/main/java/org/meteoinfo/projection/info/LambertAzimuthalEqualArea.java b/meteoinfo-projection/src/main/java/org/meteoinfo/projection/info/LambertAzimuthalEqualArea.java index 4ba960e8..6ffe9b9c 100644 --- a/meteoinfo-projection/src/main/java/org/meteoinfo/projection/info/LambertAzimuthalEqualArea.java +++ b/meteoinfo-projection/src/main/java/org/meteoinfo/projection/info/LambertAzimuthalEqualArea.java @@ -35,10 +35,10 @@ public class LambertAzimuthalEqualArea extends ProjectionInfo { /** * Construction * - * @param crs Coorinate reference system + * @param crs Coordinate reference system */ public LambertAzimuthalEqualArea(CoordinateReferenceSystem crs) { - this.crs = crs; + super(crs); } // diff --git a/meteoinfo-projection/src/main/java/org/meteoinfo/projection/info/LambertConformalConic.java b/meteoinfo-projection/src/main/java/org/meteoinfo/projection/info/LambertConformalConic.java index 96d36153..05c4ec70 100644 --- a/meteoinfo-projection/src/main/java/org/meteoinfo/projection/info/LambertConformalConic.java +++ b/meteoinfo-projection/src/main/java/org/meteoinfo/projection/info/LambertConformalConic.java @@ -41,6 +41,19 @@ public class LambertConformalConic extends ProjectionInfo { public LambertConformalConic(CoordinateReferenceSystem crs) { this.crs = crs; this.cutoff = -80.f; + updateBoundary(); + } + + /** + * Construction + * + * @param crs Coordinate reference system + * @param cutoff Cutoff latitude + */ + public LambertConformalConic(CoordinateReferenceSystem crs, float cutoff) { + this.crs = crs; + this.cutoff = cutoff; + updateBoundary(); } // diff --git a/meteoinfo-projection/src/main/java/org/meteoinfo/projection/info/LambertEqualAreaConic.java b/meteoinfo-projection/src/main/java/org/meteoinfo/projection/info/LambertEqualAreaConic.java index f11523da..0957d875 100644 --- a/meteoinfo-projection/src/main/java/org/meteoinfo/projection/info/LambertEqualAreaConic.java +++ b/meteoinfo-projection/src/main/java/org/meteoinfo/projection/info/LambertEqualAreaConic.java @@ -36,10 +36,10 @@ public class LambertEqualAreaConic extends ProjectionInfo { /** * Construction * - * @param crs Coorinate reference system + * @param crs Coordinate reference system */ public LambertEqualAreaConic(CoordinateReferenceSystem crs) { - this.crs = crs; + super(crs); } // diff --git a/meteoinfo-projection/src/main/java/org/meteoinfo/projection/info/Mercator.java b/meteoinfo-projection/src/main/java/org/meteoinfo/projection/info/Mercator.java index 841903d4..d25e93e2 100644 --- a/meteoinfo-projection/src/main/java/org/meteoinfo/projection/info/Mercator.java +++ b/meteoinfo-projection/src/main/java/org/meteoinfo/projection/info/Mercator.java @@ -36,11 +36,12 @@ public class Mercator extends ProjectionInfo { /** * Construction * - * @param crs Coorinate reference system + * @param crs Coordinate reference system */ public Mercator(CoordinateReferenceSystem crs) { this.crs = crs; this.cutoff = 85.0511f; + updateBoundary(); } // diff --git a/meteoinfo-projection/src/main/java/org/meteoinfo/projection/info/Molleweide.java b/meteoinfo-projection/src/main/java/org/meteoinfo/projection/info/Mollweide.java similarity index 96% rename from meteoinfo-projection/src/main/java/org/meteoinfo/projection/info/Molleweide.java rename to meteoinfo-projection/src/main/java/org/meteoinfo/projection/info/Mollweide.java index f27efd2c..4b78dba8 100644 --- a/meteoinfo-projection/src/main/java/org/meteoinfo/projection/info/Molleweide.java +++ b/meteoinfo-projection/src/main/java/org/meteoinfo/projection/info/Mollweide.java @@ -32,7 +32,7 @@ import java.util.List; * * @author Yaqiang Wang */ -public class Molleweide extends ProjectionInfo { +public class Mollweide extends ProjectionInfo { // // @@ -40,10 +40,10 @@ public class Molleweide extends ProjectionInfo { /** * Construction * - * @param crs Coorinate reference system + * @param crs Coordinate reference system */ - public Molleweide(CoordinateReferenceSystem crs) { - this.crs = crs; + public Mollweide(CoordinateReferenceSystem crs) { + super(crs); } // diff --git a/meteoinfo-projection/src/main/java/org/meteoinfo/projection/info/OrthographicAzimuthal.java b/meteoinfo-projection/src/main/java/org/meteoinfo/projection/info/OrthographicAzimuthal.java index 479a0bdc..ec279f1b 100644 --- a/meteoinfo-projection/src/main/java/org/meteoinfo/projection/info/OrthographicAzimuthal.java +++ b/meteoinfo-projection/src/main/java/org/meteoinfo/projection/info/OrthographicAzimuthal.java @@ -37,10 +37,10 @@ public class OrthographicAzimuthal extends ProjectionInfo { /** * Construction * - * @param crs Coorinate reference system + * @param crs Coordinate reference system */ public OrthographicAzimuthal(CoordinateReferenceSystem crs) { - this.crs = crs; + super(crs); } // diff --git a/meteoinfo-projection/src/main/java/org/meteoinfo/projection/info/Robinson.java b/meteoinfo-projection/src/main/java/org/meteoinfo/projection/info/Robinson.java index 615f1556..b50db7fb 100644 --- a/meteoinfo-projection/src/main/java/org/meteoinfo/projection/info/Robinson.java +++ b/meteoinfo-projection/src/main/java/org/meteoinfo/projection/info/Robinson.java @@ -40,10 +40,10 @@ public class Robinson extends ProjectionInfo { /** * Construction * - * @param crs Coorinate reference system + * @param crs Coordinate reference system */ public Robinson(CoordinateReferenceSystem crs) { - this.crs = crs; + super(crs); } // diff --git a/meteoinfo-projection/src/main/java/org/meteoinfo/projection/info/Sinusoidal.java b/meteoinfo-projection/src/main/java/org/meteoinfo/projection/info/Sinusoidal.java index b6381c38..18b14936 100644 --- a/meteoinfo-projection/src/main/java/org/meteoinfo/projection/info/Sinusoidal.java +++ b/meteoinfo-projection/src/main/java/org/meteoinfo/projection/info/Sinusoidal.java @@ -36,10 +36,10 @@ public class Sinusoidal extends ProjectionInfo { /** * Construction * - * @param crs Coorinate reference system + * @param crs Coordinate reference system */ public Sinusoidal(CoordinateReferenceSystem crs) { - this.crs = crs; + super(crs); } // diff --git a/meteoinfo-projection/src/main/java/org/meteoinfo/projection/info/StereographicAzimuthal.java b/meteoinfo-projection/src/main/java/org/meteoinfo/projection/info/StereographicAzimuthal.java index b5f5110e..5c92580a 100644 --- a/meteoinfo-projection/src/main/java/org/meteoinfo/projection/info/StereographicAzimuthal.java +++ b/meteoinfo-projection/src/main/java/org/meteoinfo/projection/info/StereographicAzimuthal.java @@ -36,11 +36,24 @@ public class StereographicAzimuthal extends ProjectionInfo { /** * Construction * - * @param crs Coorinate reference system + * @param crs Coordinate reference system */ public StereographicAzimuthal(CoordinateReferenceSystem crs) { this.crs = crs; this.cutoff = 0.f; + updateBoundary(); + } + + /** + * Construction + * + * @param crs Coordinate reference system + * @param cutoff Cutoff latitude + */ + public StereographicAzimuthal(CoordinateReferenceSystem crs, float cutoff) { + this.crs = crs; + this.cutoff = cutoff; + updateBoundary(); } // diff --git a/meteoinfo-projection/src/main/java/org/meteoinfo/projection/info/TransverseMercator.java b/meteoinfo-projection/src/main/java/org/meteoinfo/projection/info/TransverseMercator.java index a17672a0..67cf96a9 100644 --- a/meteoinfo-projection/src/main/java/org/meteoinfo/projection/info/TransverseMercator.java +++ b/meteoinfo-projection/src/main/java/org/meteoinfo/projection/info/TransverseMercator.java @@ -34,11 +34,12 @@ public class TransverseMercator extends ProjectionInfo { /** * Construction * - * @param crs Coorinate reference system + * @param crs Coordinate reference system */ public TransverseMercator(CoordinateReferenceSystem crs) { this.crs = crs; this.cutoff = 85.0511f; + updateBoundary(); } // diff --git a/meteoinfo-projection/src/main/java/org/meteoinfo/projection/info/Wagner3.java b/meteoinfo-projection/src/main/java/org/meteoinfo/projection/info/Wagner3.java index 798360c9..8bd543d6 100644 --- a/meteoinfo-projection/src/main/java/org/meteoinfo/projection/info/Wagner3.java +++ b/meteoinfo-projection/src/main/java/org/meteoinfo/projection/info/Wagner3.java @@ -14,7 +14,7 @@ package org.meteoinfo.projection.info; import org.locationtech.proj4j.CoordinateReferenceSystem; -import org.meteoinfo.common.PointD; +import org.meteoinfo.common.*; import org.meteoinfo.geometry.shape.PolygonShape; import org.meteoinfo.projection.KnownCoordinateSystems; import org.meteoinfo.projection.ProjectionInfo; @@ -36,10 +36,10 @@ public class Wagner3 extends ProjectionInfo { /** * Construction * - * @param crs Coorinate reference system + * @param crs Coordinate reference system */ public Wagner3(CoordinateReferenceSystem crs) { - this.crs = crs; + super(crs); } // @@ -92,5 +92,72 @@ public class Wagner3 extends ProjectionInfo { ps.setPoints(points); this.boundary = ProjectionUtil.projectPolygonShape(ps, KnownCoordinateSystems.geographic.world.WGS1984, this); } + + @Override + public Object[] checkGridLabel(GridLabel gl, float shift) { + float angle = gl.getAngle(); + double v = gl.getValue(); + float xShift = 0.f; + float yShift = 0.f; + XAlign xAlign = XAlign.CENTER; + YAlign yAlign = YAlign.CENTER; + if (gl.isLongitude()) { + if (gl.getLabDirection() == Direction.South) { + yShift = shift; + yAlign = YAlign.TOP; + } else { + yShift = -shift; + yAlign = YAlign.BOTTOM; + } + } else { + if (v == 0) { + if (angle == 90) { + xShift = shift; + xAlign = XAlign.LEFT; + } else if (angle == 270) { + xShift = -shift; + xAlign = XAlign.RIGHT; + } else if (angle < 90) { + xShift = shift; + xAlign = XAlign.LEFT; + yAlign = YAlign.BOTTOM; + } else if (angle > 90 && angle <= 180) { + xShift = shift; + xAlign = XAlign.LEFT; + yAlign = YAlign.TOP; + } else if (angle > 180 && angle < 270) { + xShift = -shift; + xAlign = XAlign.RIGHT; + yAlign = YAlign.TOP; + } else if (angle > 270 && angle <= 360) { + xShift = -shift; + xAlign = XAlign.RIGHT; + yAlign = YAlign.BOTTOM; + } + } else if (v > 0) { + if (gl.getLabDirection() == Direction.East) { + xShift = shift; + xAlign = XAlign.LEFT; + yAlign = YAlign.BOTTOM; + } else { + xShift = -shift; + xAlign = XAlign.RIGHT; + yAlign = YAlign.BOTTOM; + } + } else { + if (gl.getLabDirection() == Direction.East) { + xShift = shift; + xAlign = XAlign.LEFT; + yAlign = YAlign.TOP; + } else { + xShift = -shift; + xAlign = XAlign.RIGHT; + yAlign = YAlign.TOP; + } + } + } + + return new Object[]{xShift, yShift, xAlign, yAlign}; + } // }