目录
环境说明
Java实现画地图,自己的工作并没有涉及此业务,完全是兴趣开源了一个库,如果有兴趣点个小星星吧
https://github.com/tanhuang2016/JMap
先上成果图,这是最常见的地图可视化
以下示例需要用到的依赖
<dependencies>
<dependency>
<groupId>io.github.tanhuang2016</groupId>
<artifactId>jmap</artifactId>
<version>1.0.1</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.73</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.9</version>
</dependency>
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.3</version>
</dependency>
</dependencies>
其中jmap是地图渲染工具GitHub - tanhuang2016/JMap: 用Java绘制地图
一.先把图层结构绘制出来
我这里就给标题,地图,图例分为三块,分别用不同颜色填充背景,这样方便调试位置
import xyz.hashdog.dm.bean.*;
import xyz.hashdog.dm.draw.JMap;
import xyz.hashdog.dm.draw.JMaps;
import xyz.hashdog.jmap.demo.Utils;
import java.util.ArrayList;
import java.util.List;
public class ChongQingHousingPrice {
private final static String out= Utils.getOutDataDir(ChongQingHousingPrice.class) + "/重庆房价test.png";
public static void main(String[] args) {
//创建主图
MainPic mainPic = new MainPic();
//设置图片宽高
mainPic.setWidth(2000);
mainPic.setHight(2000);
//设置背景色
mainPic.setFaceColor("#DCDCDC");
//设置透明度
mainPic.setAlpha(0.5f);
List<SubPicLayer> subPicLayerList = new ArrayList<>();
//设置地图图层
subPicLayerList.add(new SubPicLayer(){{
setFaceColor("#FFC0CB");
setLeft(100);
setTop(300);
setWidth(1600);
setHight(1600);
setAlpha(1f);
setZorder(50);
}});
//设置标题图层
subPicLayerList.add(new SubPicLayer(){{
setFaceColor("#00008B");
setLeft(0);
setTop(50);
setWidth(2000);
setHight(250);
setAlpha(1f);
}});
//设置图例图层
subPicLayerList.add(new SubPicLayer(){{
setFaceColor("#2da7ff");
setLeft(1780);
setTop(1100);
setWidth(200);
setHight(750);
setAlpha(1f);
}});
mainPic.setSubPicLayers(subPicLayerList);
mainPic.setMapPics(new ArrayList<MapPic>());
mainPic.setTexts(new ArrayList<Text>());
mainPic.setPics(new ArrayList<Pic>());
JMap jMap= JMaps.newSimpleMapHelper(mainPic);
jMap.plot().out(out);
long end = System.currentTimeMillis();
}
}
效果如下,已经大致分好了区域,三个子图层都叠加在主图之上
二.叠加地图边界
import xyz.hashdog.dm.bean.*;
import xyz.hashdog.dm.draw.JMap;
import xyz.hashdog.dm.draw.JMaps;
import xyz.hashdog.jmap.demo.Utils;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
public class ChongQingHousingPrice {
private final static String out= Utils.getOutDataDir(ChongQingHousingPrice.class) + "/重庆房价test.png";
private final static String cqjson= Utils.getGeoJson("ChongQing") ;
public static void main(String[] args) throws IOException {
//创建主图
MainPic mainPic = new MainPic();
//设置图片宽高
mainPic.setWidth(2000);
mainPic.setHight(2000);
//设置背景色
mainPic.setFaceColor("#DCDCDC");
//设置透明度
mainPic.setAlpha(0.5f);
List<SubPicLayer> subPicLayerList = new ArrayList<>();
//设置地图图层
subPicLayerList.add(new SubPicLayer(){{
setFaceColor("#FFC0CB");
setLeft(100);
setTop(300);
setWidth(1600);
setHight(1600);
setAlpha(1f);
setZorder(50);
}});
//设置标题图层
subPicLayerList.add(new SubPicLayer(){{
setFaceColor("#00008B");
setLeft(0);
setTop(50);
setWidth(2000);
setHight(250);
setAlpha(1f);
}});
//设置图例图层
subPicLayerList.add(new SubPicLayer(){{
setFaceColor("#2da7ff");
setLeft(1780);
setTop(1100);
setWidth(200);
setHight(750);
setAlpha(1f);
}});
mainPic.setSubPicLayers(subPicLayerList);
mainPic.setMapPics(new ArrayList<MapPic>());
mainPic.setTexts(new ArrayList<Text>());
mainPic.setPics(new ArrayList<Pic>());
final List<MapBorder> mapBorders = Utils.mapBordersByGeo(cqjson);
List<MapPic> mapPicList = new ArrayList<>();
mapPicList.add(new MapPic(){{
setMapBorders(mapBorders);
setZoomWeight(1);
}});
mainPic.setMapPics(mapPicList);
JMap jMap= JMaps.newSimpleMapHelper(mainPic);
jMap.plot().out(out);
long end = System.currentTimeMillis();
}
}
设置地图边界后效果如下,基本地图轮廓已经绘制,默认绘制在第一个子图层上,也可以指定使用那个图层setSubPicIndex();
三.叠县名和各县房价
package xyz.hashdog.jmap.demo.simple;
import xyz.hashdog.dm.bean.*;
import xyz.hashdog.dm.draw.JMap;
import xyz.hashdog.dm.draw.JMaps;
import xyz.hashdog.dm.util.ImageUtil;
import xyz.hashdog.jmap.demo.Utils;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
public class ChongQingHousingPrice {
private final static String out= Utils.getOutDataDir(ChongQingHousingPrice.class) + "/重庆房价test.png";
private final static String cqjson= Utils.getGeoJson("ChongQing") ;
private final static String fjjson= Utils.getJsonString("2022-03重庆房价") ;
public static void main(String[] args) throws IOException {
//创建主图
MainPic mainPic = new MainPic();
//设置图片宽高
mainPic.setWidth(2000);
mainPic.setHight(2000);
//设置背景色
mainPic.setFaceColor("#DCDCDC");
//设置透明度
mainPic.setAlpha(0.5f);
List<SubPicLayer> subPicLayerList = new ArrayList<>();
//设置地图图层
subPicLayerList.add(new SubPicLayer(){{
setFaceColor("#FFC0CB");
setLeft(100);
setTop(300);
setWidth(1600);
setHight(1600);
setAlpha(1f);
setZorder(50);
}});
//设置标题图层
subPicLayerList.add(new SubPicLayer(){{
setFaceColor("#00008B");
setLeft(0);
setTop(50);
setWidth(2000);
setHight(250);
setAlpha(1f);
}});
//设置图例图层
subPicLayerList.add(new SubPicLayer(){{
setFaceColor("#2da7ff");
setLeft(1780);
setTop(1100);
setWidth(200);
setHight(750);
setAlpha(1f);
}});
mainPic.setSubPicLayers(subPicLayerList);
mainPic.setMapPics(new ArrayList<MapPic>());
mainPic.setTexts(new ArrayList<Text>());
mainPic.setPics(new ArrayList<Pic>());
//边界
final List<MapBorder> mapBorders = Utils.mapBordersByGeo(cqjson);
//县名
final List<MapText> mapCounty = Utils.mapCountyNameByGeo(cqjson);
//房价
final List<MapText> mapFj = Utils.mapFj(cqjson,fjjson);
//县名和房价叠加
mapCounty.addAll(mapFj);
List<MapPic> mapPicList = new ArrayList<>();
mapPicList.add(new MapPic(){{
setMapBorders(mapBorders);
setMapTexts(mapCounty);
setZoomWeight(1);
}});
mainPic.setMapPics(mapPicList);
long start = System.currentTimeMillis();
JMap jMap= JMaps.newSimpleMapHelper(mainPic);
jMap.plot().out(out);
long end = System.currentTimeMillis();
System.out.println("耗时:"+(end-start));
}
}
效果如下,县名和房价是按行政中心经纬度偏移叠加上的,具体以经纬度位置为准
四. 地图按房价填色
package xyz.hashdog.jmap.demo.simple;
import xyz.hashdog.dm.bean.*;
import xyz.hashdog.dm.draw.JMap;
import xyz.hashdog.dm.draw.JMaps;
import xyz.hashdog.dm.util.ImageUtil;
import xyz.hashdog.jmap.demo.Utils;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
public class ChongQingHousingPrice {
private final static String out= Utils.getOutDataDir(ChongQingHousingPrice.class) + "/重庆房价test.png";
private final static String cqjson= Utils.getGeoJson("ChongQing") ;
private final static String fjjson= Utils.getJsonString("2022-03重庆房价") ;
public static void main(String[] args) throws IOException {
//创建主图
MainPic mainPic = new MainPic();
//设置图片宽高
mainPic.setWidth(2000);
mainPic.setHight(2000);
//设置背景色
mainPic.setFaceColor("#DCDCDC");
//设置透明度
mainPic.setAlpha(0.5f);
List<SubPicLayer> subPicLayerList = new ArrayList<>();
//设置地图图层
subPicLayerList.add(new SubPicLayer(){{
setFaceColor("#FFC0CB");
setLeft(100);
setTop(300);
setWidth(1600);
setHight(1600);
setAlpha(1f);
setZorder(50);
}});
//设置标题图层
subPicLayerList.add(new SubPicLayer(){{
setFaceColor("#00008B");
setLeft(0);
setTop(50);
setWidth(2000);
setHight(250);
setAlpha(1f);
}});
//设置图例图层
subPicLayerList.add(new SubPicLayer(){{
setFaceColor("#2da7ff");
setLeft(1780);
setTop(1100);
setWidth(200);
setHight(750);
setAlpha(1f);
}});
mainPic.setSubPicLayers(subPicLayerList);
mainPic.setMapPics(new ArrayList<MapPic>());
mainPic.setTexts(new ArrayList<Text>());
mainPic.setPics(new ArrayList<Pic>());
//边界
final List<MapBorder> mapBorders = Utils.mapBordersByGeo(cqjson);
//县名
final List<MapText> mapCounty = Utils.mapCountyNameByGeo(cqjson);
//房价
final List<MapText> mapFj = Utils.mapFj(cqjson,fjjson);
//县名和房价叠加
mapCounty.addAll(mapFj);
//按房价填色
Utils.pullColor(fjjson,mapBorders);
List<MapPic> mapPicList = new ArrayList<>();
mapPicList.add(new MapPic(){{
setMapBorders(mapBorders);
setMapTexts(mapCounty);
setZoomWeight(1);
}});
mainPic.setMapPics(mapPicList);
long start = System.currentTimeMillis();
JMap jMap= JMaps.newSimpleMapHelper(mainPic);
jMap.plot().out(out);
long end = System.currentTimeMillis();
System.out.println("耗时:"+(end-start));
}
}
五.贴上标题和图例
package xyz.hashdog.jmap.demo.simple;
import xyz.hashdog.dm.bean.*;
import xyz.hashdog.dm.bean.base.Position;
import xyz.hashdog.dm.draw.JMap;
import xyz.hashdog.dm.draw.JMaps;
import xyz.hashdog.dm.util.ImageUtil;
import xyz.hashdog.jmap.demo.Utils;
import javax.imageio.ImageIO;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
public class ChongQingHousingPrice {
private final static String out= Utils.getOutDataDir(ChongQingHousingPrice.class) + "/重庆房价test.png";
private final static String cqjson= Utils.getGeoJson("ChongQing") ;
private final static String fjjson= Utils.getJsonString("2022-03重庆房价") ;
public static void main(String[] args) throws IOException {
//创建主图
MainPic mainPic = new MainPic();
//设置图片宽高
mainPic.setWidth(2000);
mainPic.setHight(2000);
//设置背景色
mainPic.setFaceColor("#DCDCDC");
//设置透明度
mainPic.setAlpha(0.5f);
List<SubPicLayer> subPicLayerList = new ArrayList<>();
//设置地图图层
subPicLayerList.add(new SubPicLayer(){{
setFaceColor("#FFC0CB");
setLeft(100);
setTop(300);
setWidth(1600);
setHight(1600);
setAlpha(1f);
setZorder(50);
}});
//设置标题图层
subPicLayerList.add(new SubPicLayer(){{
setFaceColor("#00008B");
setLeft(0);
setTop(50);
setWidth(2000);
setHight(250);
setAlpha(1f);
}});
//设置图例图层
subPicLayerList.add(new SubPicLayer(){{
setFaceColor("#2da7ff");
setLeft(1780);
setTop(1100);
setWidth(200);
setHight(750);
setAlpha(1f);
}});
mainPic.setSubPicLayers(subPicLayerList);
mainPic.setMapPics(new ArrayList<MapPic>());
mainPic.setTexts(new ArrayList<Text>());
mainPic.setPics(new ArrayList<Pic>());
//边界
final List<MapBorder> mapBorders = Utils.mapBordersByGeo(cqjson);
//县名
final List<MapText> mapCounty = Utils.mapCountyNameByGeo(cqjson);
//房价
final List<MapText> mapFj = Utils.mapFj(cqjson,fjjson);
//县名和房价叠加
mapCounty.addAll(mapFj);
//按房价填色
Utils.pullColor(fjjson,mapBorders);
List<MapPic> mapPicList = new ArrayList<>();
mapPicList.add(new MapPic(){{
setMapBorders(mapBorders);
setMapTexts(mapCounty);
setZoomWeight(1);
}});
//标题
List<Text> texts = new ArrayList<>();
texts.add(new Text(){{
setTitle("重庆各区市县房价查询[2022-3]");
setFontFamily("微软雅黑");
setFontSize(80);
setFontColor("#1C1C1C");
setAlpha(1);
setSubPicIndex(1);
setAlignment(Text.CENTER_CENTER);
setPosition(new Position(1000,100));
}});
//贴在主图上
mainPic.setTexts(texts);
//图片
List<Pic> pics = new ArrayList<>();
pics.add(new Pic(){{
setPic(ImageIO.read(new File(Utils.getTempDataPath("len2.png"))));
setSubPicIndex(2);
setPosition(new Position(0,0));
}});
//图片贴在主图层上
mainPic.setPics(pics);
mainPic.setMapPics(mapPicList);
long start = System.currentTimeMillis();
JMap jMap= JMaps.newSimpleMapHelper(mainPic);
jMap.plot().out(out);
long end = System.currentTimeMillis();
System.out.println("耗时:"+(end-start));
}
}
六.去掉图层背景色
这里就不上代码了,直接把3个图层的透明度设置为0 就行了,整体背景成灰色,是因为主图有设置背景色