From e207d3821a4ac5d41c27f6234a6832696054248b Mon Sep 17 00:00:00 2001 From: wyq Date: Mon, 26 Aug 2024 11:59:17 +0800 Subject: [PATCH] update WebImage plot function --- .../org/meteoinfo/chart/geo/MapGridLine.java | 4 + .../java/org/meteoinfo/chart/geo/MapPlot.java | 75 ++++++++++++++++++- meteoinfo-lab/milconfig.xml | 12 +-- .../meteoinfo/projection/ProjectionUtil.java | 15 ++++ 4 files changed, 100 insertions(+), 6 deletions(-) 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 1ba5ffbc..8029eaf0 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 @@ -345,6 +345,10 @@ public class MapGridLine extends GridLine { } protected void updateLonLatGridLabels() { + if (extent == null) { + return; + } + //Longitude List tLabels = new ArrayList<>(); for (int i = 0; i < this.longitudeLines.size(); i++) { 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 4c01acfc..8222cf84 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 @@ -493,6 +493,8 @@ public class MapPlot extends Plot2D implements IWebMapPanel { Graphic graphic = this.graphics.get(m); if (graphic.isVisible()) { if (graphic instanceof WebMapImage) { + this.updateXYScale(area.getWidth(), area.getHeight()); + this.updateWebMapScale(area.getWidth(), area.getHeight()); this.drawWebMapImage(g, (WebMapImage) graphic, area); continue; } @@ -611,6 +613,65 @@ public class MapPlot extends Plot2D implements IWebMapPanel { this.drawExtent.maxY = center.Y + ylen; } + private void updateXYScale(double width, double height) { + updateXYScale(this.drawExtent, width, height); + updateDrawExtent(); + } + + private void updateXYScale(Extent aExtent, double width, double height) { + double scaleFactor, lonRan, latRan, temp; + + this.xScale = width / (aExtent.maxX - aExtent.minX); + this.yScale = height / (aExtent.maxY - aExtent.minY); + + if (xScale > yScale) { + xScale = yScale; + temp = aExtent.minX; + aExtent.minX = aExtent.maxX - width / xScale; + lonRan = (aExtent.minX - temp) / 2; + aExtent.minX = aExtent.minX - lonRan; + aExtent.maxX = aExtent.maxX - lonRan; + } else if (xScale < yScale) { + yScale = xScale; + temp = aExtent.minY; + aExtent.minY = aExtent.maxY - height / yScale; + latRan = (aExtent.minY - temp) / 2; + aExtent.minY = aExtent.minY - latRan; + aExtent.maxY = aExtent.maxY - latRan; + } + } + + private void updateWebMapScale(double width, double height) { + updateWebMapScale(this.getWebMapImage(), width, height); + } + + private void updateWebMapScale(WebMapImage layer, double width, double height) { + double webMapScale = layer.getWebMapScale(); + if (!MIMath.doubleEquals(xScale, webMapScale)) { + int minZoom = layer.getTileFactory().getInfo().getMinimumZoomLevel(); + int maxZoom = layer.getTileFactory().getInfo().getMaximumZoomLevel(); + int newZoom = minZoom; + double scale = webMapScale; + for (int i = maxZoom; i >= minZoom; i--) { + layer.setZoom(i); + scale = getWebMapScale(layer, i, width, height); + if (xScale < scale) { + newZoom = i; + if (xScale < webMapScale) { + if (i < maxZoom) { + newZoom = i + 1; + scale = getWebMapScale(layer, newZoom, width, height); + } + } + break; + } + } + this.setScale(scale, width, height); + layer.setWebMapScale(scale); + layer.setZoom(newZoom); + } + } + void drawWebMapImage(Graphics2D g, WebMapImage graphic, Rectangle2D area) { PointD geoCenter = this.getGeoCenter(); graphic.setAddressLocation(new GeoPosition(geoCenter.Y, geoCenter.X)); @@ -748,7 +809,11 @@ public class MapPlot extends Plot2D implements IWebMapPanel { */ public void zoomToExtentLonLatEx(Extent aExtent) { if (!this.projInfo.isLonLat()) { - aExtent = ProjectionUtil.getProjectionExtent(ProjectionInfo.LONG_LAT, this.projInfo, aExtent, 10); + if (this.projInfo.getProjectionName() == ProjectionNames.Mercator) { + aExtent = ProjectionUtil.getProjectionExtent(ProjectionInfo.LONG_LAT, this.projInfo, aExtent); + } else { + aExtent = ProjectionUtil.getProjectionExtent(ProjectionInfo.LONG_LAT, this.projInfo, aExtent, 10); + } } this.setDrawExtent(aExtent); @@ -795,6 +860,14 @@ public class MapPlot extends Plot2D implements IWebMapPanel { } } + @Override + public void updateDrawExtent() { + super.updateDrawExtent(); + if (!this.isLonLatMap()) { + ((MapGridLine) this.gridLine).setExtent(extent); + } + } + /** * Add point graphic * diff --git a/meteoinfo-lab/milconfig.xml b/meteoinfo-lab/milconfig.xml index 1fdf2396..1c42fb8c 100644 --- a/meteoinfo-lab/milconfig.xml +++ b/meteoinfo-lab/milconfig.xml @@ -1,11 +1,8 @@ - - - + - @@ -16,15 +13,20 @@ + + + + + @@ -32,5 +34,5 @@
- + 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 1d9cf93a..54ea80a0 100644 --- a/meteoinfo-projection/src/main/java/org/meteoinfo/projection/ProjectionUtil.java +++ b/meteoinfo-projection/src/main/java/org/meteoinfo/projection/ProjectionUtil.java @@ -105,6 +105,21 @@ public class ProjectionUtil { return aExtent; } + /** + * Get projected extent + * + * @param fromProj From projection + * @param toProj To projection + * @param fromExtent From extent + * @return To extent + */ + public static Extent getProjectionExtent(ProjectionInfo fromProj, ProjectionInfo toProj, Extent fromExtent) { + PointD pll = Reproject.reprojectPoint(fromExtent.minX, fromExtent.minY, fromProj, toProj); + PointD pur = Reproject.reprojectPoint(fromExtent.maxX, fromExtent.maxY, fromProj, toProj); + + return new Extent(pll.X, pur.X, pll.Y, pur.Y); + } + /** * Get projected extent *