java实现世界国家地图随机坐标

1 代码

实现的思路 就是把各个国家中心点的坐标写死 然后随机的生成周边的坐标数据

经纬度的类

import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

import java.math.BigDecimal;

@Data
public class Coordinates {

    @ApiModelProperty(value = "纬度")
    private BigDecimal latitude;

    @ApiModelProperty(value = "经度")
    private BigDecimal longitude;

}

坐标生成代码

import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;

import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.*;

@Slf4j
public class GeoCoordMapUtil {

    /**
     * 写死的国家名称与坐标点映射表  中心点的坐标
     */
    private static final Map<String, String> GEO_COORD_MAP = new HashMap<>();

    static {
        GEO_COORD_MAP.put("阿富汗", "67.709953,33.93911");
        GEO_COORD_MAP.put("安哥拉", "17.873887,-11.202692");
        GEO_COORD_MAP.put("阿尔巴尼亚", "20.168331,41.153332");
        GEO_COORD_MAP.put("阿联酋", "53.847818,23.424076");
        GEO_COORD_MAP.put("阿根廷", "-63.61667199999999,-38.416097");
        GEO_COORD_MAP.put("亚美尼亚", "45.038189,40.069099");
        GEO_COORD_MAP.put("法属南半球和南极领地", "69.348557,-49.280366");
        GEO_COORD_MAP.put("澳大利亚", "133.775136,-25.274398");
        GEO_COORD_MAP.put("奥地利", "14.550072,47.516231");
        GEO_COORD_MAP.put("阿塞拜疆", "47.576927,40.143105");
        GEO_COORD_MAP.put("布隆迪", "29.918886,-3.373056");
        GEO_COORD_MAP.put("比利时", "4.469936,50.503887");
        GEO_COORD_MAP.put("贝宁", "2.315834,9.30769");
        GEO_COORD_MAP.put("布基纳法索", "-1.561593,12.238333");
        GEO_COORD_MAP.put("孟加拉国", "90.356331,23.684994");
        GEO_COORD_MAP.put("保加利亚", "25.48583,42.733883");
        GEO_COORD_MAP.put("巴哈马", "-77.39627999999999,25.03428");
        GEO_COORD_MAP.put("波斯尼亚和黑塞哥维那", "17.679076,43.915886");
        GEO_COORD_MAP.put("白俄罗斯", "27.953389,53.709807");
        GEO_COORD_MAP.put("伯利兹", "-88.49765,17.189877");
        GEO_COORD_MAP.put("百慕大", "-64.7505,32.3078");
        GEO_COORD_MAP.put("玻利维亚", "-63.58865299999999,-16.290154");
        GEO_COORD_MAP.put("巴西", "-51.92528,-14.235004");
        GEO_COORD_MAP.put("文莱", "114.727669,4.535277");
        GEO_COORD_MAP.put("不丹", "90.433601,27.514162");
        GEO_COORD_MAP.put("博茨瓦纳", "24.684866,-22.328474");
        GEO_COORD_MAP.put("中非共和国", "20.939444,6.611110999999999");
        GEO_COORD_MAP.put("加拿大", "-106.346771,56.130366");
        GEO_COORD_MAP.put("瑞士", "8.227511999999999,46.818188");
        GEO_COORD_MAP.put("智利", "-71.542969,-35.675147");
        GEO_COORD_MAP.put("中国", "104.195397,35.86166");
        GEO_COORD_MAP.put("象牙海岸", "-5.547079999999999,7.539988999999999");
        GEO_COORD_MAP.put("喀麦隆", "12.354722,7.369721999999999");
        GEO_COORD_MAP.put("刚果民主共和国", "21.758664,-4.038333");
        GEO_COORD_MAP.put("刚果共和国", "15.827659,-0.228021");
        GEO_COORD_MAP.put("哥伦比亚", "-74.297333,4.570868");
        GEO_COORD_MAP.put("哥斯达黎加", "-83.753428,9.748916999999999");
        GEO_COORD_MAP.put("古巴", "-77.781167,21.521757");
        GEO_COORD_MAP.put("北塞浦路斯", "33.429859,35.126413");
        GEO_COORD_MAP.put("塞浦路斯", "33.429859,35.126413");
        GEO_COORD_MAP.put("捷克共和国", "15.472962,49.81749199999999");
        GEO_COORD_MAP.put("德国", "10.451526,51.165691");
        GEO_COORD_MAP.put("吉布提", "42.590275,11.825138");
        GEO_COORD_MAP.put("丹麦", "9.501785,56.26392");
        GEO_COORD_MAP.put("多明尼加共和国", "-70.162651,18.735693");
        GEO_COORD_MAP.put("阿尔及利亚", "1.659626,28.033886");
        GEO_COORD_MAP.put("厄瓜多尔", "-78.18340599999999,-1.831239");
        GEO_COORD_MAP.put("埃及", "30.802498,26.820553");
        GEO_COORD_MAP.put("厄立特里亚", "39.782334,15.179384");
        GEO_COORD_MAP.put("西班牙", "-3.74922,40.46366700000001");
        GEO_COORD_MAP.put("爱沙尼亚", "25.013607,58.595272");
        GEO_COORD_MAP.put("埃塞俄比亚", "40.489673,9.145000000000001");
        GEO_COORD_MAP.put("芬兰", "25.748151,61.92410999999999");
        GEO_COORD_MAP.put("斐", "178.065032,-17.713371");
        GEO_COORD_MAP.put("福克兰群岛", "-59.523613,-51.796253");
        GEO_COORD_MAP.put("法国", "2.213749,46.227638");
        GEO_COORD_MAP.put("加蓬", "11.609444,-0.803689");
        GEO_COORD_MAP.put("英国", "-3.435973,55.378051");
        GEO_COORD_MAP.put("格鲁吉亚", "-82.9000751,32.1656221");
        GEO_COORD_MAP.put("加纳", "-1.023194,7.946527");
        GEO_COORD_MAP.put("几内亚", "-9.696645,9.945587");
        GEO_COORD_MAP.put("冈比亚", "-15.310139,13.443182");
        GEO_COORD_MAP.put("几内亚比绍", "-15.180413,11.803749");
        GEO_COORD_MAP.put("赤道几内亚", "10.267895,1.650801");
        GEO_COORD_MAP.put("希腊", "21.824312,39.074208");
        GEO_COORD_MAP.put("格陵兰", "-42.604303,71.706936");
        GEO_COORD_MAP.put("危地马拉", "-90.23075899999999,15.783471");
        GEO_COORD_MAP.put("法属圭亚那", "-53.125782,3.933889");
        GEO_COORD_MAP.put("圭亚那", "-58.93018,4.860416");
        GEO_COORD_MAP.put("洪都拉斯", "-86.241905,15.199999");
        GEO_COORD_MAP.put("克罗地亚", "15.2,45.1");
        GEO_COORD_MAP.put("海地", "-72.285215,18.971187");
        GEO_COORD_MAP.put("匈牙利", "19.503304,47.162494");
        GEO_COORD_MAP.put("印尼", "113.921327,-0.789275");
        GEO_COORD_MAP.put("印度", "78.96288,20.593684");
        GEO_COORD_MAP.put("爱尔兰", "-8.24389,53.41291");
        GEO_COORD_MAP.put("伊朗", "53.688046,32.427908");
        GEO_COORD_MAP.put("伊拉克", "43.679291,33.223191");
        GEO_COORD_MAP.put("冰岛", "-19.020835,64.963051");
        GEO_COORD_MAP.put("以色列", "34.851612,31.046051");
        GEO_COORD_MAP.put("意大利", "12.56738,41.87194");
        GEO_COORD_MAP.put("牙买加", "-77.297508,18.109581");
        GEO_COORD_MAP.put("约旦", "36.238414,30.585164");
        GEO_COORD_MAP.put("日本", "138.252924,36.204824");
        GEO_COORD_MAP.put("哈萨克斯坦", "66.923684,48.019573");
        GEO_COORD_MAP.put("肯尼亚", "37.906193,-0.023559");
        GEO_COORD_MAP.put("吉尔吉斯斯坦", "74.766098,41.20438");
        GEO_COORD_MAP.put("柬埔寨", "104.990963,12.565679");
        GEO_COORD_MAP.put("韩国", "127.766922,35.907757");
        GEO_COORD_MAP.put("科索沃", "20.902977,42.6026359");
        GEO_COORD_MAP.put("科威特", "47.481766,29.31166");
        GEO_COORD_MAP.put("老挝", "102.495496,19.85627");
        GEO_COORD_MAP.put("黎巴嫩", "35.862285,33.854721");
        GEO_COORD_MAP.put("利比里亚", "-9.429499000000002,6.428055");
        GEO_COORD_MAP.put("利比亚", "17.228331,26.3351");
        GEO_COORD_MAP.put("斯里兰卡", "80.77179699999999,7.873053999999999");
        GEO_COORD_MAP.put("莱索托", "28.233608,-29.609988");
        GEO_COORD_MAP.put("立陶宛", "23.881275,55.169438");
        GEO_COORD_MAP.put("卢森堡", "6.129582999999999,49.815273");
        GEO_COORD_MAP.put("拉脱维亚", "24.603189,56.879635");
        GEO_COORD_MAP.put("摩洛哥", "-7.092619999999999,31.791702");
        GEO_COORD_MAP.put("摩尔多瓦", "28.369885,47.411631");
        GEO_COORD_MAP.put("马达加斯加", "46.869107,-18.766947");
        GEO_COORD_MAP.put("墨西哥", "-102.552784,23.634501");
        GEO_COORD_MAP.put("马其顿", "21.745275,41.608635");
        GEO_COORD_MAP.put("马里", "-3.996166,17.570692");
        GEO_COORD_MAP.put("缅甸", "95.956223,21.913965");
        GEO_COORD_MAP.put("黑山", "19.37439,42.708678");
        GEO_COORD_MAP.put("蒙古", "103.846656,46.862496");
        GEO_COORD_MAP.put("莫桑比克", "35.529562,-18.665695");
        GEO_COORD_MAP.put("毛里塔尼亚", "-10.940835,21.00789");
        GEO_COORD_MAP.put("马拉维", "34.301525,-13.254308");
        GEO_COORD_MAP.put("马来西亚", "101.975766,4.210484");
        GEO_COORD_MAP.put("纳米比亚", "18.49041,-22.95764");
        GEO_COORD_MAP.put("新喀里多尼亚", "165.618042,-20.904305");
        GEO_COORD_MAP.put("尼日尔", "8.081666,17.607789");
        GEO_COORD_MAP.put("尼日利亚", "8.675277,9.081999");
        GEO_COORD_MAP.put("尼加拉瓜", "-85.207229,12.865416");
        GEO_COORD_MAP.put("荷兰", "5.291265999999999,52.132633");
        GEO_COORD_MAP.put("挪威", "8.468945999999999,60.47202399999999");
        GEO_COORD_MAP.put("尼泊尔", "84.12400799999999,28.394857");
        GEO_COORD_MAP.put("新西兰", "174.885971,-40.900557");
        GEO_COORD_MAP.put("阿曼", "55.923255,21.512583");
        GEO_COORD_MAP.put("巴基斯坦", "69.34511599999999,30.375321");
        GEO_COORD_MAP.put("巴拿马", "-80.782127,8.537981");
        GEO_COORD_MAP.put("秘鲁", "-75.015152,-9.189967");
        GEO_COORD_MAP.put("菲律宾", "121.774017,12.879721");
        GEO_COORD_MAP.put("巴布亚新几内亚", "143.95555,-6.314992999999999");
        GEO_COORD_MAP.put("波兰", "19.145136,51.919438");
        GEO_COORD_MAP.put("波多黎各", "-66.590149,18.220833");
        GEO_COORD_MAP.put("北朝鲜", "127.510093,40.339852");
        GEO_COORD_MAP.put("葡萄牙", "-8.224454,39.39987199999999");
        GEO_COORD_MAP.put("巴拉圭", "-58.443832,-23.442503");
        GEO_COORD_MAP.put("卡塔尔", "51.183884,25.354826");
        GEO_COORD_MAP.put("罗马尼亚", "24.96676,45.943161");
        GEO_COORD_MAP.put("俄罗斯", "105.318756,61.52401");
        GEO_COORD_MAP.put("卢旺达", "29.873888,-1.940278");
        GEO_COORD_MAP.put("西撒哈拉", "-12.885834,24.215527");
        GEO_COORD_MAP.put("沙特阿拉伯", "45.079162,23.885942");
        GEO_COORD_MAP.put("苏丹", "30.217636,12.862807");
        GEO_COORD_MAP.put("南苏丹", "31.3069788,6.876991899999999");
        GEO_COORD_MAP.put("塞内加尔", "-14.452362,14.497401");
        GEO_COORD_MAP.put("所罗门群岛", "160.156194,-9.64571");
        GEO_COORD_MAP.put("塞拉利昂", "-11.779889,8.460555");
        GEO_COORD_MAP.put("萨尔瓦多", "-88.89653,13.794185");
        GEO_COORD_MAP.put("索马里兰", "46.8252838,9.411743399999999");
        GEO_COORD_MAP.put("索马里", "46.199616,5.152149");
        GEO_COORD_MAP.put("塞尔维亚共和国", "21.005859,44.016521");
        GEO_COORD_MAP.put("苏里南", "-56.027783,3.919305");
        GEO_COORD_MAP.put("斯洛伐克", "19.699024,48.669026");
        GEO_COORD_MAP.put("斯洛文尼亚", "14.995463,46.151241");
        GEO_COORD_MAP.put("瑞典", "18.643501,60.12816100000001");
        GEO_COORD_MAP.put("斯威士兰", "31.465866,-26.522503");
        GEO_COORD_MAP.put("叙利亚", "38.996815,34.80207499999999");
        GEO_COORD_MAP.put("乍得", "18.732207,15.454166");
        GEO_COORD_MAP.put("多哥", "0.824782,8.619543");
        GEO_COORD_MAP.put("泰国", "100.992541,15.870032");
        GEO_COORD_MAP.put("塔吉克斯坦", "71.276093,38.861034");
        GEO_COORD_MAP.put("土库曼斯坦", "59.556278,38.969719");
        GEO_COORD_MAP.put("东帝汶", "125.727539,-8.874217");
        GEO_COORD_MAP.put("特里尼达和多巴哥", "-61.222503,10.691803");
        GEO_COORD_MAP.put("突尼斯", "9.537499,33.886917");
        GEO_COORD_MAP.put("土耳其", "35.243322,38.963745");
        GEO_COORD_MAP.put("坦桑尼亚联合共和国", "34.888822,-6.369028");
        GEO_COORD_MAP.put("乌干达", "32.290275,1.373333");
        GEO_COORD_MAP.put("乌克兰", "31.16558,48.379433");
        GEO_COORD_MAP.put("乌拉圭", "-55.765835,-32.522779");
        GEO_COORD_MAP.put("美国", "-95.712891,37.09024");
        GEO_COORD_MAP.put("乌兹别克斯坦", "64.585262,41.377491");
        GEO_COORD_MAP.put("委内瑞拉", "-66.58973,6.42375");
        GEO_COORD_MAP.put("越南", "108.277199,14.058324");
        GEO_COORD_MAP.put("瓦努阿图", "166.959158,-15.376706");
        GEO_COORD_MAP.put("西岸", "35.3027226,31.9465703");
        GEO_COORD_MAP.put("也门", "48.516388,15.552727");
        GEO_COORD_MAP.put("南非", "22.937506,-30.559482");
        GEO_COORD_MAP.put("赞比亚", "27.849332,-13.133897");
        GEO_COORD_MAP.put("津巴布韦", "29.154857,-19.015438");
    }
    /**
     * 根据国家名称获取坐标点
     *
     * @param countryName 国家名称
     * @return 包含经纬度的坐标点对象,如果未找到则返回 null
     */
    public static String getCoordinatesByCountry(String countryName) {
        return GEO_COORD_MAP.get(countryName);
    }


