【JMap】Java画地图-重庆房价可视化详细步骤

本文介绍了一位开发者如何使用Java实现地图绘制,并开源了一个名为JMap的库。通过步骤演示了如何创建地图背景、叠加地图边界、添加县名和房价信息、按房价填充颜色、添加标题和图例,最终实现了一个清晰的重庆房价地图。示例中使用了GeoJSON数据和Fastjson等依赖库,详细展示了代码实现过程。

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

目录

环境说明

一.先把图层结构绘制出来

二.叠加地图边界

三.叠县名和各县房价

四.  地图按房价填色

五.贴上标题和图例

六.去掉图层背景色


环境说明

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 就行了,整体背景成灰色,是因为主图有设置背景色

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值