地图裁剪器,可以将图片裁剪成瓦片数据,主要用途是将高清卫星图像裁剪成瓦片图,可以做离线地图的开发,基于墨卡托坐标
生活随笔
收集整理的這篇文章主要介紹了
地图裁剪器,可以将图片裁剪成瓦片数据,主要用途是将高清卫星图像裁剪成瓦片图,可以做离线地图的开发,基于墨卡托坐标
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
?廢話不多說,直接上代碼
地圖裁剪器,可以將圖片裁剪成瓦片數據,主要用途是將高清衛星圖像裁剪成瓦片圖,可以做離線地圖的開發,基于墨卡托坐標
地圖裁剪
package com.wwp.utils.map; import java.awt.Graphics2D; import java.awt.Image; import java.awt.Toolkit; import java.awt.Transparency; import java.awt.image.BufferedImage; import java.awt.image.CropImageFilter; import java.awt.image.FilteredImageSource; import java.awt.image.ImageFilter; import java.io.File;import javax.imageio.ImageIO; /*** ** class name: BMapCut* description:* authername:wangwenping* modified by: xx * modified time:* modified info :* @version 1.0.0**/ public class BMapCut {private int minlevel;private int maxlevel;private int piclevel;private double mercatorx;private double mercatory;private String pic;private String savepath;public BMapCut(String pic, double mercatorx, double mercatory,String savepath) {this.pic = pic;this.mercatorx = mercatorx;this.mercatory = mercatory;this.savepath = savepath;} /*** @param pic 圖片路徑* @param minlevel最小縮放等級* @param maxlevel最大縮放等級* @param piclevel 原圖所處縮放等級 * @param mercatorx 墨卡托x坐標* @param mercatory墨卡托y坐標* @param savepath輸出目錄*/public BMapCut(String pic, int minlevel, int maxlevel, int piclevel, double mercatorx,double mercatory, String savepath) {this.pic = pic;this.minlevel = minlevel;this.maxlevel = maxlevel;this.mercatorx = mercatorx;this.mercatory = mercatory;this.savepath = savepath;this.piclevel = piclevel;}public void cutterall() throws Exception {for (int i = minlevel; i <= maxlevel; i++) {cutterone(i);}}public void cutterone(int level) throws Exception {//圖片中心的像素坐標(pixelx,pixely),圖片中心的平面坐標即魔卡托坐標(mercatorx, mercatory)//像素坐標 = 平面坐標 * Math.pow(2, level - 18)double pixelx = mercatorx * Math.pow(2, level - 18);double pixely = mercatory * Math.pow(2, level - 18);System.out.println("pixelx : " + pixelx);System.out.println("pixely : " + pixely);BufferedImage bi = ImageIO.read(new File(pic));int width = bi.getWidth();int height = bi.getHeight();//圖片遵循原則:當前圖片所屬級別piclevel不縮放即像素級別相等。//按照公式縮放:當前級別圖片長度 = 原圖片長度 * Math.pow(2, level - piclevel)//minx: 圖片左下角x坐標//miny: 圖片左下角y坐標//maxx: 圖片右上角x坐標//maxy: 圖片右上角y坐標double minx = pixelx - width * Math.pow(2, level - piclevel) / 2;double miny = pixely - height * Math.pow(2, level - piclevel) / 2;double maxx = pixelx + width * Math.pow(2, level - piclevel) / 2;double maxy = pixely + height * Math.pow(2, level - piclevel) / 2;System.out.println("(minx,miny) = (" + minx + ", " + miny + ")" );System.out.println("(maxx,maxy) = (" + maxx + ", " + maxy + ")" );int neatminx = (int) minx / 256;int remminx = (int) minx % 256;int neatminy = (int) miny / 256;int remminy = (int) miny % 256 ;int neatmaxx = (int) maxx / 256;int remmaxx = 256 - (int) maxx % 256;int neatmaxy = (int) maxy / 256;int remmaxy = 256 - (int) maxy % 256;//(neatminx,neatminy)為圖片左下角最近的整數圖塊坐標,neatminx到neatmaxx即當前級別下切割圖塊的圖塊坐標x//(neatmaxx,neatmaxy)為圖片右上角最近的整數圖塊坐標,neatminy到neatmaxy即當前級別下切割圖塊的圖塊坐標ySystem.out.println("neatminx: " + neatminx);System.out.println("neatmaxx: " + neatmaxx);System.out.println("neatminy: " + neatminy);System.out.println("neatmaxy: " + neatmaxy);System.out.println("remminx width remmaxx : " + remminx + " "+ width + " "+ remmaxx );System.out.println("remminy height remmaxy : " + remminy + " " + height +" " + remmaxy );// 擴充原圖片為width * height --- > (remminx + width + remmaxx ) * (remminy +// height +remmaxy)int extendwidth = (neatmaxx - neatminx + 1 ) * 256;int extendheight = (neatmaxy - neatminy + 1 ) * 256;System.out.println("extendwidth: " + extendwidth);System.out.println("extendheight: " + extendheight);BufferedImage outputimage = null;Graphics2D g = bi.createGraphics();BufferedImage extend = g.getDeviceConfiguration().createCompatibleImage(extendwidth, extendheight, Transparency.TRANSLUCENT);g.dispose();g = extend.createGraphics();g.drawImage(extend, 0, 0, extendwidth, extendheight, null);g.drawImage(bi.getScaledInstance((int) (width * Math.pow(2, level - piclevel)), (int)(height * Math.pow(2, level - piclevel)), Image.SCALE_SMOOTH), remminx, remmaxy, null);//切割圖片,共( neatmaxx - neatminx + 1) * (neatmaxy - neatminy + 1)份 256*256圖片String dirname = savepath.substring(0, savepath.lastIndexOf("\\")) + "\\tiles\\" + level;System.out.println("dirname : " + dirname);File dir = new File(dirname);Image image = extend.getScaledInstance(extendwidth, extendheight, Image.SCALE_DEFAULT);if(dir.exists()) {System.out.println("創建目錄失敗!, 目錄已存在!");} else {if(dir.mkdirs()) {ImageIO.write(extend, "png", new File(dirname + savepath.substring(savepath.lastIndexOf("\\")) + ".png"));System.out.println("savepath : " + dirname + savepath.substring(savepath.lastIndexOf("\\")));System.out.println("extend success!");int w = neatmaxx - neatminx + 1;int h = neatmaxy - neatminy + 1;for(int i = 0; i < w; i++) {for(int j = 1; j <= h; j++) {ImageFilter cropfilter = new CropImageFilter(256 * i, 256* (h - j), 256, 256);Image img = Toolkit.getDefaultToolkit().createImage(new FilteredImageSource(image.getSource(),cropfilter));BufferedImage tag = new BufferedImage(256, 256 , BufferedImage.TYPE_INT_BGR);Graphics2D gs = tag.createGraphics();tag = gs.getDeviceConfiguration().createCompatibleImage(256, 256, Transparency.TRANSLUCENT);gs.dispose();gs = tag.createGraphics();gs.drawImage(img, 0, 0, null);g.dispose();String croppicname = dirname + "\\tile" + (neatminx + i) + "_" + (neatminy + j - 1) + ".png"; ImageIO.write(tag, "png", new File(croppicname));}}System.out.println("切割圖片成功!");} else {System.out.println("創建目錄失敗!");}}}public static void main(String[] args) throws Exception{BMapCut a=new BMapCut("C:\\Users\\Administrator\\Desktop\\geo\\123.png",16/*最小縮放等級*/,18/*最大縮放等級*/,18/*原圖所處縮放等級*/,12958175/*墨卡托x坐標*/,4825923.77/*墨卡托y坐標*/,"C:\\輸出目錄");a.cutterall();} }總結
以上是生活随笔為你收集整理的地图裁剪器,可以将图片裁剪成瓦片数据,主要用途是将高清卫星图像裁剪成瓦片图,可以做离线地图的开发,基于墨卡托坐标的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: windows 记得pin码 忘记登录密
- 下一篇: 修炼内功——理解函数栈帧创建和销毁