BMapTileCutter(Java切图工具)

简介: BMapTileCutter(Java切图工具)

程序是用Java Web实现, struts2文件标签和简单Js调用。

实现核心代码
1.TileUtils.java
复制代码
1 package com.xiefei.core;
2
3 import java.awt.Graphics2D;
4 import java.awt.Image;
5 import java.awt.Toolkit;
6 import java.awt.Transparency;
7 import java.awt.image.BufferedImage;
8 import java.awt.image.CropImageFilter;
9 import java.awt.image.FilteredImageSource;
10 import java.awt.image.ImageFilter;
11 import java.io.File;
12
13 import javax.imageio.ImageIO;
14
15 public class TileUtils {
16 private int minLevel;
17 private int maxLevel;
18 private int picLevel;
19 private double mercatorX;
20 private double mercatorY;
21 private String pic;
22 private String savePath;
//代码效果参考:http://www.zidongmutanji.com/bxxx/216116.html

24 public TileUtils(String pic, double mercatorX, double mercatorY,
25 String savePath) {
26 this.pic = pic;
27 this.mercatorX = mercatorX;
28 this.mercatorY = mercatorY;
29 this.savePath = savePath;
30 }
31
32 public TileUtils(String pic, int minLevel, int maxLevel, int picLevel, double mercatorX,
33 double mercatorY, String savePath) {
34 this.pic = pic;
35 this.minLevel = minLevel;
36 this.maxLevel = maxLevel;
37 this.mercatorX = mercatorX;
38 this.mercatorY = mercatorY;
39 this.savePath = savePath;
40 this.picLevel = picLevel;
41 }
42
43 public void cutterAll() throws Exception {
44 for (int i = minLevel; i <= maxLevel; i++) {
45 cutterOne(i);
46 }
47 }
48
49 public void cutterOne(int level) throws Exception {
50 //图片中心的像素坐标(pixelX,pixelY),图片中心的平面坐标即魔卡托坐标(mercatorX, mercatorY)
51 //像素坐标 = 平面坐标 Math.pow(2, level - 18)
52 double pixelX = mercatorX
Math.pow(2, level - 18);
53 double pixelY = mercatorY Math.pow(2, level - 18);
54 System.out.println("pixelX : " + pixelX);
55 System.out.println("pixelY : " + pixelY);
56 BufferedImage bi = ImageIO.read(new File(pic));
57 int width = bi.getWidth();
58 int height = bi.getHeight();
59 //图片遵循原则:当前图片所属级别picLevel不缩放即像素级别相等。
60 //按照公式缩放:当前级别图片长度 = 原图片长度
Math.pow(2, level - picLevel)
61 //minX: 图片左下角X坐标
62 //minY: 图片左下角Y坐标
63 //maxX: 图片右上角X坐标
64 //maxY: 图片右上角Y坐标
65 double minX = pixelX - width Math.pow(2, level - picLevel) / 2;
66 double minY = pixelY - height
Math.pow(2, level - picLevel) / 2;
67 double maxX = pixelX + width Math.pow(2, level - picLevel) / 2;
68 double maxY = pixelY + height
Math.pow(2, level - picLevel) / 2;
69 System.out.println("(minX,minY) = (" + minX + ", " + minY + ")" );
70 System.out.println("(maxX,maxY) = (" + maxX + ", " + maxY + ")" );
71 int neatMinX = (int) minX / 256;
72 int remMinX = (int) minX % 256;
73 int neatMinY = (int) minY / 256;
74 int remMinY = (int) minY % 256 ;
75
76 int neatMaxX = (int) maxX / 256;
77 int remMaxX = 256 - (int) maxX % 256;
78 int neatMaxY = (int) maxY / 256;
79 int remMaxY = 256 - (int) maxY % 256;
80 //(neatMinX,neatMinY)为图片左下角最近的整数图块坐标,neatMinX到neatMaxX即当前级别下切割图块的图块坐标x
81 //(neatMaxX,neatMaxY)为图片右上角最近的整数图块坐标,neatMinY到neatMaxY即当前级别下切割图块的图块坐标y
82 System.out.println("neatMinX: " + neatMinX);
83 System.out.println("neatMaxX: " + neatMaxX);
84 System.out.println("neatMinY: " + neatMinY);
85 System.out.println("neatMaxY: " + neatMaxY);
86 System.out.println("remMinX width remMaxX : " + remMinX + " "+ width + " "+ remMaxX );
87 System.out.println("remMinY height remMaxY : " + remMinY + " " + height +" " + remMaxY );
88
89 // 扩充原图片为width height --- > (remMinX + width + remMaxX ) (remMinY +
90 // height +remMaxY)
91 int extendWidth = (neatMaxX - neatMinX + 1 ) 256;
92 int extendHeight = (neatMaxY - neatMinY + 1 )
256;
93 System.out.println("extendWidth: " + extendWidth);
94 System.out.println("extendHeight: " + extendHeight);
95
96 BufferedImage outputImage = null;
97 Graphics2D g = bi.createGraphics();
98 BufferedImage extend = g.getDeviceConfiguration().createCompatibleImage(extendWidth, extendHeight, Transparency.TRANSLUCENT);
99 g.dispose();
100 g = extend.createGraphics();
101 g.drawImage(extend, 0, 0, extendWidth, extendHeight, null);
102 g.drawImage(bi, remMinX, remMaxY, (int) (width Math.pow(2, level - picLevel)), (int)(height Math.pow(2, level - picLevel)), null);
103 outputImage = extend;
104
105 //切割图片,共( neatMaxX - neatMinX + 1) (neatMaxY - neatMinY + 1)份 256256图片
106 String dirName = savePath.substring(0, savePath.lastIndexOf("\")) + "\tiles\" + level;
107 System.out.println("dirName : " + dirName);
//代码效果参考:http://www.zidongmutanji.com/bxxx/22470.html

109
110 File dir = new File(dirName);
111 Image image = extend.getScaledInstance(extendWidth, extendHeight, Image.SCALE_DEFAULT);
112 if(dir.exists()) {
113 System.out.println("创建目录失败!, 目录已存在!");
114 } else {
115 if(dir.mkdirs()) {
116 ImageIO.write(extend, "png", new File(dirName + savePath.substring(savePath.lastIndexOf("\"))));
117 System.out.println("savePath : " + dirName + savePath.substring(savePath.lastIndexOf("\")));
118 System.out.println("Extend success!");
119 int w = neatMaxX - neatMinX + 1;
120 int h = neatMaxY - neatMinY + 1;
121 for(int i = 0; i < w; i++) {
122 for(int j = 1; j <= h; j++) {
123 ImageFilter cropFilter = new CropImageFilter(256 i, 256 (h - j), 256, 256);
124 Image img = Toolkit.getDefaultToolkit().createImage(new FilteredImageSource(image.getSource(),cropFilter));
125 BufferedImage tag = new BufferedImage(256, 256 , BufferedImage.TYPE_INTBGR);
126 Graphics2D gs = tag.createGraphics();
127 tag = gs.getDeviceConfiguration().createCompatibleImage(256, 256, Transparency.TRANSLUCENT);
128 gs.dispose();
129 gs = tag.createGraphics();
130 gs.drawImage(img, 0, 0, null);
131 g.dispose();
132 String cropPicName = dirName + "\tile" + (neatMinX + i) + "
" + (neatMinY + j - 1) + ".png";
133 ImageIO.write(tag, "png", new File(cropPicName));
134 }
135 }
136 System.out.println("切割图片成功!");
137 } else {
138 System.out.println("创建目录失败!");
139 }
140 }
141 }
142
143 }
代码的核心思想是将原图片外围拓展成256整数倍长度(最小包围),即源代码中的extendWidth extendHeight图片长度,然后再横竖切割成多个256256的瓦片图块。
2.index.jsp(切割图片主页)
1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
2 <%
3 String path = request.getContextPath();
4 String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
5 %>
6 <%@ taglib prefix="s" uri="/struts-tags" %>
7 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
8


9
10
11
12
13
14
15
16
17
18
19
45
46
47
48
51
52
53 请选择需要切图的图片来源

54 图片中心的经度坐标

55 图片中心的纬度坐标

56
57
58 最小级别
59
60 16
61 17
62 18
63 19
64

65 最大级别
66
67 16
68 17
69 18
70 19
71

72 图片所在级别
73
74 16
75 17
76 18
77 19
78

79 请选择输出目录
80
81

82
83
相关文章
|
24天前
|
Arthas Java 测试技术
Java字节码文件、组成,jclasslib插件、阿里arthas工具,Java注解
Java字节码文件、组成、详解、分析;常用工具,jclasslib插件、阿里arthas工具;如何定位线上问题;Java注解
Java字节码文件、组成,jclasslib插件、阿里arthas工具,Java注解
|
19天前
|
监控 IDE Java
【Java性能调优新工具】JDK 22性能分析器:深度剖析,优化无死角!
【9月更文挑战第9天】JDK 22中的性能分析器为Java应用的性能调优提供了强大的支持。通过深度集成、全面监控、精细化分析和灵活报告生成等核心优势,性能分析器帮助开发者实现了对应用性能的全面掌控和深度优化。在未来的Java开发过程中,我们期待性能分析器能够继续发挥重要作用,为Java应用的性能提升贡献更多力量。
|
19天前
|
Java 数据处理
技术分享:高效与灵活并存——Java版通用树形结构转换工具的实现与应用
在软件开发中,树形结构的数据表现形式无处不在,从文件系统的目录树到组织架构的部门树,再到各类产品的分类结构。处理这些具有层级关系的数据时,将其转换为树形结构以便展示和操作显得尤为重要。Java作为一门成熟的编程语言,虽然提供了强大的集合框架,但并未直接提供树形结构转换的内置工具。因此,开发一个高效且灵活的通用树形结构转换工具成为许多项目中的必备需求。
26 2
|
19天前
|
安全 Java 数据安全/隐私保护
- 代码加密混淆工具-Java 编程安全性
在Java编程领域,保护代码安全与知识产权至关重要。本文探讨了代码加密混淆工具的重要性,并介绍了五款流行工具:ProGuard、DexGuard、Jscrambler、DashO 和 Ipa Guard。这些工具通过压缩、优化、混淆和加密等手段,提升代码安全性,保护知识产权。ProGuard 是开源工具,用于压缩和混淆Java代码;DexGuard 专为Android应用程序设计,提供强大加密功能;Jscrambler 基于云,保护Web和移动应用的JavaScript及HTML5代码;DashO 支持多种Java平台和
45 1
|
1月前
|
XML 存储 JSON
【IO面试题 六】、 除了Java自带的序列化之外,你还了解哪些序列化工具?
除了Java自带的序列化,常见的序列化工具还包括JSON(如jackson、gson、fastjson)、Protobuf、Thrift和Avro,各具特点,适用于不同的应用场景和性能需求。
|
1月前
|
Java 持续交付 项目管理
Maven是一款基于Apache许可的项目管理和构建自动化工具,在Java开发中极为流行。
Maven是一款基于Apache许可的项目管理和构建自动化工具,在Java开发中极为流行。它采用项目对象模型(POM)来描述项目,简化构建流程。Maven提供依赖管理、标准构建生命周期、插件扩展等功能,支持多模块项目及版本控制。在Java Web开发中,Maven能够自动生成项目结构、管理依赖、自动化构建流程并运行多种插件任务,如代码质量检查和单元测试。遵循Maven的最佳实践,结合持续集成工具,可以显著提升开发效率和项目质量。
40 1
|
1月前
|
Java
在Java编程的广阔天地中,条件语句是控制程序流程、实现逻辑判断的重要工具。
在Java编程中,if-else与switch作为核心条件语句,各具特色。if-else以其高度灵活性,适用于复杂逻辑判断,支持多种条件组合;而switch在多分支选择上表现优异,尤其适合处理枚举类型或固定选项集,通过内部跳转表提高执行效率。两者各有千秋:if-else擅长复杂逻辑,switch则在多分支选择中更胜一筹。理解它们的特点并在合适场景下使用,能够编写出更高效、易读的Java代码。
31 1
|
1月前
|
并行计算 Java API
Java中的Lambda表达式:简化代码的现代工具
在Java 8中引入的Lambda表达式,为函数式编程范式铺平了道路,提供了一种更简洁、更灵活的编写匿名方法的方式。本文将深入探讨Lambda表达式如何优化代码结构,提高开发效率,并通过具体示例展示其在实际应用中的魔力。
38 3
|
2月前
|
算法 数据可视化 Java
JAVA规则引擎工具有哪些?
本文对比分析了六种Java规则引擎:Drools、IBM ODM (JRules)、Easy Rules、JBPM、OpenL Tablets以及Apache Camel结合规则组件的应用。Drools是一款功能全面的业务规则管理系统,支持DRL文件定义规则、高效的规则匹配算法、复杂的规则流及决策表,并易于与Java应用集成。IBM ODM (原JRules)提供了强大的规则管理功能,包括Web界面和Eclipse插件定义管理规则、直观的决策表和决策树、REST和Java API集成选项及优化的性能。
259 3
|
2月前
|
Java 关系型数据库 开发工具
Java开发者必备技能与工具:构建高效开发环境的指南
【7月更文挑战第23天】作为Java开发者,掌握核心技能、熟练使用开发工具与框架、不断提升自己的软技能是构建高效开发环境的关键。希望本文能够为广大Java开发者提供一些有价值的参考和启示,助力大家在Java开发的道路上越走越远。