千家信息网

Java代码如何进行中国行政区划多边中生成随机点

发表于:2024-11-27 作者:千家信息网编辑
千家信息网最后更新 2024年11月27日,Java代码如何进行中国行政区划多边中生成随机点 ,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。因为要用到中国行政区划多边中生成随机
千家信息网最后更新 2024年11月27日Java代码如何进行中国行政区划多边中生成随机点

Java代码如何进行中国行政区划多边中生成随机点 ,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。

因为要用到中国行政区划多边中生成随机点,在网上找了好长时间,发现也没有现成的东西,被迫自己写一下,代码为测试代码,大家对付看下吧。

用到相关的东西有:

1、echart 的中国行政区划的JSON文件

2、Google S2 Geometry Library Java版

3、基于Spring boot 开发

4、fastJson

话不多说,上代码

import com.alibaba.fastjson.JSONArray;import com.alibaba.fastjson.JSONObject;import com.google.common.geometry.*;import org.springframework.core.io.ClassPathResource;import java.io.IOException;import java.io.InputStream;import java.util.*;public class GEOJsonUtils {    public static Map jsonList = new HashMap<>();    public static S2Polygon readJson(String code) throws IOException {        if(jsonList.containsKey(code)){        }else{            String name = code.substring(0,4) + "00.json";            ClassPathResource classPathResource = new ClassPathResource("json/"+name);            InputStream inputStream =classPathResource.getInputStream();            byte[] content = new byte[10240];            StringBuffer sb = new StringBuffer();            int len = 0;            while ((len = inputStream.read(content)) > 0){                sb.append(new String(content,0, len));            }            JSONObject parse = JSONObject.parseObject(sb.toString());            JSONArray features = parse.getJSONArray("features");            for (int i = 0 ; i < features.size(); i++) {                JSONObject feature = (JSONObject)features.get(i);                String id = feature.getString("id");                JSONObject geometry = feature.getJSONObject("geometry");                JSONArray encodeOffsets = geometry.getJSONArray("encodeOffsets");                JSONArray coordinates = geometry.getJSONArray("coordinates");                String type = geometry.getString("type");                if("Polygon".equals(type)){                    List floats = decodePolygon(coordinates.getString(0),                            new double[]{encodeOffsets.getJSONArray(0).getDoubleValue(0), encodeOffsets.getJSONArray(0).getDoubleValue(1)});                    List vertices = new ArrayList<>();                    for (double[] item :floats) {                        vertices.add(S2LatLng.fromDegrees(item[1],item[0]).toPoint());                    }                    S2Loop s2Loop = new S2Loop(vertices);                    //创建多边形                    S2Polygon polygon = new S2Polygon(s2Loop);                    s2Loop.normalize();                    jsonList.put(id,polygon);                }else if("MultiPolygon".equals(type)){                    List loops = new ArrayList<>();                    for(int j = 0 ; j < coordinates.size() ; j++){                        List floats = decodePolygon(coordinates.getString(j),                                new double[]{encodeOffsets.getJSONArray(j).getJSONArray(0).getDoubleValue(0),                                        encodeOffsets.getJSONArray(j).getJSONArray(0).getDoubleValue(1)});                        List vertices = new ArrayList<>();                        for (double[] item :floats) {                            S2LatLng s2LatLng = S2LatLng.fromDegrees(item[1],item[0]);                            S2Point s2Point = s2LatLng.toPoint();                            vertices.add(s2Point);                        }                        S2Loop s2Loop = new S2Loop(vertices);                        loops.add(s2Loop);                        s2Loop.normalize();                    }                    //创建多边形                    S2Polygon polygon = new S2Polygon(loops);                    jsonList.put(id,polygon);                }            }            if(!jsonList.containsKey(code)){                jsonList.put(code, null);            }        }        return jsonList.get(code);    }    public static S2LatLng randomPoint(S2Polygon polygon){        for(int i = 0 ; i < polygon.numLoops() ; i++){            S2LatLngRect rect = polygon.loop(i).getRectBound();            S2LatLng s2LatLng1 = new S2LatLng(rect.lo().toPoint());            S2LatLng s2LatLng2 = new S2LatLng(rect.hi().toPoint());            double minX = 0;            double minY = 0;            double maxX = 0;            double maxY = 0;            if(s2LatLng1.lat().degrees() > s2LatLng2.lat().degrees()){                maxX = s2LatLng1.lat().degrees();                minX = s2LatLng2.lat().degrees();            }else{                maxX = s2LatLng2.lat().degrees();                minX = s2LatLng1.lat().degrees();            }            if(s2LatLng1.lng().degrees() > s2LatLng2.lng().degrees()){                maxY = s2LatLng1.lng().degrees();                minY = s2LatLng2.lng().degrees();            }else{                maxY = s2LatLng2.lng().degrees();                minY = s2LatLng1.lng().degrees();            }            Random r = new Random();            S2Point rPoint = new S2Point();            for(int j = 0 ; j < 10 ; j++){                double x = r.nextDouble()*(maxX - minX) + minX;                double y = r.nextDouble()*(maxY - minY) + minY;                rPoint = S2LatLng.fromDegrees(x, y).toPoint();                if(polygon.contains(rPoint)){                    S2LatLng s2LatLng = new S2LatLng(rPoint);                    return s2LatLng;                }            }            if(i == polygon.numLoops() - 1){                i = 0;            }        }        return null;    }    public static List decodePolygon(String coordinate, double[] encodeOffsets){        List result = new ArrayList<>();        double prevX = encodeOffsets[0];        double prevY = encodeOffsets[1];        for (int i = 0; i < coordinate.length(); i += 2) {            int x = coordinate.charAt(i) - 64;            int y = coordinate.charAt(i + 1) - 64;            x = (x >> 1) ^ (-(x & 1));            y = (y >> 1) ^ (-(y & 1));            x += prevX;            y += prevY;            prevX = x;            prevY = y;            result.add(new double[]{x / 1024d, y / 1024d});        }        return result;    }}

关于Java代码如何进行中国行政区划多边中生成随机点 问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注行业资讯频道了解更多相关知识。

0