Geotools读取shp文件并在Ol2中展示
2016-06-28
概述:
在前面有一篇文章中讲到了GDAL将shp转换为GeoJson的实现,以及ol2、3以及Arcgis for js中GeoJson的加载,今天呢,书接上文,介绍Geotools如何读取shp文件并在ol2中展示。
读取shp
package com.lzugis.web;
import org.geotools.data.shapefile.ShapefileDataStore;
import org.geotools.data.simple.SimpleFeatureCollection;
import org.geotools.data.simple.SimpleFeatureIterator;
import org.geotools.data.simple.SimpleFeatureSource;
import org.opengis.feature.Property;
import org.opengis.feature.simple.SimpleFeature;
import org.opengis.feature.type.PropertyType;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.nio.charset.Charset;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;
@WebServlet(description = "read shape", urlPatterns = {"/shp"})
public class ReadShape extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String layer = request.getParameter("layer");
String shpPath = "D:\\data\\china\\"+layer+".shp";
System.out.println(shpPath);
ShapefileDataStore shpDataStore = null;
Calendar startTime = Calendar.getInstance();
List<Map<String,Object>> list = new ArrayList<Map<String, Object>>();
try{
File file = new File (shpPath);
shpDataStore = new ShapefileDataStore(file.toURL());
//设置字符编码
Charset charset = Charset.forName("GBK");
shpDataStore.setCharset(charset);
String typeName = shpDataStore.getTypeNames()[0];
SimpleFeatureSource featureSource = null;
featureSource = shpDataStore.getFeatureSource (typeName);
SimpleFeatureCollection result = featureSource.getFeatures();
SimpleFeatureIterator itertor = result.features();
while (itertor.hasNext())
{
Map<String,Object> data = new HashMap<String, Object>();
SimpleFeature feature = itertor.next();
Collection<Property> p = feature.getProperties();
Iterator<Property> it = p.iterator();
while(it.hasNext()) {
Property pro = it.next();
PropertyType proType = pro.getType();
String dataType = proType.getBinding().getSimpleName();
String field = pro.getName().toString();
String value = pro.getValue().toString();
field = field.equals("the_geom")?"geom":field;
value = getValue(field,value,dataType);
data.put(field, value);
}
list.add(data);
}
Calendar endTime = Calendar.getInstance();
int day = endTime.get(Calendar.DAY_OF_MONTH) - startTime.get(Calendar.DAY_OF_MONTH);
int hour = endTime.get(Calendar.HOUR_OF_DAY) - startTime.get(Calendar.HOUR_OF_DAY);
int minute = endTime.get(Calendar.MINUTE) - startTime.get(Calendar.MINUTE);
int second = endTime.get(Calendar.SECOND) - startTime.get(Calendar.SECOND);
itertor.close();
System.out.println("共写入" + list.size() + "条数据,耗时" + day + "天" + hour + "时" + minute + "分" + second + "秒");
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
out.println(list.toString());
out.flush();
out.close();
}
catch(Exception e){
System.out.println(e.getMessage());
}
}
/**
* 获取值,是字符串型的加''
* @param value
* @param type
* @return
*/
private static String getValue(String field, String value,String type){
String newValue = value;
if(type.equals("String")){
newValue = "'"+value+"'";
}
if(field.equals("geom")){
newValue = "st_geomfromtext('"+value+"')";
}
if(type.equals("Date")){
SimpleDateFormat sdf = new SimpleDateFormat("EEE MMM dd HH:mm:ss z yyyy",java.util.Locale.US);
try {
Date date = sdf.parse(value);
SimpleDateFormat sdfL = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
newValue = "'"+sdfL.format(date)+"'";
} catch (ParseException e) {
e.printStackTrace();
}
System.out.println(newValue);
}
return newValue;
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request,response);
}
}返回的数据如下:
展示数据
<!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8">
<title>openlayers map</title>
<link rel="stylesheet" href="http://localhost/olapi/theme/default/style.css" type="text/css">
<style>
html, body{
padding:0;
margin:0;
height:100%;
width:100%;
overflow: hidden;
font-size: 12px;
}
#map1{
width: 100%;
height: 100%;
float: left;
border-right: 1px solid #000000;
}
</style>
<script src="../../../plugin/OpenLayers-2.13.1/OpenLayers.js"></script>
<script src="../../../plugin/jquery/jquery-1.8.3.js"></script>
<script>
var map1, vectors;
OpenLayers.Feature.Vector.style['default']['strokeWidth'] = '2';
$(function(){
var bounds = new OpenLayers.Bounds(
73.45100463562233, 18.16324718764174,
134.97679764650596, 53.531943152223576
);
var options = {
controls: [],
maxExtent: bounds,
maxResolution: 0.2403351289487642,
projection: "EPSG:4326",
units: 'degrees'
};
map1 = new OpenLayers.Map('map1', options);
map1.addLayer(getWms("province"));
map1.addControl(new OpenLayers.Control.Zoom());
map1.addControl(new OpenLayers.Control.Navigation());
map1.zoomToExtent(bounds);
addShpData();
});
function getWms(layer){
return new OpenLayers.Layer.WMS(
"Geoserver layers - Tiled",
"http://localhost:8088/geoserver/lzugis/wms",
{
"LAYERS": layer,
"STYLES": '',
format: 'image/png'
},
{
buffer: 0,
displayOutsideMaxExtent: true,
isBaseLayer: true,
yx : {'EPSG:4326' : true}
}
);
}
function addShpData(){
var renderer = OpenLayers.Util.getParameters(window.location.href).renderer;
renderer = (renderer) ? [renderer] : OpenLayers.Layer.Vector.prototype.renderers;
vectors = new OpenLayers.Layer.Vector("Vector Layer", {
renderers: renderer
});
map1.addLayer(vectors);
var wktFormat = new OpenLayers.Format.WKT();
$.ajax({
type: 'POST',
url: "http://localhost:8081/lzugis/shp" ,
data: {
layer:"capital"
} ,
success: function(data){
console.log(data);
for(var i= 0,dl=data.length;i<dl;i++){
var d = data[i];
var geometry = wktFormat.read(d.geom);
vectors.addFeatures(geometry);
}
}
});
}
</script>
</head>
<body>
<div id="map1"></div>
</body>
</html>附录
本实例相关Geotools jar下载地址:链接:http://pan.baidu.com/s/1o8xTUXW 密码:u601
Geotools12.2 jar下载地址:链接:http://pan.baidu.com/s/1pKDkI19 密码:687y
传播GIS知识 | 交流GIS经验 | 分享GIS价值 | 专注GIS发展
技术博客
http://blog.csdn.net/gisshixisheng
在线教程
http://edu.csdn.net/course/detail/799
Github
https://github.com/lzugis/
联系方式
q q:1004740957
e-mail:niujp08@qq.com
公众号:lzugis15
Q Q 群:452117357(webgis)
337469080(Android)