java graphic2D 矩形文字居中

这篇博客展示了如何使用Java的Graphic2D在地图上绘制带有文字的矩形格子,并实现文字居中以及根据级别填充不同颜色。代码中包含了地图坐标转换、矩形边框绘制、文字对齐和颜色透明度设置等关键步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

要实现在地图上画N个方格,有文字并居中,颜色填充根据级别不一致,好久都没有做出来,请教了老大,终于搞定了,不多说,上代码:

/*
* 输出预报格网图
* width为图片宽度,height为输出图片高度,parameter为参数列表
* @see com.ffds.dispatching.situationAnalysis.service.SituationAnalysisService#getForecastGrid(int, int, java.util.HashMap)
*/
public BufferedImage getForecastGrid(int width,int height,HashMap<String,Object> parameters){
//设定底图初始范围
double minX =  MapUtil.convertMercatorX(1.257110322559409E7);
double minY =  MapUtil.convertMercatorY(2807811.819841969);
double maxX =  MapUtil.convertMercatorX(1.3293222258698823E7);
double maxY =  MapUtil.convertMercatorY(3529930.8529467015);
//定义返回值
BufferedImage forecastGrid = new BufferedImage(width, height,BufferedImage.TYPE_INT_RGB);
Graphics2D g2d = forecastGrid.createGraphics();
forecastGrid = g2d.getDeviceConfiguration().createCompatibleImage(width,height, Transparency.TRANSLUCENT);
g2d = forecastGrid.createGraphics();

List<HashMap<String,Object>> list = situatioinAnalysisDao.getForecastGrid(parameters);

double x = 0;
double y = 0;
double gridcellwidth = 0.277243;
double gridcellheight = 0.225;
int[] rw = MapUtil.getXYScreen(Double.valueOf(list.get(0).get("LONG_D").toString())-gridcellwidth,Double.valueOf(list.get(0).get("LAT_D").toString())+gridcellheight, maxX, maxY, minX, minY, width,height);
int[] rb = MapUtil.getXYScreen(Double.valueOf(list.get(0).get("LONG_D").toString())+gridcellwidth,Double.valueOf(list.get(0).get("LAT_D").toString())-gridcellheight, maxX, maxY, minX, minY, width,height);
int recWidth = rb[0]-rw[0];
int recHeight = -rw[1]+rb[1];
FontMetrics fm = null;
int stringWidth=0;
int stringAscent = 0;
int stringDescent = 0;
for (int i = 0; i < list.size(); i++) {
x = Double.valueOf(list.get(i).get("LONG_D").toString());
y = Double.valueOf(list.get(i).get("LAT_D").toString());
int[] screenXY = MapUtil.getXYScreen(x-gridcellwidth,y+gridcellheight, maxX, maxY, minX, minY, width,height);
//绘制边框
Rectangle2D r = new Rectangle2D.Double(screenXY[0],screenXY[1],recWidth,recHeight);
g2d.setColor(Color.BLACK);
g2d.draw(r);

//绘制文字,填充颜色
if(list.get(i).get("RN").equals("")){
g2d.drawString("0", screenXY[0]+recWidth/2, screenXY[1]+recHeight/2);
}else{
double rn = Double.valueOf(list.get(i).get("RN").toString());
Color color = null;
if (rn>0 && rn<5) {
color = new Color(169,237,150);
} else if(rn > 5 && rn <= 10){
color = new Color(58,188,52);
}else if(rn > 10 && rn <= 20){
color = new Color(65,161,212);
}else if(rn > 20 && rn <= 30){
color = new Color(57,189,221);
}else if(rn > 30 && rn <= 50){
color = new Color(6,0,254);
}else{
color = new Color(255,255,255);
}

g2d.setColor(color);
AlphaComposite ac = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.5f);
        g2d.setComposite(ac);
g2d.fillRect(screenXY[0]+1,screenXY[1]+1,recWidth-2,recHeight-2);
g2d.setColor(Color.BLACK);
fm = g2d.getFontMetrics();
stringWidth = fm.stringWidth(String.valueOf(rn)); 
stringAscent = fm.getAscent(); 
stringDescent = fm.getDescent (); 
g2d.drawString(String.valueOf(rn), screenXY[0]+recWidth/2-stringWidth / 2, screenXY[1]+recHeight/2+ (stringAscent - stringDescent) / 2);
}
}
return forecastGrid;
}

效果图如下:



评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值