GIS总结

GIS介绍:全称Geographic Information System(地理信息系统)

要素模型(Feature)
它是描述地理空间数据对象的基本单位,它描述了一个现实世界中的客观地理实体,如:一条河流、一座桥梁都可以理解为要素


栅格数据
栅格数据是从上向下拍摄的地球照片,使用离散单元存储其值,图片的每个像素点都有一个指定值服务器本身存储,传输速度快,服务器压力小,多为png,jpg,gif数据量大,更新慢


矢量数据
矢量数据是仅仅存储节点,比如箭头,线条,点等。存储的是对象的轮廓,而栅格数据适合表达对象的内容。矢量数据类型有点、线和面。数量小,数据更新快服务器压力大,技术要求高

数据类型介绍
栅格数据:

栅格数据的优势:

  • 适用范围广:栅格数据适用于描述大范围地理现象,例如土地覆盖、气象变化、海洋温度等。这些数据通常覆盖大面积,而且数据分辨率相对较低。
  • 连续性强:栅格数据中每个像素都代表一个位置上的属性值,可以形成完整的空间连续性。这使得栅格数据在进行空间分析时能够提供更精细和准确的结果。
  • 数据格式统一:栅格数据的格式相对统一,常见的格式包括GeoTIFF、GRID、BIL、BIP、BSQ等。这使得栅格数据在不同的GIS软件和平台上可以更方便地共享和处理。
  • 数据处理简单:栅格数据的处理通常比矢量数据简单,因为它们只需要进行基本的数学和统计计算,如平均值、最大值、最小值等。这些计算通常不需要复杂的几何运算。
  • 可视化效果好:由于栅格数据的连续性,其可视化效果相对较好。例如,在地图上显示高程模型数据时,可以使用不同的颜色渐变来表示不同的海拔高度,从而形成非常直观的三维地形模型。

文件头部分:
通常包含栅格数据的一些基本信息,例如数据类型、数据格式、地理坐标系、栅格像素数、栅格像素大小等。这部分信息通常是以二进制形式存储在文件的开头,其格式和内容可能因数据格式而异

数据部分: 会存在多个像素波段,每个波段含有对应像素的值。每个像素的值通常是一个数值,表示该像素的属性值(可以是高度、温度、颜色深浅等等)。这些像素值通常是按行存储的,每一行从左到右存储。不同的栅格数据格式可能还会有一些元数据,例如像素值的数据类型、缺失值标识等

矢量数据:

矢量数据的优势:

  • 精度高:矢量数据可以描述精细的地理现象,例如建筑物、交通网络、河流、边界等,因此具有比栅格数据更高的精度和准确性。这使得矢量数据在需要高精度分析和建模的场景中非常有用。
  • 数据量小:相对于栅格数据而言,矢量数据的数据量通常较小,因为它们只需要存储要素的位置、形状和属性信息等,而不需要存储每个像素的值。这使得矢量数据在存储和传输方面更加高效。
  • 数据格式灵活:矢量数据的格式相对灵活,常见的格式包括Shapefile、GeoJSON、KML等。这使得矢量数据可以适用于不同的GIS软件和平台,并且可以方便地进行共享和交换。
  • 几何运算方便:由于矢量数据是基于几何要素的,因此进行几何运算和分析相对容易。例如,在计算两个区域之间的距离时,只需要对它们的边界进行计算即可。
  • 可视化效果好:由于矢量数据的精度和准确性较高,其可视化效果相对较好。例如,在地图上显示道路和建筑物时,可以使用不同的符号和颜色来表示不同的要素类型和属性信息,从而形成非常直观的地图。

文件头部分:
通常包含矢量数据的一些基本信息,例如数据类型、数据格式、地理坐标系、要素数目等。这部分信息通常是以二进制形式存储在文件的开头,其格式和内容可能因数据格式而异

几何要素数据部分:
包含矢量数据的实际几何信息。每个几何要素通常由若干个坐标点组成,这些坐标点的顺序和方式通常根据具体的数据格式而定。常见的矢量数据格式包括点数据、线数据和面数据等。

