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<String, S2Polygon> 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<double[]> floats = decodePolygon(coordinates.getString(0),
new double[]{encodeOffsets.getJSONArray(0).getDoubleValue(0), encodeOffsets.getJSONArray(0).getDoubleValue(1)});
List<S2Point> 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<S2Loop> loops = new ArrayList<>();
for(int j = 0 ; j < coordinates.size() ; j++){
List<double[]> floats = decodePolygon(coordinates.getString(j),
new double[]{encodeOffsets.getJSONArray(j).getJSONArray(0).getDoubleValue(0),
encodeOffsets.getJSONArray(j).getJSONArray(0).getDoubleValue(1)});
List<S2Point> 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<double[]> decodePolygon(String coordinate, double[] encodeOffsets){
List<double[]> 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代碼如何進行中國行政區劃多邊中生成隨機點 問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。