利用oracle提供的一个工具类可以很方便地把shape文件写入oracle数据库
主要是 oracle.spatial.util.SampleShapefileToJGeomFeature 类
该类提供了main()方法,直接传递数据库相关信息即可:
下面是一个我写的源码示例:
1 import java.io.File; 2 import java.io.FileNotFoundException; 3 import java.sql.Connection; 4 import java.sql.Statement; 5 6 import javax.swing.JFileChooser; 7 import javax.swing.filechooser.FileFilter; 8 9 import oracle.spatial.util.SampleShapefileToJGeomFeature; 10 11 import demo.Connect; 12 13 14 public class UploadShapeFileToOracleDB { 15 public static void main(String[] args) throws Exception { 16 updata(args); 17 } 18 19 /** 20 * Prompt for File if not provided on the command line. Don't forget the 21 * quotes around your path if there are spaces! 22 * 23 * @throws FileNotFoundException 24 * 打开shp文件对话框 获取相关参数 用到了两个重要的 25 * 系统类 (1)FIle类 (2)JFileChooser类 26 */ 27 private static File promptShapeFile(String[] args) 28 throws FileNotFoundException { 29 File file; 30 /* 31 * 32 * 如果没有输入参数执行下面的代码 33 */ 34 if (args.length == 0) { 35 JFileChooser chooser = new JFileChooser();// 文件对话框 36 chooser.setDialogTitle("Open Shapefile for Reprojection"); 37 /* 38 * FileFilter为抽象类 需要实例化两个方法 (1)accept(); (2)getDescription(); 39 */ 40 chooser.setFileFilter(new FileFilter() { 41 public boolean accept(File f) { 42 return f.isDirectory() || f.getPath().endsWith("shp") 43 || f.getPath().endsWith("SHP"); 44 } 45 public String getDescription() { 46 return "Shapefiles"; 47 } 48 }); 49 /* 50 * 打开对话框 51 */ 52 int returnVal = chooser.showOpenDialog(null); 53 54 /* 55 * 判断是够选择了yes还是NO 56 */ 57 if (returnVal != JFileChooser.APPROVE_OPTION) { 58 System.exit(0); 59 } 60 61 file = chooser.getSelectedFile(); 62 /* 63 * 成功输出正确的文件名 64 */ 65 System.out 66 .println("You chose to open this file: " + file.getName()); 67 } else { 68 /* 69 * 直接提供参数说明 * 70 */ 71 file = new File(args[0]); 72 } 73 /* 74 * 最后验证file是否存在 如果不存在则显示抛出异常 75 */ 76 if (!file.exists()) { 77 throw new FileNotFoundException(file.getAbsolutePath()); 78 } 79 return file; 80 } 81 /** 82 * 83 * @param args 84 * @throws Exception 85 */ 86 public static void updata(String[] args) throws Exception { 87 /* 88 * -h 127.0.0.1 host: 127.0.0.1 89 * -p 1521 port: 1521 90 -s orcl111 sid: orcl111 91 -u spatial db_username: spatial 92 -d spatial db_password: spatial 93 -t us_cities db_tablename: us_cities 94 -f shp_cities shapefile_name: shp_cities 95 -r 8307 SRID: 8307 96 */ 97 String tableName="tabletest"; 98 String[] param=new String[16]; 99 100 param[0]="-h"; 101 param[1]="127.0.0.1"; 102 103 param[2]="-p"; 104 param[3]="1521"; 105 106 param[4]="-s"; 107 param[5]="XE "; 108 109 param[6]="-u"; 110 param[7]="system"; 111 112 param[8]="-d"; 113 param[9]="root"; 114 115 param[10]="-t"; 116 param[11]=tableName; 117 118 param[12]="-f"; 119 120 param[14]="-r"; 121 param[15]="8307"; 122 123 File file = promptShapeFile(args); 124 String shapeFileName = file.getPath(); 125 shapeFileName=shapeFileName.replaceAll(".shp", ""); 126 127 param[13]=shapeFileName; 128 129 /* 130 * 把数据插入oracle数据库 131 * */ 132 SampleShapefileToJGeomFeature.main(param); 133 134 /* 135 * 给新建的表建立空间索引 136 */ 137 Connection connection=Connect.getConnect(); 138 Statement stmt = connection.createStatement(); 139 String INDEX="CREATE Index "+tableName+"_idx ON "+ tableName +"(GEOMETRY) INDEXTYPE is MDSYS.SPATIAL_INDEX"; 140 stmt.execute(INDEX); 141 stmt.close(); 142 connection.close(); 143 } 144 }
Connect类为 :
1 package demo; 2 3 import java.sql.Connection; 4 import java.sql.DriverManager; 5 import java.sql.SQLException; 6 7 public class Connect { 8 private static String url = "jdbc:oracle:thin:@127.0.0.1:1521:XE"; 9 private static String username = "system"; 10 private static String pw = "root"; 11 private static Connection conn = null; 12 13 public static Connection getConnect() { 14 try { 15 Class.forName("oracle.jdbc.driver.OracleDriver"); 16 try { 17 conn = DriverManager.getConnection(url, username, pw); 18 } catch (SQLException e) { 19 e.printStackTrace(); 20 } 21 } catch (ClassNotFoundException e) { 22 e.printStackTrace(); 23 } 24 return conn; 25 } 26 27 public void testConnect() { 28 Connection con = getConnect(); 29 if (con == null) 30 System.out.print("连接失败"); 31 else 32 System.out.print("连接成功"); 33 } 34 }
利用geotools也可实现shape文件存入oralce数据库,但直接利用oracle提供的类来实现shape文件存入oracle数据库还是很方便的!