属性数据部分:
包含与几何要素相关联的属性信息,例如地物名称、坐标点的高程值、温度值等。这些属性数据通常是按记录存储的,每个记录包含一个或多个属性字段。不同的矢量数据格式可能还会有一些元数据,例如属性值的数据类型、缺失值标识等。

类型数据处理示例
读取清洗成新的栅格数据:
/**
     * 通用新增为tif上色 现在tiff不上色
     *
     * @param tifUrl 文件地址
     * @return levels索引位置对应生成的文件地址
     */
    public String tiffProcess(String tifUrl) {
        Dataset open = gdal.Open(tifUrl, gdalconstConstants.GA_ReadOnly);
        /*
          获取gtiff 数据
         */
        //行数 高
        int iYSize = open.getRasterYSize();
        //列数 宽
        int iXSize = open.getRasterXSize();
        //仿射矩阵
        double[] doubles = open.GetGeoTransform();
        //地图投影信息
        String projection = open.GetProjection();
        //将数据写成数组
        Band sourceBand = open.GetRasterBand(1);
        double[] doubles1 = new double[2];
        sourceBand.ComputeRasterMinMax(doubles1);
        double[][] data = new double[iYSize][iXSize];
        for (int i = 0; i < iYSize; i++) {
            double[] d1 = new double[iXSize];
            sourceBand.ReadRaster(0, i, iXSize, 1, d1);    //读取一行数据
            for (int i1 = 0; i1 < d1.length; i1++) {
                if (d1[i1] > 0) {
                    data[i][i1] = d1[i1];
                }
            }
        }


        /*
          生成tiff
         */
        Driver driver = gdal.GetDriverByName("GTiff");
        String newFile = tifUrl.substring(0, tifUrl.length() - 4) + ".tif";
        Dataset create = driver.Create(newFile, iXSize, iYSize, 1, gdalconst.GDT_Byte);
        //设置仿射矩阵
        create.SetGeoTransform(doubles);
        //设置投影信息
        create.SetProjection(projection);
        //设置波段
        Band targetBand = create.GetRasterBand(1);
        double[] colorRange = new double[2];
        sourceBand.ComputeRasterMinMax(colorRange);
        targetBand.SetNoDataValue(0);
        //设置波段值
        int[] temp = new int[1];
        for (int i = 0; i < data.length; i++) {
            for (int j = 0; j < data[i].length; j++) {
                temp[0] = convertPixel(colorRange[0], colorRange[1], data[i][j]);
                if (temp[0] != 0) {
                    targetBand.WriteRaster(j, i, 1, 1, temp);
                }
            }
        }


        open.delete();
        create.delete();

        return newFile;
    }

    /**
     * 像素波段等级区间判断转换 1-4 高-低
     *
     * @param min 像素最小值
     * @param max 像素最大值
     * @param now 比较值
     */
    public static int convertPixel(double min, double max, double now) {
        min = 100000D * min;
        max = max * 100000D;
        now = now * 100000D;
        double v = (max - min) / 4;
        double v2 = v * 2;
        double v3 = v * 3;
        if (min <= now && (min + v) > now) {//高
            return 1;
        } else if ((min + v) <= now && (min + v2) > now) {//较高
            return 2;
        } else if ((min + v2) <= now && (min + v3) > now) { //中
            return 3;
        } else if ((min + v3) <= now && max >= now) { //低
            return 4;
        } else {
            return 0;
        }
    }
geoserver介绍

GeoServer是一个开源的地理空间数据服务器
它可以用来发布和管理地理空间数据,并提供各种服务,例如地图渲染、地理编码、空间分析等。GeoServer可以读取各种格式的地理空间数据,例如Shapefile、PostGIS、Oracle Spatial、GeoJSON等,支持各种标准的地理空间数据协议,例如WMS、WFS、WCS、WPS等,同时也支持各种地图样式和渲染效果,例如SLD、CSS等。
如果是前后端结合的项目,也可以在后端配置geotools或者postgis把地理数据返回到前端,前端进行渲染加载;