    /**
     * 随机生成围绕中心点的点
     *
     * @param country 国家
     * @param count     要生成的点的数量
     * @return 包含随机生成的点的列表
     */
    public static List<Coordinates> generateRandomPointsAroundCenter(String country,int count) {
        if (StringUtils.isBlank(country)) {
            log.info("参数为空");
            return null;
        }
        String coordinatesByCountry = getCoordinatesByCountry(country);
        if (StringUtils.isBlank(coordinatesByCountry)) {
            log.info("没有找到国家坐标");
            return null;
        }
        String[] coordStr = coordinatesByCountry.split(",", 2);
        if (coordStr.length != 2) {
            log.info("坐标点数据有误");
            return null;
        }
        double maxOffset=0.5;
        if ("中国".equals(country) || "美国".equals(country) || "俄罗斯".equals(country)) {
            maxOffset=2.0;
        } else if ("日本".equals(country) || "韩国".equals(country)) {
            maxOffset=1.0;
        }
        log.info("{}:坐标点数据:{}",country,coordStr);
        BigDecimal centerLng = new BigDecimal(coordStr[0]);
        BigDecimal centerLat = new BigDecimal(coordStr[1]);
        List<Coordinates> points = new ArrayList<>();
        Random random = new Random();
        //偏移量
        BigDecimal maxOffsetBD = BigDecimal.valueOf(maxOffset);
        //判断一下生成的点有没有重复的
        HashSet<String> logLatSet = new HashSet<>();
        while (points.size() < count+10) {
            if (points.size()==count) {
                break;
            }
            // 在 [-maxOffset, maxOffset] 范围内随机偏移
            BigDecimal latOffset = maxOffsetBD.multiply(BigDecimal.valueOf(random.nextDouble() * 2 - 1));
            BigDecimal lngOffset = maxOffsetBD.multiply(BigDecimal.valueOf(random.nextDouble() * 2 - 1));
            // 计算新的经纬度,并保留小数点后六位
            BigDecimal latitude = centerLat.add(latOffset).setScale(6, RoundingMode.HALF_UP);
            BigDecimal longitude = centerLng.add(lngOffset).setScale(6, RoundingMode.HALF_UP);
            if (logLatSet.add(latitude.toString() + ":" + longitude.toString())) {
                Coordinates coordinates = new Coordinates();
                coordinates.setLatitude(latitude);
                coordinates.setLongitude(longitude);
                // 添加新生成的点到列表中
                points.add(coordinates);
            }
        }
        return points;
    }


    /**
     * 多个国家坐标点数据的返回
     * @param countryCountMap
     * @return
     */
    public static Map<String,  List<Coordinates>>  generateRandomPointsAroundCenterMap(Map<String, Long> countryCountMap) {
        Map<String,  List<Coordinates>> result = new HashMap<>();
        for (String country : countryCountMap.keySet()) {
            List<Coordinates> coordinates = generateRandomPointsAroundCenter(country, Math.toIntExact(countryCountMap.get(country)));
            if (CollectionUtils.isNotEmpty(coordinates)) {
                result.put(country,coordinates);
            }
        }
        return result;
    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值