ShpDebug3.java 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. package com.ruoyi.test;
  2. import java.io.*;
  3. public class ShpDebug3 {
  4. public static void main(String[] args) throws Exception {
  5. String shpPath = "d:\\Web\\PlatformModel\\ruoyi-admin\\uploads\\models\\geojson\\8aa64945328e428d97923165c8b8cf31\\流域.shp";
  6. FileInputStream fis = new FileInputStream(shpPath);
  7. fis.skip(100); // Skip header
  8. byte[] recordHeader = new byte[8];
  9. fis.read(recordHeader);
  10. int contentLengthWords = readIntBE(recordHeader, 4);
  11. int contentLength = contentLengthWords * 2;
  12. byte[] recordContent = new byte[contentLength];
  13. fis.read(recordContent);
  14. System.out.println("Content Length: " + contentLength);
  15. System.out.println("\n--- Polygon Structure ---");
  16. System.out.println("Offset 0-3: Shape type = " + recordContent[0]);
  17. System.out.println("\n--- Bounding Box (8 bytes each) ---");
  18. System.out.println("Offset 4-11 (Xmin): " + readDoubleLE(recordContent, 4));
  19. System.out.println("Offset 12-19 (Ymin): " + readDoubleLE(recordContent, 12));
  20. System.out.println("Offset 20-27 (Xmax): " + readDoubleLE(recordContent, 20));
  21. System.out.println("Offset 28-35 (Ymax): " + readDoubleLE(recordContent, 28));
  22. System.out.println("\n--- After Bounding Box ---");
  23. System.out.println("Offset 36-39 (numParts): " + readIntLE(recordContent, 36));
  24. System.out.println("Offset 40-43 (numPoints): " + readIntLE(recordContent, 40));
  25. fis.close();
  26. }
  27. static int readIntBE(byte[] data, int offset) {
  28. return ((data[offset] & 0xFF) << 24) |
  29. ((data[offset + 1] & 0xFF) << 16) |
  30. ((data[offset + 2] & 0xFF) << 8) |
  31. (data[offset + 3] & 0xFF);
  32. }
  33. static int readIntLE(byte[] data, int offset) {
  34. return (data[offset] & 0xFF) |
  35. ((data[offset + 1] & 0xFF) << 8) |
  36. ((data[offset + 2] & 0xFF) << 16) |
  37. ((data[offset + 3] & 0xFF) << 24);
  38. }
  39. static double readDoubleLE(byte[] data, int offset) {
  40. long bits = (data[offset] & 0xFFL) |
  41. ((data[offset + 1] & 0xFFL) << 8) |
  42. ((data[offset + 2] & 0xFFL) << 16) |
  43. ((data[offset + 3] & 0xFFL) << 24) |
  44. ((data[offset + 4] & 0xFFL) << 32) |
  45. ((data[offset + 5] & 0xFFL) << 40) |
  46. ((data[offset + 6] & 0xFFL) << 48) |
  47. ((data[offset + 7] & 0xFFL) << 56);
  48. return Double.longBitsToDouble(bits);
  49. }
  50. }