废话不多说,直接上代码

地图裁剪器,可以将图片裁剪成瓦片数据,主要用途是将高清卫星图像裁剪成瓦片图,可以做离线地图的开发,基于墨卡托坐标

地图裁剪

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();}
}

地图裁剪器,可以将图片裁剪成瓦片数据,主要用途是将高清卫星图像裁剪成瓦片图,可以做离线地图的开发,基于墨卡托坐标相关推荐

  1. 伊犁哈萨克自治州谷歌高清卫星地图下载

    一.概述 伊犁哈萨克自治州,简称伊犁.伊犁州,地处新疆维吾尔自治区西部天山北部的伊犁河谷内,成立于1954年,是全国唯一的既辖地级行政区,又辖县级行政区的自治州,也是全国唯一的副省级自治州. 伊犁得名 ...

  2. 湖南省株洲市谷歌高清卫星地图下载

    一.概述 株洲,古称"建宁",湖南省辖地级市.位于长沙市东南部40公里处,湘江下游,东接江西省萍乡市.莲花县.永新县及井冈山市,南连省内衡阳.郴州二市,西接湘潭市,北与长沙市毗邻. ...

  3. 黑龙江省佳木斯市谷歌高清卫星地图下载

       一.概述 佳木斯,简称佳市,隶属于黑龙江省,是黑龙江省省域副中心城市,原合江省省会,原黑龙江生产建设兵团司令部所在地. 佳木斯是中国东极,是黑龙江省东北部地区政治.经济.科技.文化教育.医疗.商 ...

  4. 黑龙江省七台河市谷歌高清卫星地图下载

       一.概述 七台河,位于黑龙江省东部,是黑龙江省最年轻的地级市,南与鸡西市.牡丹江市相邻,北接佳木斯市.鹤岗市,东连双鸭山市,西通哈尔滨市,周边有13个县.7个国营农场,铁路交通便利.七台河195 ...

  5. 内蒙古自治区呼和浩特市谷歌高清卫星地图下载

    一.概述 呼和浩特,通称呼市,旧称归绥,是内蒙古自治区首府和政治.经济.文化中心,国家历史文化名城,我国北方沿边地区重要的中心城市 .地处中国北部边疆,欧亚大陆内部. 呼和浩特有着悠久的历史和光辉灿烂 ...

  6. 黑龙江省绥化市谷歌高清卫星地图下载

       一.概述 绥化市位于黑龙江省中部偏西南部,是黑龙江省的地级市.黑龙江省重要的交通枢纽,也是全省六大客货运中转中心之一.哈尔滨以北的区域性中心城市,哈长城市群的重要节点城市,有着中国"北 ...

  7. 山东省济南市谷歌高清卫星地图下载

          一.概述 济南市,简称"济",别称"泉城",是山东省省会. 全国十五个副省级城市之一,环渤海地区南翼的中心城市,山东省的政治.文化.教育.经济.交通 ...

  8. 河南省周口市谷歌高清卫星地图下载

       一.概述 周口市,河南省辖地级市,位于中国河南省东南部,地处沙河.颍河.贾鲁河交汇处.古属陈国.战国末期,一度为楚国都城.陈胜吴广曾在此建立张楚政权.两汉以来,历代以淮阳为中心设郡置府.明清时期 ...

  9. 山东省淄博市谷歌高清卫星地图下载

            一.概述 淄博(Zibo),简称"淄",位于中国华东地区.山东省中部,淄博市地处黄河三角洲高效生态经济区.山东半岛蓝色经济区两大国家战略经济区与山东省会城市群经济圈 ...

最新文章

  1. mooc python_MOOC python笔记(一):python语言概述
  2. python问题:IndentationError:expected an indented block错误解决
  3. 用java编写五子棋游戏_java编写一个五子棋游戏,拜托了
  4. bat文件注册为Windows服务与依赖关系设置
  5. Codeblocks配置EGE图形库
  6. 教师计算机应用测试题,教师计算机等级考试模拟考试题演示教学
  7. Spring组件扫描context:component-scan/使用详解
  8. Loadrunner学习笔记(四)
  9. 荣耀V40将采用300Hz 触控采样率,1月18日正式发布!
  10. 【PTA】520 钻石争霸赛 2021,119分
  11. 用python打印心形_Python和Js打印心形
  12. html中字体 楷体_HTML字体集锦-
  13. 【官方文档】Fluent Bit 安装
  14. 虚拟打印机安装后没了该怎么办
  15. 适合我的前端学习路线(学习前端不迷路)
  16. Window安装RabbitMQ并设置为开机启动
  17. 九峰影业创始人_九峰百度百科
  18. 升级JSONB列式存储,Hologres助力淘宝搜索2022双11降本增效!
  19. 聚合函数,数学、字符串、函数,时间日期函数
  20. 现在主流免杀是源码免杀

热门文章

  1. 云服务器训练神经网络
  2. 负重前行的婚纱线上路 - i天下网商-最具深度的电商知识媒体
  3. A卡 HD5770(HD6770) Readon HD 5xxx 6xxx系列显卡黑苹果MOJAVE CATALINA QE/CI驱动教程
  4. c语言上机试题8,7-8-C语言上机考试试题2.doc
  5. 关于构建工具网站的摸索以及记录
  6. VS2008,C++,镜子反射 光线反射游戏
  7. 电商RPA | 董明珠接班人带货引争议,达人资源有多难得?
  8. 诺基亚7原生android,诺基亚7快速上手体验:蔡司镜头回归,原生Android味
  9. 快速刷新页面ajax出现404,react使用BrowserRouter打包后,刷新页面出现404
  10. mysql打开注册表命令_怎么打开注册表文件?