要素模型(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可以读取各种格式的地理空间数据,例如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;