| | |
| | | return json; |
| | | } |
| | | |
| | | |
| | | /** |
| | | * 读取 shp get local |
| | | * |
| | | * @param strVectorFile str 向量文件 |
| | | * @return {@link JSONObject} |
| | | */ |
| | | public static JSONArray readShpGetLocal(String strVectorFile) { |
| | | // 注册所有的驱动 |
| | | ogr.RegisterAll(); |
| | | // 为了支持中文路径,请添加下面这句代码 |
| | | gdal.SetConfigOption("GDAL_FILENAME_IS_UTF8", "YES"); |
| | | |
| | | // 读取数据,这里以ESRI的shp文件为例 |
| | | String strDriverName = "ESRI Shapefile"; |
| | | org.gdal.ogr.Driver oDriver = ogr.GetDriverByName(strDriverName); |
| | | |
| | | if (oDriver == null) { |
| | | System.out.println(strDriverName + " 驱动不可用!\n"); |
| | | return null; |
| | | } |
| | | |
| | | // 打开数据源 |
| | | DataSource dataSource = oDriver.Open(strVectorFile); |
| | | if (dataSource == null) { |
| | | System.out.println("无法打开 Shapefile 文件!"); |
| | | return null; |
| | | } |
| | | |
| | | Layer layer = dataSource.GetLayer(0); |
| | | |
| | | // 获取图层的范围(初步的矩形范围) |
| | | double[] layerExtent = layer.GetExtent(); |
| | | System.out.println("初始图层范围:minx:" + layerExtent[0] + ", maxx:" + layerExtent[1] + ", miny:" + layerExtent[2] + ", maxy:" + layerExtent[3]); |
| | | |
| | | // 获取图层的空间参考 |
| | | SpatialReference layerSpatialRef = layer.GetSpatialRef(); |
| | | |
| | | // 创建目标空间参考 (EPSG:4326) |
| | | SpatialReference targetSpatialRef = new SpatialReference(); |
| | | targetSpatialRef.ImportFromEPSG(4326); // EPSG:4326 是 WGS84 |
| | | |
| | | // 创建坐标转换对象 |
| | | CoordinateTransformation coordTransform = CoordinateTransformation.CreateCoordinateTransformation(layerSpatialRef, targetSpatialRef); |
| | | |
| | | // 遍历每个 feature 获取坐标点 |
| | | for (int i = 0; i < layer.GetFeatureCount(); i++) { |
| | | Feature feature = layer.GetFeature(i); |
| | | Geometry geometry = feature.GetGeometryRef(); |
| | | // 判断几何类型并处理 |
| | | if (geometry != null) { |
| | | if (geometry.GetGeometryType() == ogr.wkbPoint) { |
| | | // 单个点的处理 |
| | | processPointGeometry(geometry, coordTransform); |
| | | } else if (geometry.GetGeometryType() == ogr.wkbMultiPoint) { |
| | | // 多个点的处理 |
| | | System.out.println("geometry = " + geometry); |
| | | //processMultiPointGeometry(geometry, coordTransform); |
| | | } |
| | | } |
| | | } |
| | | // 打印转换后的矩形范围(经纬度) |
| | | System.out.println("所有点的经纬度矩形范围:minX = " + minX + ", maxX = " + maxX + ", minY = " + minY + ", maxY = " + maxY); |
| | | return coordinatesArray; |
| | | } |
| | | |
| | | // 处理单个点的几何体 |
| | | private static void processPointGeometry(Geometry geometry, CoordinateTransformation coordTransform) { |
| | | double x = geometry.GetX(); |