相关特性:

  • 数据存储支持:Geoserver支持多种数据存储,包括PostGIS、Oracle Spatial、MySQL、Shapefile、GeoTIFF等。其中,PostGIS是最常用的数据库存储方式,支持的空间数据类型最全面,性能最优秀。用户可以根据自己的需求选择合适的数据存储方式。
  • 样式设置:Geoserver支持用户自定义样式,通过Symbology Encoding规范来实现。用户可以使用内置的样式模板,也可以自己创建样式模板。此外,Geoserver还支持符号化规则,使用户能够根据属性和值对数据进行符号化。
  • 安全设置:Geoserver提供了灵活的安全设置,可以通过基于角色的授权来限制用户对数据的访问。可以通过LDAP、Active Directory等集中式身份验证服务,或者使用内置的用户存储来管理用户和角色。用户可以自定义角色和权限,以实现更加细粒度的授权控制。
  • Web服务发布:Geoserver支持OGC标准的Web服务发布,包括WMS、WFS、WCS、WPS等。用户可以选择发布哪些服务,以及服务的参数设置。同时,Geoserver还支持REST API,可以通过HTTP请求来进行数据访问和管理。
  • 插件扩展:Geoserver支持插件扩展,可以通过插件来扩展Geoserver的功能。例如,通过GeoWebCache插件可以提高WMS服务的性能和稳定性,通过WPS插件可以实现Web处理服务。
  • 社区支持:Geoserver是一个开源项目,有一个活跃的社区支持。用户可以通过邮件列表、论坛、社交媒体等途径获取技术支持、提出问题和建议,参与社区贡献。
  • 其他特性:Geoserver还具有其他一些特性,例如支持空间数据分析、支持动态投影、支持数据版本控制等。这些特性可以使用户更加方便地进行空间数据处理和管理。

通过代码发布图层服务到geoserver:

		// 如果不存在工作区则创建
        URL u = new URL(geoserverUrl.getUrl());
        GeoServerRESTManager manager = new GeoServerRESTManager(u, geoserverUrl.getUserName(), geoserverUrl.getPassword());
        GeoServerRESTPublisher publisher = manager.getPublisher();
        GeoServerRESTReader reader = manager.getReader();
        List<String> workspaces = manager.getReader().getWorkspaceNames();
        if (!workspaces.contains(geoserverUrl.getWorkSpace())) {
            publisher.createWorkspace(geoserverUrl.getWorkSpace());
        }

        File file = new File(filePath);
        String fileName = file.getName().replace(".shp", "");
        String zipFile = filePath.replace(".shp", ".zip");

        //判断数据存储(datastore)是否已经存在,不存在则创建
        RESTDataStore restStore = manager.getReader().getDatastore(geoserverUrl.getWorkSpace(), fileName);
        if (restStore == null) {
            //创建shape文件存储
            URL url = new URL("file://" + filePath);
            GSShapefileDatastoreEncoder store = new GSShapefileDatastoreEncoder(fileName, url);
            manager.getStoreManager().create(geoserverUrl.getWorkSpace(), store);
        }

        //发布图层
        //判断图层是否已经存在,不存在则创建并发布
        RESTLayer layer = reader.getLayer(geoserverUrl.getWorkSpace(), fileName);
        if (layer == null) {
            manager.getPublisher().publishShp(geoserverUrl.getWorkSpace(), geoserverUrl.getWorkSpace(),
                                                          fileName, new File(zipFile), GeoServerRESTPublisher.DEFAULT_CRS, geoserverUrl.getStyle());
            layer = reader.getLayer(geoserverUrl.getWorkSpace(), fileName);
        }
        RESTWms wms = manager.getReader().getWms(layer);
        RESTBoundingBox nativeBoundingBox = wms.getNativeBoundingBox();
        fileName=fileName+";"+wms.getSRS()+";"+nativeBoundingBox.getMinX()+","+nativeBoundingBox.getMinY()+","+nativeBoundingBox.getMaxX()+","+nativeBoundingBox.getMaxY();
        return fileName;

你可能感兴趣的:(gis,java,gis)