根据雨量站点信息计算降雨等值面数据

根据雨量站点信息计算降雨等值面数据是常用的场景,比已知某地区所有雨量站的降雨信息,包括经纬度和降雨量,所有网格点的经纬度和计算得到的降雨量列表信息,按照降雨量从小到大分为三组,每组是一个降雨量区间,比如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 类

  1. 包含 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 等)直接使用,用于可视化降雨等值面。

  • 在实际应用中,可能需要根据实际情况调整插值方法或添加其他考虑因素(如地形)。

到此、根据雨量站点信息计算降雨等值面数据,下篇我们分析水文模型的原理和测试分析,敬请期待。

ArcGIS是一款功能强大的地理信息系统软件,可以用于处理和分析各种地理数据根据雨量站点数据生成等值面是ArcGIS的常见应用之一。 通过ArcGIS,我们可以导入雨量站点数据,每个站点数据包括经纬度坐标和对应的雨量数值。然后,我们可以使用插值工具来创建等值面。 首先,我们需要选择合适的插值方法。常用的插值方法有:反距离加权插值法(IDW)、普通克里格插值法、样条插值法等。每种插值方法都有其特定的适用场景和计算原理,选择合适的方法可以得到更准确的结果。 然后,我们可以设置一些参数,比如插值半径、权重等。这些参数会影响最终等值面生成效果,需要根据具体情况进行调整。 接下来,我们可以运行插值工具,系统会根据选择的插值方法和参数,对雨量站点数据进行插值计算计算结果将以栅格数据的形式呈现。 最后,我们可以通过栅格数据生成等值面等值面是连接具有相同数值的点的线,用于表示不同数值区域的分布情况。我们可以在ArcGIS中使用等值面工具,将栅格数据转换为等值线或等值填充面。生成等值面可以提供直观的可视化效果,帮助我们理解和分析雨量的空间分布特征。 总之,ArcGIS可以利用雨量站点数据生成等值面,并提供丰富的工具和功能来支持地理数据的处理和分析。通过对等值面生成,我们可以更好地了解雨量的空间分布情况,并为相关决策和规划提供科学依据。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

寅灯

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值