根据雨量站点信息计算降雨等值面数据是常用的场景,比已知某地区所有雨量站的降雨信息,包括经纬度和降雨量,所有网格点的经纬度和计算得到的降雨量列表信息,按照降雨量从小到大分为三组,每组是一个降雨量区间,比如30-60之间是一组,每组网格点信息转化成geojson等值面数据,每组只有一个geometry,得到geojson数据。
需求分析:要计算一个区域的降雨等值面(即等值线),你可以使用克里金插值法或**IDW(Inverse Distance Weighting,反距离加权法)**等空间插值算法。由于克里金法实现较复杂,下面我们使用 IDW 算法 作为示例,借助已有的雨量站数据计算任意点的降雨量。下面我们开始分析:
1、为了计算一个区域内所有站点的降雨等值面,我们可以使用插值法,其中一种常用的方法是反距离加权插值法(Inverse Distance Weighting, IDW)。这种方法假设未知点的值与已知点的距离成反比。我们将使用这种方法来创建一个简单的等值面计算示例。
2、RainfallStation
类
表示一个雨量站,包含经纬度和降雨量信息。
class RainfallStation {
double latitude;
double longitude;
double rainfall;
public RainfallStation(double latitude, double longitude, double rainfall) {
this.latitude = latitude;
this.longitude = longitude;
this.rainfall = rainfall;
}
}
3、ContourCalculator
类
核心类,用于计算等值面。
-
构造函数接受雨量站的Map和网格大小。
-
calculateBoundaries()
方法计算整个区域的边界。 -
calculateContours()
方法计算整个网格的等值面。 -
interpolateRainfall()
方法使用IDW方法计算任意点的降雨量。 -
toMultiPolygonGeoJson
方法,用于将一组ContourPoint
转换为 GeoJSON 格式的 MultiPolygon。
4、RainfallContourExample
类
-
包含
main
方法,展示如何使用ContourCalculator
。
使用说明:
-
创建
RainfallStation
对象并将它们放入Map
中。 -
创建
ContourCalculator
实例,传入站点Map和期望的网格大小。 -
调用
calculateContours()
方法获取等值面结果。
5、完整测试代码
package com.example.demo.test.jydzm;
import java.util.*;
class RainfallStation {
double latitude;
double longitude;
double rainfall;
public RainfallStation(double latitude, double longitude, double rainfall) {
this.latitude = latitude;
this.longitude = longitude;
this.rainfall = rainfall;
}
}
class ContourPoint {
double latitude;
double longitude;
double rainfall;
public ContourPoint(double latitude, double longitude, double rainfall) {
this.latitude = latitude;
this.longitude = longitude;
this.rainfall = rainfall;
}
}
class ContourCalculator {
private List<RainfallStation> stations;
private double minLat, maxLat, minLon, maxLon;
private int gridSize;
public ContourCalculator(Map<String, RainfallStation> stationMap, int gridSize) {
this.stations = new ArrayList<>(stationMap.values());
this.gridSize = gridSize;
calculateBoundaries();
}
private void calculateBoundaries() {
minLat = minLon = Double.MAX_VALUE;
maxLat = maxLon = Double.MIN_VALUE;
for (RainfallStation station : stations) {
minLat = Math.min(minLat, station.latitude);
maxLat = Math.max(maxLat, station.latitude);
minLon = Math.min(minLon, station.longitude);
maxLon = Math.max(maxLon, station.longitude);
}
}
public List<ContourPoint> calculateContours() {
List<ContourPoint> contourPoints = new ArrayList<>();
double latStep = (maxLat - minLat) / (gridSize - 1);
double lonStep = (maxLon - minLon) / (gridSize - 1);
for (int i = 0; i < gridSize; i++) {
for (int j = 0; j < gridSize; j++) {
double lat = minLat + i * latStep;
double lon = minLon + j * lonStep;
double rainfall = interpolateRainfall(lat, lon);
contourPoints.add(new ContourPoint(lat, lon, rainfall));
}
}
return contourPoints;
}
private double interpolateRainfall(double lat, double lon) {
double weightedSum = 0;
double weightSum = 0;
for (RainfallStation station : stations) {
double distance = calculateDistance(lat, lon, station.latitude, station.longitude);
if (distance == 0) return station.rainfall;
double weight = 1 / Math.pow(distance, 2);
weightedSum += station.rainfall * weight;
weightSum += weight;
}
return weightedSum / weightSum;
}
private double calculateDistance(double lat1, double lon1, double lat2, double lon2) {
return Math.sqrt(Math.pow(lat1 - lat2, 2) + Math.pow(lon1 - lon2, 2));
}
}
class GeoJsonConverter {
// 将ContourPoint列表转换为GeoJSON格式的MultiPolygon
public static String toMultiPolygonGeoJson(List<ContourPoint> points, double minRainfall, double maxRainfall) {
StringBuilder sb = new StringBuilder();
sb.append("{\n");
sb.append(" \"type\": \"FeatureCollection\",\n");
sb.append(" \"features\": [\n");
sb.append(" {\n");
sb.append(" \"type\": \"Feature\",\n");
sb.append(" \"properties\": {\n");
sb.append(" \"minRainfall\": ").append(minRainfall).append(",\n");
sb.append(" \"maxRainfall\": ").append(maxRainfall).append("\n");
sb.append(" },\n");
sb.append(" \"geometry\": {\n");
sb.append(" \"type\": \"MultiPolygon\",\n");
sb.append(" \"coordinates\": [\n");
// 生成两个示例多边形
sb.append(" [\n");
appendPolygon(sb, points.subList(0, Math.min(points.size(), 4)));
sb.append(" ],\n");
sb.append(" [\n");
appendPolygon(sb, points.subList(Math.max(0, points.size() - 4), points.size()));
sb.append(" ]\n");
sb.append(" ]\n");
sb.append(" }\n");
sb.append(" }\n");
sb.append(" ]\n");
sb.append("}\n");
return sb.toString();
}
private static void appendPolygon(StringBuilder sb, List<ContourPoint> points) {
sb.append(" [\n");
for (int i = 0; i < points.size(); i++) {
ContourPoint point = points.get(i);
sb.append(" [").append(point.longitude).append(", ").append(point.latitude).append("]");
if (i < points.size() - 1) {
sb.append(",");
}
sb.append("\n");
}
// 闭合多边形
ContourPoint firstPoint = points.get(0);
sb.append(" [").append(firstPoint.longitude).append(", ").append(firstPoint.latitude).append("]\n");
sb.append(" ]\n");
}
}
public class YDRainfallContourExample {
public static void main(String[] args) {
// 示例使用
Map<String, RainfallStation> stationMap = new HashMap<>();
stationMap.put("站点1", new RainfallStation(31.22, 121.48, 50.5)); // 上海
stationMap.put("站点2", new RainfallStation(39.90, 116.41, 30.2)); // 北京
stationMap.put("站点3", new RainfallStation(22.54, 114.06, 80.7)); // 深圳
stationMap.put("站点4", new RainfallStation(30.59, 114.31, 45.3)); // 武汉
ContourCalculator calculator = new ContourCalculator(stationMap, 20);
List<ContourPoint> contourPoints = calculator.calculateContours();
// 定义降雨量区间
double[] intervals = {0, 30, 60, Double.MAX_VALUE};
// 按降雨量区间分组
Map<Integer, List<ContourPoint>> groups = new HashMap<>();
for (ContourPoint point : contourPoints) {
for (int i = 0; i < intervals.length - 1; i++) {
if (point.rainfall >= intervals[i] && point.rainfall < intervals[i + 1]) {
groups.computeIfAbsent(i, k -> new ArrayList<>()).add(point);
break;
}
}
}
// 为每组生成GeoJSON
for (Map.Entry<Integer, List<ContourPoint>> entry : groups.entrySet()) {
int groupIndex = entry.getKey();
List<ContourPoint> groupPoints = entry.getValue();
double minRainfall = intervals[groupIndex];
double maxRainfall = intervals[groupIndex + 1];
String geoJson = GeoJsonConverter.toMultiPolygonGeoJson(groupPoints, minRainfall, maxRainfall);
System.out.println("降雨量区间 " + minRainfall + " - " + maxRainfall + " 毫米 GeoJSON:");
System.out.println(geoJson);
System.out.println();
}
}
}
输出结果,部分:
"D:\Program Files\Java\jdk1.8.0_101\bin\java.exe" "-javaagent:E:\Program Files\JetBrains\IntelliJ IDEA 2024.1.4\lib\idea_rt.jar=58352:E:\Program Files\JetBrains\IntelliJ IDEA 2024.1.4\bin" -Dfile.encoding=UTF-8 -classpath "D:\Program Files\Java\jdk1.8.0_101\jre\lib\charsets.jar;D:\Program Files\Java\jdk1.8.0_101\jre\lib\deploy.jar;D:\Program Files\Java\jdk1.8.0_101\jre\lib\ext\access-bridge-64.jar;D:\Program Files\Java\jdk1.8.0_101\jre\lib\ext\cldrdata.jar;D:\Program Files\Java\jdk1.8.0_101\jre\lib\ext\dnsns.jar;D:\Program Files\Java\jdk1.8.0_101\jre\lib\ext\jaccess.jar;D:\Program Files\Java\jdk1.8.0_101\jre\lib\ext\jfxrt.jar;D:\Program Files\Java\jdk1.8.0_101\jre\lib\ext\localedata.jar;D:\Program Files\Java\jdk1.8.0_101\jre\lib\ext\nashorn.jar;D:\Program Files\Java\jdk1.8.0_101\jre\lib\ext\sunec.jar;D:\Program Files\Java\jdk1.8.0_101\jre\lib\ext\sunjce_provider.jar;D:\Program Files\Java\jdk1.8.0_101\jre\lib\ext\sunmscapi.jar;D:\Program Files\Java\jdk1.8.0_101\jre\lib\ext\sunpkcs11.jar;D:\Program Files\Java\jdk1.8.0_101\jre\lib\ext\zipfs.jar;D:\Program Files\Java\jdk1.8.0_101\jre\lib\javaws.jar;D:\Program Files\Java\jdk1.8.0_101\jre\lib\jce.jar;D:\Program Files\Java\jdk1.8.0_101\jre\lib\jfr.jar;D:\Program Files\Java\jdk1.8.0_101\jre\lib\jfxswt.jar;D:\Program Files\Java\jdk1.8.0_101\jre\lib\jsse.jar;D:\Program Files\Java\jdk1.8.0_101\jre\lib\management-agent.jar;D:\Program Files\Java\jdk1.8.0_101\jre\lib\plugin.jar;D:\Program Files\Java\jdk1.8.0_101\jre\lib\resources.jar;D:\Program Files\Java\jdk1.8.0_101\jre\lib\rt.jar;D:\projec\springBootP\demo1\target\classes;D:\tools\apache-maven-3.3.9\repository\org\springframework\boot\spring-boot-starter-web\2.3.2.RELEASE\spring-boot-starter-web-2.3.2.RELEASE.jar;D:\tools\apache-maven-3.3.9\repository\org\springframework\boot\spring-boot-starter\2.3.2.RELEASE\spring-boot-starter-2.3.2.RELEASE.jar;D:\tools\apache-maven-3.3.9\repository\org\springframework\boot\spring-boot\2.3.2.RELEASE\spring-boot-2.3.2.RELEASE.jar;D:\tools\apache-maven-3.3.9\repository\org\springframework\boot\spring-boot-starter-logging\2.3.2.RELEASE\spring-boot-starter-logging-2.3.2.RELEASE.jar;D:\tools\apache-maven-3.3.9\repository\ch\qos\logback\logback-classic\1.2.3\logback-classic-1.2.3.jar;D:\tools\apache-maven-3.3.9\repository\ch\qos\logback\logback-core\1.2.3\logback-core-1.2.3.jar;D:\tools\apache-maven-3.3.9\repository\org\apache\logging\log4j\log4j-to-slf4j\2.13.3\log4j-to-slf4j-2.13.3.jar;D:\tools\apache-maven-3.3.9\repository\org\slf4j\jul-to-slf4j\1.7.30\jul-to-slf4j-1.7.30.jar;D:\tools\apache-maven-3.3.9\repository\jakarta\annotation\jakarta.annotation-api\1.3.5\jakarta.annotation-api-1.3.5.jar;D:\tools\apache-maven-3.3.9\repository\org\springframework\spring-core\5.2.8.RELEASE\spring-core-5.2.8.RELEASE.jar;D:\tools\apache-maven-3.3.9\repository\org\springframework\spring-jcl\5.2.8.RELEASE\spring-jcl-5.2.8.RELEASE.jar;D:\tools\apache-maven-3.3.9\repository\org\yaml\snakeyaml\1.26\snakeyaml-1.26.jar;D:\tools\apache-maven-3.3.9\repository\org\springframework\boot\spring-boot-starter-json\2.3.2.RELEASE\spring-boot-starter-json-2.3.2.RELEASE.jar;D:\tools\apache-maven-3.3.9\repository\com\fasterxml\jackson\core\jackson-databind\2.11.1\jackson-databind-2.11.1.jar;D:\tools\apache-maven-3.3.9\repository\com\fasterxml\jackson\datatype\jackson-datatype-jdk8\2.11.1\jackson-datatype-jdk8-2.11.1.jar;D:\tools\apache-maven-3.3.9\repository\com\fasterxml\jackson\datatype\jackson-datatype-jsr310\2.11.1\jackson-datatype-jsr310-2.11.1.jar;D:\tools\apache-maven-3.3.9\repository\com\fasterxml\jackson\module\jackson-module-parameter-names\2.11.1\jackson-module-parameter-names-2.11.1.jar;D:\tools\apache-maven-3.3.9\repository\org\springframework\boot\spring-boot-starter-tomcat\2.3.2.RELEASE\spring-boot-starter-tomcat-2.3.2.RELEASE.jar;D:\tools\apache-maven-3.3.9\repository\org\apache\tomcat\embed\tomcat-embed-core\9.0.37\tomcat-embed-core-9.0.37.jar;D:\tools\apache-maven-3.3.9\repository\org\glassfish\jakarta.el\3.0.3\jakarta.el-3.0.3.jar;D:\tools\apache-maven-3.3.9\repository\org\apache\tomcat\embed\tomcat-embed-websocket\9.0.37\tomcat-embed-websocket-9.0.37.jar;D:\tools\apache-maven-3.3.9\repository\org\springframework\spring-web\5.2.8.RELEASE\spring-web-5.2.8.RELEASE.jar;D:\tools\apache-maven-3.3.9\repository\org\springframework\spring-beans\5.2.8.RELEASE\spring-beans-5.2.8.RELEASE.jar;D:\tools\apache-maven-3.3.9\repository\org\springframework\spring-webmvc\5.2.8.RELEASE\spring-webmvc-5.2.8.RELEASE.jar;D:\tools\apache-maven-3.3.9\repository\org\springframework\spring-aop\5.2.8.RELEASE\spring-aop-5.2.8.RELEASE.jar;D:\tools\apache-maven-3.3.9\repository\org\springframework\spring-context\5.2.8.RELEASE\spring-context-5.2.8.RELEASE.jar;D:\tools\apache-maven-3.3.9\repository\org\springframework\spring-expression\5.2.8.RELEASE\spring-expression-5.2.8.RELEASE.jar;D:\tools\apache-maven-3.3.9\repository\org\elasticsearch\client\elasticsearch-rest-high-level-client\7.17.22\elasticsearch-rest-high-level-client-7.17.22.jar;D:\tools\apache-maven-3.3.9\repository\org\elasticsearch\client\elasticsearch-rest-client\7.6.2\elasticsearch-rest-client-7.6.2.jar;D:\tools\apache-maven-3.3.9\repository\org\apache\httpcomponents\httpclient\4.5.12\httpclient-4.5.12.jar;D:\tools\apache-maven-3.3.9\repository\org\apache\httpcomponents\httpcore\4.4.13\httpcore-4.4.13.jar;D:\tools\apache-maven-3.3.9\repository\org\apache\httpcomponents\httpasyncclient\4.1.4\httpasyncclient-4.1.4.jar;D:\tools\apache-maven-3.3.9\repository\org\apache\httpcomponents\httpcore-nio\4.4.13\httpcore-nio-4.4.13.jar;D:\tools\apache-maven-3.3.9\repository\commons-codec\commons-codec\1.14\commons-codec-1.14.jar;D:\tools\apache-maven-3.3.9\repository\org\elasticsearch\plugin\mapper-extras-client\7.17.22\mapper-extras-client-7.17.22.jar;D:\tools\apache-maven-3.3.9\repository\org\elasticsearch\plugin\parent-join-client\7.17.22\parent-join-client-7.17.22.jar;D:\tools\apache-maven-3.3.9\repository\org\elasticsearch\plugin\aggs-matrix-stats-client\7.17.22\aggs-matrix-stats-client-7.17.22.jar;D:\tools\apache-maven-3.3.9\repository\org\elasticsearch\plugin\rank-eval-client\7.17.22\rank-eval-client-7.17.22.jar;D:\tools\apache-maven-3.3.9\repository\org\elasticsearch\plugin\lang-mustache-client\7.17.22\lang-mustache-client-7.17.22.jar;D:\tools\apache-maven-3.3.9\repository\com\github\spullara\mustache\java\compiler\0.9.6\compiler-0.9.6.jar;D:\tools\apache-maven-3.3.9\repository\org\elasticsearch\elasticsearch\7.17.22\elasticsearch-7.17.22.jar;D:\tools\apache-maven-3.3.9\repository\org\elasticsearch\elasticsearch-core\7.17.22\elasticsearch-core-7.17.22.jar;D:\tools\apache-maven-3.3.9\repository\org\elasticsearch\elasticsearch-secure-sm\7.17.22\elasticsearch-secure-sm-7.17.22.jar;D:\tools\apache-maven-3.3.9\repository\org\elasticsearch\elasticsearch-x-content\7.17.22\elasticsearch-x-content-7.17.22.jar;D:\tools\apache-maven-3.3.9\repository\com\fasterxml\jackson\core\jackson-core\2.11.1\jackson-core-2.11.1.jar;D:\tools\apache-maven-3.3.9\repository\com\fasterxml\jackson\dataformat\jackson-dataformat-smile\2.11.1\jackson-dataformat-smile-2.11.1.jar;D:\tools\apache-maven-3.3.9\repository\com\fasterxml\jackson\dataformat\jackson-dataformat-yaml\2.11.1\jackson-dataformat-yaml-2.11.1.jar;D:\tools\apache-maven-3.3.9\repository\com\fasterxml\jackson\dataformat\jackson-dataformat-cbor\2.11.1\jackson-dataformat-cbor-2.11.1.jar;D:\tools\apache-maven-3.3.9\repository\org\elasticsearch\elasticsearch-geo\7.17.22\elasticsearch-geo-7.17.22.jar;D:\tools\apache-maven-3.3.9\repository\org\elasticsearch\elasticsearch-lz4\7.17.22\elasticsearch-lz4-7.17.22.jar;D:\tools\apache-maven-3.3.9\repository\org\lz4\lz4-java\1.8.0\lz4-java-1.8.0.jar;D:\tools\apache-maven-3.3.9\repository\org\apache\lucene\lucene-core\8.11.3\lucene-core-8.11.3.jar;D:\tools\apache-maven-3.3.9\repository\org\apache\lucene\lucene-analyzers-common\8.11.3\lucene-analyzers-common-8.11.3.jar;D:\tools\apache-maven-3.3.9\repository\org\apache\lucene\lucene-backward-codecs\8.11.3\lucene-backward-codecs-8.11.3.jar;D:\tools\apache-maven-3.3.9\repository\org\apache\lucene\lucene-grouping\8.11.3\lucene-grouping-8.11.3.jar;D:\tools\apache-maven-3.3.9\repository\org\apache\lucene\lucene-highlighter\8.11.3\lucene-highlighter-8.11.3.jar;D:\tools\apache-maven-3.3.9\repository\org\apache\lucene\lucene-join\8.11.3\lucene-join-8.11.3.jar;D:\tools\apache-maven-3.3.9\repository\org\apache\lucene\lucene-memory\8.11.3\lucene-memory-8.11.3.jar;D:\tools\apache-maven-3.3.9\repository\org\apache\lucene\lucene-misc\8.11.3\lucene-misc-8.11.3.jar;D:\tools\apache-maven-3.3.9\repository\org\apache\lucene\lucene-queries\8.11.3\lucene-queries-8.11.3.jar;D:\tools\apache-maven-3.3.9\repository\org\apache\lucene\lucene-queryparser\8.11.3\lucene-queryparser-8.11.3.jar;D:\tools\apache-maven-3.3.9\repository\org\apache\lucene\lucene-sandbox\8.11.3\lucene-sandbox-8.11.3.jar;D:\tools\apache-maven-3.3.9\repository\org\apache\lucene\lucene-spatial3d\8.11.3\lucene-spatial3d-8.11.3.jar;D:\tools\apache-maven-3.3.9\repository\org\apache\lucene\lucene-suggest\8.11.3\lucene-suggest-8.11.3.jar;D:\tools\apache-maven-3.3.9\repository\org\elasticsearch\elasticsearch-cli\7.17.22\elasticsearch-cli-7.17.22.jar;D:\tools\apache-maven-3.3.9\repository\net\sf\jopt-simple\jopt-simple\5.0.2\jopt-simple-5.0.2.jar;D:\tools\apache-maven-3.3.9\repository\com\carrotsearch\hppc\0.8.1\hppc-0.8.1.jar;D:\tools\apache-maven-3.3.9\repository\joda-time\joda-time\2.12.6\joda-time-2.12.6.jar;D:\tools\apache-maven-3.3.9\repository\com\tdunning\t-digest\3.2\t-digest-3.2.jar;D:\tools\apache-maven-3.3.9\repository\org\hdrhistogram\HdrHistogram\2.1.9\HdrHistogram-2.1.9.jar;D:\tools\apache-maven-3.3.9\repository\org\apache\logging\log4j\log4j-api\2.13.3\log4j-api-2.13.3.jar;D:\tools\apache-maven-3.3.9\repository\org\apache\logging\log4j\log4j-core\2.13.3\log4j-core-2.13.3.jar;D:\tools\apache-maven-3.3.9\repository\net\java\dev\jna\jna\5.10.0\jna-5.10.0.jar;D:\tools\apache-maven-3.3.9\repository\org\elasticsearch\elasticsearch-plugin-classloader\7.17.22\elasticsearch-plugin-classloader-7.17.22.jar;D:\tools\apache-maven-3.3.9\repository\com\alibaba\fastjson\1.2.32\fastjson-1.2.32.jar;D:\tools\apache-maven-3.3.9\repository\io\springfox\springfox-swagger2\2.7.0\springfox-swagger2-2.7.0.jar;D:\tools\apache-maven-3.3.9\repository\io\swagger\swagger-annotations\1.5.13\swagger-annotations-1.5.13.jar;D:\tools\apache-maven-3.3.9\repository\io\swagger\swagger-models\1.5.13\swagger-models-1.5.13.jar;D:\tools\apache-maven-3.3.9\repository\com\fasterxml\jackson\core\jackson-annotations\2.11.1\jackson-annotations-2.11.1.jar;D:\tools\apache-maven-3.3.9\repository\io\springfox\springfox-spi\2.7.0\springfox-spi-2.7.0.jar;D:\tools\apache-maven-3.3.9\repository\io\springfox\springfox-core\2.7.0\springfox-core-2.7.0.jar;D:\tools\apache-maven-3.3.9\repository\net\bytebuddy\byte-buddy\1.10.13\byte-buddy-1.10.13.jar;D:\tools\apache-maven-3.3.9\repository\io\springfox\springfox-schema\2.7.0\springfox-schema-2.7.0.jar;D:\tools\apache-maven-3.3.9\repository\io\springfox\springfox-swagger-common\2.7.0\springfox-swagger-common-2.7.0.jar;D:\tools\apache-maven-3.3.9\repository\io\springfox\springfox-spring-web\2.7.0\springfox-spring-web-2.7.0.jar;D:\tools\apache-maven-3.3.9\repository\org\reflections\reflections\0.9.11\reflections-0.9.11.jar;D:\tools\apache-maven-3.3.9\repository\org\javassist\javassist\3.21.0-GA\javassist-3.21.0-GA.jar;D:\tools\apache-maven-3.3.9\repository\com\google\guava\guava\18.0\guava-18.0.jar;D:\tools\apache-maven-3.3.9\repository\com\fasterxml\classmate\1.5.1\classmate-1.5.1.jar;D:\tools\apache-maven-3.3.9\repository\org\slf4j\slf4j-api\1.7.30\slf4j-api-1.7.30.jar;D:\tools\apache-maven-3.3.9\repository\org\springframework\plugin\spring-plugin-core\1.2.0.RELEASE\spring-plugin-core-1.2.0.RELEASE.jar;D:\tools\apache-maven-3.3.9\repository\org\springframework\plugin\spring-plugin-metadata\1.2.0.RELEASE\spring-plugin-metadata-1.2.0.RELEASE.jar;D:\tools\apache-maven-3.3.9\repository\org\mapstruct\mapstruct\1.1.0.Final\mapstruct-1.1.0.Final.jar;D:\tools\apache-maven-3.3.9\repository\io\springfox\springfox-swagger-ui\2.7.0\springfox-swagger-ui-2.7.0.jar;D:\tools\apache-maven-3.3.9\repository\org\projectlombok\lombok\1.18.12\lombok-1.18.12.jar;D:\tools\apache-maven-3.3.9\repository\org\apache\opennlp\opennlp-tools\1.9.3\opennlp-tools-1.9.3.jar;D:\tools\apache-maven-3.3.9\repository\com\baomidou\mybatis-plus-boot-starter\3.4.0\mybatis-plus-boot-starter-3.4.0.jar;D:\tools\apache-maven-3.3.9\repository\com\baomidou\mybatis-plus\3.4.0\mybatis-plus-3.4.0.jar;D:\tools\apache-maven-3.3.9\repository\org\springframework\boot\spring-boot-autoconfigure\2.3.2.RELEASE\spring-boot-autoconfigure-2.3.2.RELEASE.jar;D:\tools\apache-maven-3.3.9\repository\org\springframework\boot\spring-boot-starter-jdbc\2.3.2.RELEASE\spring-boot-starter-jdbc-2.3.2.RELEASE.jar;D:\tools\apache-maven-3.3.9\repository\com\zaxxer\HikariCP\3.4.5\HikariCP-3.4.5.jar;D:\tools\apache-maven-3.3.9\repository\org\springframework\spring-jdbc\5.2.8.RELEASE\spring-jdbc-5.2.8.RELEASE.jar;D:\tools\apache-maven-3.3.9\repository\org\springframework\spring-tx\5.2.8.RELEASE\spring-tx-5.2.8.RELEASE.jar;D:\tools\apache-maven-3.3.9\repository\com\baomidou\mybatis-plus-generator\3.4.0\mybatis-plus-generator-3.4.0.jar;D:\tools\apache-maven-3.3.9\repository\com\baomidou\mybatis-plus-extension\3.4.0\mybatis-plus-extension-3.4.0.jar;D:\tools\apache-maven-3.3.9\repository\com\baomidou\mybatis-plus-core\3.4.0\mybatis-plus-core-3.4.0.jar;D:\tools\apache-maven-3.3.9\repository\com\baomidou\mybatis-plus-annotation\3.4.0\mybatis-plus-annotation-3.4.0.jar;D:\tools\apache-maven-3.3.9\repository\com\github\jsqlparser\jsqlparser\3.2\jsqlparser-3.2.jar;D:\tools\apache-maven-3.3.9\repository\org\mybatis\generator\mybatis-generator-core\1.3.2\mybatis-generator-core-1.3.2.jar;D:\tools\apache-maven-3.3.9\repository\org\mybatis\spring\boot\mybatis-spring-boot-starter\2.1.4\mybatis-spring-boot-starter-2.1.4.jar;D:\tools\apache-maven-3.3.9\repository\org\mybatis\spring\boot\mybatis-spring-boot-autoconfigure\2.1.4\mybatis-spring-boot-autoconfigure-2.1.4.jar;D:\tools\apache-maven-3.3.9\repository\org\mybatis\mybatis\3.5.6\mybatis-3.5.6.jar;D:\tools\apache-maven-3.3.9\repository\org\mybatis\mybatis-spring\2.0.6\mybatis-spring-2.0.6.jar;D:\tools\apache-maven-3.3.9\repository\mysql\mysql-connector-java\8.0.28\mysql-connector-java-8.0.28.jar;D:\tools\apache-maven-3.3.9\repository\org\n52\matlab\matlab-control\5.0.0\matlab-control-5.0.0.jar" com.example.demo.test.jydzm.YDRainfallContourExample
降雨量区间 30.0 - 60.0 毫米 GeoJSON:
{
"type": "FeatureCollection",
"features": [
{
"type": "Feature",
"properties": {
"minRainfall": 30.0,
"maxRainfall": 60.0
},
"geometry": {
"type": "MultiPolygon",
"coordinates": [
[
[
[121.48, 23.453684210526315],
[120.30842105263159, 24.367368421052632],
[120.69894736842106, 24.367368421052632],
[121.08947368421053, 24.367368421052632]
[121.48, 23.453684210526315]
]
],
[
[
[120.30842105263159, 39.9],
[120.69894736842106, 39.9],
[121.08947368421053, 39.9],
[121.48, 39.9]
[120.30842105263159, 39.9]
]
]
]
}
}
]
}
6、注意事项:
-
这个实现使用简单的欧几里得距离。对于大范围的地理区域,可能需要使用更精确的距离计算方法(如Haversine公式)。
-
网格大小(
gridSize
)决定了输出的精度。更大的网格会提供更精细的结果,但也会增加计算时间。 -
这个实现假设所有站点的权重相等。在实际应用中,可能需要根据站点的可靠性或其他因素调整权重。
-
当前实现中,多边形的生成是简化的示例。在实际应用中,您需要实现更复杂的算法来生成真正的等值面多边形。
-
生成的 GeoJSON 数据结构现在符合 FeatureCollection 规范,包含一个 Feature,其中有一个 MultiPolygon 类型的 geometry。
-
降雨量区间的定义(0-30, 30-60, 60+)仍然是硬编码的。在实际应用中,您可能需要根据实际数据动态确定这些区间。
-
生成的 GeoJSON 数据可以被许多 GIS 软件和库(如 Leaflet、Mapbox 等)直接使用,用于可视化降雨等值面。
-
在实际应用中,可能需要根据实际情况调整插值方法或添加其他考虑因素(如地形)。
到此、根据雨量站点信息计算降雨等值面数据,下篇我们分析水文模型的原理和测试分析,敬请期待。