引入依赖
< dependency>
< groupId> org.geotools</ groupId>
< artifactId> gt-shapefile</ artifactId>
< version> ${geotools.version}</ version>
</ dependency>
< dependency>
< groupId> org.geotools</ groupId>
< artifactId> gt-swing</ artifactId>
< version> ${geotools.version}</ version>
</ dependency>
使用方法
工具类
import org. apache. commons. collections. CollectionUtils ;
import org. apache. commons. collections. MapUtils ;
import org. apache. commons. lang3. StringUtils ;
import org. geotools. data. FeatureWriter ;
import org. geotools. data. Transaction ;
import org. geotools. data. shapefile. ShapefileDataStore ;
import org. geotools. data. shapefile. ShapefileDataStoreFactory ;
import org. geotools. feature. simple. SimpleFeatureTypeBuilder ;
import org. geotools. referencing. crs. DefaultGeographicCRS ;
import org. opengis. feature. simple. SimpleFeature ;
import org. opengis. feature. simple. SimpleFeatureType ;
import javax. servlet. http. HttpServletResponse ;
import java. io. * ;
import java. nio. charset. Charset ;
import java. util. HashMap ;
import java. util. List ;
import java. util. Map ;
import java. util. Objects ;
import java. util. zip. ZipEntry ;
import java. util. zip. ZipOutputStream ;
public class ShapeUtil {
public static final String DEF_GEOM_KEY = "the_geom" ;
public static final String DEF_ENCODE = "uft-8" ;
public static void createShp ( String shpPath, Class < ? > geomType, List < Map < String , ? > > data) {
try {
createShp ( shpPath, DEF_ENCODE , geomType, data) ;
} catch ( Exception e) {
e. printStackTrace ( ) ;
}
}
public static void createShp ( String shpPath, String encode, Class < ? > geomType, List < Map < String , ? > > data) {
try {
if ( StringUtils . isEmpty ( shpPath) ) {
throw new Exception ( "shp文件的路径不能为空,shpPath: " + shpPath) ;
}
if ( StringUtils . isEmpty ( encode) ) {
throw new Exception ( "shp文件的编码不能为空,encode: " + encode) ;
}
if ( Objects . isNull ( geomType) ) {
throw new Exception ( "shp文件的图形类型不能为空,geomType: " + geomType) ;
}
if ( CollectionUtils . isEmpty ( data) ) {
throw new Exception ( "shp文件的图形数据不能为空,data: " + data) ;
}
if ( ! data. get ( 0 ) . containsKey ( DEF_GEOM_KEY ) ) {
throw new Exception ( "shp文件的图形数据中必须包含the_geom的属性,data: " + data) ;
}
File file = new File ( shpPath) ;
if ( ! file. getParentFile ( ) . exists ( ) ) {
file. getParentFile ( ) . mkdirs ( ) ;
}
Map < String , Serializable > params = new HashMap < > ( ) ;
params. put ( ShapefileDataStoreFactory . URLP . key, file. toURI ( ) . toURL ( ) ) ;
ShapefileDataStore ds = ( ShapefileDataStore ) new ShapefileDataStoreFactory ( ) . createNewDataStore ( params) ;
ds. createSchema ( builderFeatureType ( geomType, CollectionUtils . isEmpty ( data) ? null : data. get ( 0 ) ) ) ;
Charset charset = Charset . forName ( encode) ;
ds. setCharset ( charset) ;
String [ ] typeName= ds. getTypeNames ( ) ;
FeatureWriter < SimpleFeatureType , SimpleFeature > writer = ds. getFeatureWriter ( ds. getTypeNames ( ) [ 0 ] , Transaction . AUTO_COMMIT ) ;
for ( Map < String , ? > map : data) {
SimpleFeature feature = writer. next ( ) ;
for ( String key : map. keySet ( ) ) {
if ( DEF_GEOM_KEY . equals ( key) ) {
feature. setAttribute ( key, map. get ( key) ) ;
} else {
feature. setAttribute ( key. toUpperCase ( ) , map. get ( key) ) ;
}
}
}
writer. write ( ) ;
writer. close ( ) ;
ds. dispose ( ) ;
} catch ( Exception e) {
e. printStackTrace ( ) ;
}
}
public static SimpleFeatureType builderFeatureType ( Class < ? > geomType, Map < String , ? > data) {
SimpleFeatureTypeBuilder ftb = new SimpleFeatureTypeBuilder ( ) ;
ftb. setCRS ( DefaultGeographicCRS . WGS84 ) ;
ftb. setName ( "shapefile" ) ;
ftb. add ( DEF_GEOM_KEY , geomType) ;
if ( MapUtils . isNotEmpty ( data) ) {
for ( String key : data. keySet ( ) ) {
if ( Objects . nonNull ( data. get ( key) ) ) {
ftb. add ( key. toUpperCase ( ) , data. get ( key) . getClass ( ) ) ;
}
}
}
return ftb. buildFeatureType ( ) ;
}
public static void zipShapeFile ( String shpPath) {
try {
File shpFile = new File ( shpPath) ;
String shpRoot = shpFile. getParentFile ( ) . getPath ( ) ;
String shpName = shpFile. getName ( ) . substring ( 0 , shpFile. getName ( ) . lastIndexOf ( "." ) ) ;
String zipPath = shpRoot + File . separator + shpName + ".zip" ;
File zipFile = new File ( zipPath) ;
InputStream input = null ;
ZipOutputStream zipOut = new ZipOutputStream ( new FileOutputStream ( zipFile) ) ;
zipOut. setComment ( shpName) ;
String [ ] shpFiles = new String [ ] {
shpRoot + File . separator + shpName + ".dbf" ,
shpRoot + File . separator + shpName + ".prj" ,
shpRoot + File . separator + shpName + ".shp" ,
shpRoot + File . separator + shpName + ".shx" ,
shpRoot + File . separator + shpName + ".fix"
} ;
for ( int i = 0 ; i < shpFiles. length; i++ ) {
File file = new File ( shpFiles[ i] ) ;
input = new FileInputStream ( file) ;
zipOut. putNextEntry ( new ZipEntry ( file. getName ( ) ) ) ;
int temp = 0 ;
while ( ( temp = input. read ( ) ) != - 1 ) {
zipOut. write ( temp) ;
}
input. close ( ) ;
}
zipOut. close ( ) ;
} catch ( Exception e) {
e. printStackTrace ( ) ;
}
}
}
具体使用
public void exportCornerShp ( String evid, List < Map < String , String > > cornerDatas, HttpServletResponse httpServletResponse) throws Exception {
EvGimcheckTask evGimcheckTask= evGimcheckTaskMapper. selectById ( evid) ;
String projectCode= evGimcheckTask. getSubProjectCode ( ) ;
String designCode= evGimcheckTask. getDesignStageCode ( ) ;
String url = "C:\\Users\\admin\\Desktop\\test\\ceshi2222.shp" ;
String str = "LINESTRING (116.21278950384274 39.90557982319698, 116.21177234433465 39.90610963061354, 116.21106912279264 39.90264172209895, 116.21399502548638 39.902612822554126, 116.21629305278306 39.905011479365406, 116.21278950384274 39.90557982319698)" ;
org. locationtech. jts. geom. Geometry geom = WKTUtil . wktToGeom ( str) ;
Map < String , Object > m = new HashMap < > ( ) ;
m. put ( ShapeUtil . DEF_GEOM_KEY , geom) ;
m. put ( "name" , evGimcheckTask. getGimName ( ) ) ;
List < Map < String , ? > > data = new ArrayList < > ( ) ;
data. add ( m) ;
ShapeUtil . createShp ( url, "utf-8" , org. locationtech. jts. geom. LineString. class , data) ;
ShapeUtil . zipShapeFile ( url) ;
try {
String downFile = url. replace ( ".shp" , ".zip" ) ;
java. io. File file = new File ( downFile) ;
String filename = file. getName ( ) ;
InputStream fis = new BufferedInputStream ( new FileInputStream ( file) ) ;
byte [ ] buffer = new byte [ fis. available ( ) ] ;
fis. read ( buffer) ;
fis. close ( ) ;
httpServletResponse. reset ( ) ;
httpServletResponse. setContentType ( "application/x-msdownload" ) ;
httpServletResponse. setCharacterEncoding ( "utf-8" ) ;
httpServletResponse. setHeader ( "Content-Disposition" , "attachment;filename=" + java. net. URLEncoder. encode ( "ceshi111.zip" , "UTF-8" ) ) ;
OutputStream os = new BufferedOutputStream ( httpServletResponse. getOutputStream ( ) ) ;
os. write ( buffer) ;
os. flush ( ) ;
os. close ( ) ;
} catch ( Exception e) {
e. printStackTrace ( ) ;
}
}
生成文件