¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.se.simu.utils; |
| | | |
| | | import com.alibaba.fastjson.JSONArray; |
| | | import com.alibaba.fastjson.JSONObject; |
| | | import org.gdal.gdal.gdal; |
| | | import org.gdal.ogr.*; |
| | | import org.gdal.osr.CoordinateTransformation; |
| | | import org.gdal.osr.SpatialReference; |
| | | |
| | | import java.util.Arrays; |
| | | |
| | | /** |
| | | * shp å·¥å
·å®ç¨ç¨åº |
| | | * |
| | | * @author xingjinshuang@smartearth.cn |
| | | * @date 2024/12/26 |
| | | */ |
| | | public class ShpToolUtils { |
| | | |
| | | // 声æä¸ºç±»æååé |
| | | private static double minX = Double.MAX_VALUE; |
| | | private static double maxX = Double.MIN_VALUE; |
| | | private static double minY = Double.MAX_VALUE; |
| | | private static double maxY = Double.MIN_VALUE; |
| | | |
| | | // ç¨äºå卿æè½¬æ¢åçç»çº¬åº¦ |
| | | private static JSONArray coordinatesArray = new JSONArray(); |
| | | |
| | | /** |
| | | * é
读 SHP |
| | | * |
| | | * @param strVectorFile str åéæä»¶ |
| | | * @return {@link JSONObject} |
| | | */ |
| | | public static JSONObject readShp(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); |
| | | JSONObject json = new JSONObject(); |
| | | json.put("minX", minX); |
| | | json.put("maxX", maxX); |
| | | json.put("minY", minY); |
| | | json.put("maxY", maxY); |
| | | return json; |
| | | } |
| | | |
| | | // å¤çå个ç¹çå ä½ä½ |
| | | private static void processPointGeometry(Geometry geometry, CoordinateTransformation coordTransform) { |
| | | double x = geometry.GetX(); |
| | | double y = geometry.GetY(); |
| | | |
| | | // å建å
å« 3 个å
ç´ çæ°ç»ï¼Z åæ å¯ä»¥è®¾ä¸º 0 |
| | | double[] coords = new double[]{x, y, 0}; // Z åæ é»è®¤å¼ä¸º 0 |
| | | //System.out.println("åå§åæ 1ï¼coords = " + Arrays.toString(coords)); |
| | | |
| | | // 转æ¢åæ |
| | | coordTransform.TransformPoint(coords); |
| | | //System.out.println("转æ¢åçåæ ï¼coords = " + Arrays.toString(coords)); |
| | | |
| | | // åæ é¡ºåºæ¯ [latitude, longitude]ï¼äº¤æ¢é¡ºåºä¸º [longitude, latitude] |
| | | double longitude = coords[0]; |
| | | double latitude = coords[1]; |
| | | //System.out.println("转æ¢åçç»çº¬åº¦ï¼longitude = " + longitude + ", latitude = " + latitude); |
| | | // å建ä¸ä¸ª JSON 对象ä¿åç»çº¬åº¦ä¿¡æ¯ |
| | | JSONObject coordObj = new JSONObject(); |
| | | coordObj.put("lat", longitude); |
| | | coordObj.put("lon", latitude); |
| | | // å°æ¤ JSON 对象添å å° JSONArray ä¸ |
| | | coordinatesArray.add(coordObj); |
| | | |
| | | // æ´æ°ç©å½¢è¾¹çï¼æ¤å¤ä½¿ç¨å
¨å±åéæè¿åå¼è¿è¡è®¡ç®ï¼ |
| | | updateRectangleBounds(coords); |
| | | } |
| | | |
| | | // å¤çå¤ç¹çå ä½ä½ |
| | | private static void processMultiPointGeometry(Geometry geometry, CoordinateTransformation coordTransform) { |
| | | int numPoints = geometry.GetGeometryCount(); |
| | | for (int j = 0; j < numPoints; j++) { |
| | | Geometry pointGeometry = geometry.GetGeometryRef(j); |
| | | double x = pointGeometry.GetX(); |
| | | double y = pointGeometry.GetY(); |
| | | |
| | | // å建å
å« 3 个å
ç´ çæ°ç»ï¼Z åæ å¯ä»¥è®¾ä¸º 0 |
| | | double[] coords = new double[]{x, y, 0}; // Z åæ é»è®¤å¼ä¸º 0 |
| | | System.out.println("åå§åæ 2ï¼coords = " + Arrays.toString(coords)); |
| | | |
| | | // 转æ¢åæ |
| | | coordTransform.TransformPoint(coords); |
| | | System.out.println("转æ¢åçåæ ï¼coords = " + Arrays.toString(coords)); |
| | | |
| | | // åæ é¡ºåºæ¯ [latitude, longitude]ï¼äº¤æ¢é¡ºåºä¸º [longitude, latitude] |
| | | double longitude = coords[0]; |
| | | double latitude = coords[1]; |
| | | System.out.println("转æ¢åçç»çº¬åº¦ï¼longitude = " + longitude + ", latitude = " + latitude); |
| | | |
| | | // æ´æ°ç©å½¢è¾¹ç |
| | | updateRectangleBounds(coords); |
| | | } |
| | | } |
| | | |
| | | // æ´æ°ç©å½¢çè¾¹çå¼ |
| | | private static void updateRectangleBounds(double[] coords) { |
| | | double x = coords[0]; |
| | | double y = coords[1]; |
| | | |
| | | // æ´æ°æå°æå¤§å¼ |
| | | minX = Math.min(minX, x); |
| | | maxX = Math.max(maxX, x); |
| | | minY = Math.min(minY, y); |
| | | maxY = Math.max(maxY, y); |
| | | } |
| | | |
| | | public static void main(String[] args) { |
| | | // 读åshpæä»¶ |
| | | readShp("D:\\0a_project\\model\\shp\\é¨éç«ç¹æ°æ®\\é¨éç«ç¹_4548\\é¨éç«ç¹_4548.shp"); |
| | | System.out.println(coordinatesArray.toString()); // Pretty print with indent |
| | | |
| | | } |
| | | } |