void matchAspect() { /* Basic sinusoidal projection of lat/lon data to square pixels */ double yCenter = modelBounds.centre().y; float xScale = cos(radians((float) yCenter)); double newX = modelBounds.getHeight() * (1 / xScale) * ((float) this.getWidth() / this.getHeight()); modelBounds.expandBy((newX - modelBounds.getWidth()) / 2f, 0); }
public void fit() throws Exception { MapContent generalMapContext = getGeneralMapContext(); Dimension size = getSize(); Envelope projectedBounds = generalMapContext.getMaxBounds(); double destWidth = projectedBounds.getWidth(); double destHeight = projectedBounds.getHeight(); Coordinate centre = projectedBounds.centre(); Point2D.Double screenLT = awtScreen2Cartesian(new Point(0, 0)); Point2D.Double screenBR = awtScreen2Cartesian(new Point(size.width, size.height)); double srcWidth = screenBR.x - screenLT.x; double srcHeight = screenBR.y - screenLT.y; double sx = srcWidth / destWidth; double sy = srcHeight / destHeight; double coef = Math.min(sx, sy); coef = snapScale(coef); scaleView(coef, coef, false); Point2D.Double projectedScreenCenter = screen2Cartesian(new Point(0, 0)); translateView(projectedScreenCenter.x - centre.x, projectedScreenCenter.y - centre.y, true); repaint(); }
@Execute public void process() throws Exception { checkNull(inPath, inServiceUrl, pEpsg, pMinzoom, pMaxzoom, pWest, pEast, pSouth, pNorth); CoordinateReferenceSystem boundsCrs = CRS.decode(pEpsg); CoordinateReferenceSystem mercatorCrs = CRS.decode(EPSG_MERCATOR); CoordinateReferenceSystem latLongCrs = CRS.decode(EPSG_LATLONG); ReferencedEnvelope inBounds = new ReferencedEnvelope(pWest, pEast, pSouth, pNorth, boundsCrs); MathTransform in2MercatorTransform = CRS.findMathTransform(boundsCrs, mercatorCrs); Envelope mercatorEnvelope = JTS.transform(inBounds, in2MercatorTransform); ReferencedEnvelope mercatorBounds = new ReferencedEnvelope(mercatorEnvelope, mercatorCrs); MathTransform transform = CRS.findMathTransform(boundsCrs, latLongCrs); Envelope latLongBounds = JTS.transform(inBounds, transform); Coordinate latLongCentre = latLongBounds.centre(); File inFolder = new File(inPath); File baseFolder = new File(inFolder, pName); double w = latLongBounds.getMinX(); double s = latLongBounds.getMinY(); double e = latLongBounds.getMaxX(); double n = latLongBounds.getMaxY(); GlobalMercator mercator = new GlobalMercator(); for (int z = pMinzoom; z <= pMaxzoom; z++) { // get ul and lr tile number in GOOGLE tiles int[] llTileXY = mercator.GoogleTile(s, w, z); int[] urTileXY = mercator.GoogleTile(n, e, z); int startXTile = Math.min(llTileXY[0], urTileXY[0]); int endXTile = Math.max(llTileXY[0], urTileXY[0]); int startYTile = Math.min(llTileXY[1], urTileXY[1]); int endYTile = Math.max(llTileXY[1], urTileXY[1]); int tileNum = 0; ReferencedEnvelope levelBounds = new ReferencedEnvelope(); pm.beginTask("Generating tiles at zoom level: " + z, (endXTile - startXTile + 1)); for (int i = startXTile; i <= endXTile; i++) { for (int j = startYTile; j <= endYTile; j++) { tileNum++; double[] bounds = mercator.TileLatLonBounds(i, j, z); double west = bounds[0]; double south = bounds[1]; double east = bounds[2]; double north = bounds[3]; ReferencedEnvelope tmpBounds = new ReferencedEnvelope(west, east, south, north, latLongCrs); levelBounds.expandToInclude(tmpBounds); if (!doDryrun) { int[] onlineTileNumbers = {i, j}; int[] fileNameTileNumbers = {i, j}; // switch( pType ) { // case 1: // need to convert in TMS format int[] tmsNUms = mercator.TMSTileFromGoogleTile(i, j, z); fileNameTileNumbers = tmsNUms; // break; // case 0: // default: // break; // } File imageFolder = new File(baseFolder, z + "/" + fileNameTileNumbers[0]); if (!imageFolder.exists()) { if (!imageFolder.mkdirs()) { throw new ModelsIOException("Unable to create folder:" + imageFolder, this); } } File imageFile = new File(imageFolder, fileNameTileNumbers[1] + ".png"); if (imageFile.exists()) { continue; } String tmp = inServiceUrl.replaceFirst("ZZZ", String.valueOf(z)); tmp = tmp.replaceFirst("XXX", String.valueOf(onlineTileNumbers[0])); tmp = tmp.replaceFirst("YYY", String.valueOf(onlineTileNumbers[1])); // System.out.println(tmp); URL url = new URL(tmp); InputStream imgStream = null; OutputStream out = null; try { imgStream = url.openStream(); out = new FileOutputStream(imageFile); int read = 0; byte[] bytes = new byte[1024]; while ((read = imgStream.read(bytes)) != -1) { out.write(bytes, 0, read); } } catch (Exception ex) { pm.errorMessage("Unable to get image: " + tmp); } finally { if (imgStream != null) imgStream.close(); if (out != null) { out.flush(); out.close(); } } } } pm.worked(1); } pm.done(); pm.message("Zoom level: " + z + " has " + tileNum + " tiles."); pm.message("Boundary covered at Zoom level: " + z + ": " + levelBounds); pm.message("Total boundary wanted: " + mercatorBounds); } StringBuilder properties = new StringBuilder(); properties.append("url=").append(pName).append("/ZZZ/XXX/YYY.png\n"); properties.append("minzoom=").append(pMinzoom).append("\n"); properties.append("maxzoom=").append(pMaxzoom).append("\n"); properties .append("center=") .append(latLongCentre.x) .append(" ") .append(latLongCentre.y) .append("\n"); properties.append("type=tms").append("\n"); File propFile = new File(inFolder, pName + ".mapurl"); FileUtilities.writeFile(properties.toString(), propFile); }
/** * Draws grid similarly to the "world" version, but with some changes: - Center the grid on the * screen - label the grid lines in CRS units - outline the grid * * @param context * @param showLabels is true, the bottom and right edges of the map are covered with white strips, * and labels for the grid lines are placed in the white strips. */ private void drawGrid(MapGraphicContext context, boolean showLabels) { GridStyle style = getStyle(context.getLayer()); double[] gridSize = style.getGridSize(); try { MathTransform mt = CRS.findMathTransform(DefaultGeographicCRS.WGS84, context.getCRS(), true); if (!mt.isIdentity()) { double x = gridSize[0] / 2.0; double y = gridSize[1] / 2.0; double[] toTransform = new double[] {-x, -y, x, y}; double[] dest = new double[4]; mt.transform(toTransform, 0, dest, 0, 2); gridSize = new double[] {Math.abs(dest[2] - dest[0]), Math.abs(dest[3] - dest[1])}; } } catch (Exception e) { MapGraphicPlugin.log("", e); // $NON-NLS-1$ } Envelope bounds = context.getViewportModel().getBounds(); Coordinate centerCoord = bounds.centre(); gridSize = style.getGridSize(); Coordinate topLeftCenterCoord = new Coordinate(centerCoord.x - gridSize[0] / 2, centerCoord.y + gridSize[1] / 2); Coordinate topLeftMostCoord = new Coordinate(topLeftCenterCoord); while (topLeftMostCoord.x - gridSize[0] > bounds.getMinX()) { topLeftMostCoord.x -= gridSize[0]; } while (topLeftMostCoord.y + gridSize[1] < bounds.getMaxY()) { topLeftMostCoord.y += gridSize[1]; } Coordinate coord = topLeftMostCoord; ViewportGraphics graphics = context.getGraphics(); int mapPixelWidth = context.getMapDisplay().getWidth(); int mapPixelHeight = context.getMapDisplay().getHeight(); // cover the right side and bottom of map with thin strips final int RIGHT_STRIP_WIDTH = (int) (mapPixelWidth * 0.05); final int BOTTOM_STRIP_HEIGHT = (int) (mapPixelHeight * 0.03); final int GRID_LINE_EXTENSION = (int) (RIGHT_STRIP_WIDTH * 0.1); graphics.setColor(Color.white); graphics.fillRect(mapPixelWidth - RIGHT_STRIP_WIDTH, 0, RIGHT_STRIP_WIDTH, mapPixelHeight); graphics.fillRect(0, mapPixelHeight - BOTTOM_STRIP_HEIGHT, mapPixelWidth, BOTTOM_STRIP_HEIGHT); // draw grid lines graphics.setColor(style.getColor()); Point pixel = null; while (true) { pixel = context.worldToPixel(coord); coord.x += gridSize[0]; coord.y -= gridSize[1]; Point next = context.worldToPixel(coord); if (next.x - pixel.x < 2 || next.y - pixel.y < 2) { context.getLayer().setStatus(ILayer.WARNING); context.getLayer().setStatusMessage(Messages.GridMapGraphic_grids_too_close); break; } if ((pixel.x >= mapPixelWidth && pixel.y >= mapPixelHeight)) break; // draw vertical lines and labels if (pixel.x < mapPixelWidth) graphics.drawLine( pixel.x, 0, pixel.x, mapPixelHeight - BOTTOM_STRIP_HEIGHT + GRID_LINE_EXTENSION); if (showLabels) { graphics.drawString( (int) (coord.y) + "", pixel.x, mapPixelHeight - BOTTOM_STRIP_HEIGHT + GRID_LINE_EXTENSION, ViewportGraphics.ALIGN_MIDDLE, ViewportGraphics.ALIGN_TOP); } // draw horizontal lines and labels if (pixel.y < mapPixelHeight) graphics.drawLine( 0, pixel.y, mapPixelWidth - RIGHT_STRIP_WIDTH + GRID_LINE_EXTENSION, pixel.y); if (showLabels) { graphics.drawString( (int) (coord.x) + "", mapPixelWidth - RIGHT_STRIP_WIDTH + GRID_LINE_EXTENSION, pixel.y, ViewportGraphics.ALIGN_LEFT, ViewportGraphics.ALIGN_MIDDLE); } pixel = next; } // outline the map graphics.drawRect( 0, 0, mapPixelWidth - RIGHT_STRIP_WIDTH, mapPixelHeight - BOTTOM_STRIP_HEIGHT); }