Top Banner
GIS 介介 Geoserver Openlayers Geotools
23

Geoserver Openlayers Geotools. Geoserver 地图服务器,方便的发布地图数据,允许用户 对特征数据进行更新、删除、插入操作,通过 GeoServer...

Jan 12, 2016

Download

Documents

Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Geoserver Openlayers Geotools. Geoserver 地图服务器,方便的发布地图数据,允许用户 对特征数据进行更新、删除、插入操作,通过 GeoServer 可以比较容易的在用户之间迅速共享空间

GIS 介绍

• Geoserver

• Openlayers

• Geotools

Page 2: Geoserver Openlayers Geotools. Geoserver 地图服务器,方便的发布地图数据,允许用户 对特征数据进行更新、删除、插入操作,通过 GeoServer 可以比较容易的在用户之间迅速共享空间

GIS 介绍• Geoserver

地图服务器,方便的发布地图数据,允许用户对特征数据进行更新、删除、插入操作,通过 GeoServer 可以比较容易的在用户之间迅速共享空间地理信息。

1. 地图发布

2. 数据库连接

3. 缓存设置

Page 3: Geoserver Openlayers Geotools. Geoserver 地图服务器,方便的发布地图数据,允许用户 对特征数据进行更新、删除、插入操作,通过 GeoServer 可以比较容易的在用户之间迅速共享空间

GIS 介绍• Openlayers

用于 WebGIS 客户端的 JavaScript 包,解析地图操作数据,进行地图渲染等 能够利用的地图数据资源:WMS , WFS , GoogleMap 等

Page 4: Geoserver Openlayers Geotools. Geoserver 地图服务器,方便的发布地图数据,允许用户 对特征数据进行更新、删除、插入操作,通过 GeoServer 可以比较容易的在用户之间迅速共享空间

GIS 介绍WMS:

Web 地图服务( Web map service), 利用具有地理空间位置信息的 数据制作地图。其中将地图定义为地理数据可视的表现。三个规范定义操作:GetCapabitities 返回服务级元数据,它是对服务信息内容和要 求参数的一种描述; GetMap 返回一个地图影像,其地理空间参考和大小参数是明确定义了的;GetFeatureInfo (可选)返回显示在地图上的某些特殊要素的信息。

WFS支持对地理要素的插入,更新,删除,检索和发现服务。该服务根据 HTTP 客

户请求返回 GML 数据。 WFS 对应于常见桌面程序中的条件查询功能基础接口是:

GetCapabilities 返回服务级元数据。 DescribeFeatureType 返回要素结构,以便客户端进行查询和其他操作。

GetFeature 可根据查询要求返回一个符合 GML 规范的数据文档。WFS 的请求是通过 Filter XML 来实现, WFS 所返回的是查询的结果集

GML 即地理标识语言, GML 能够表示地理空间对象的空间数据和非空间属性数据。

Page 5: Geoserver Openlayers Geotools. Geoserver 地图服务器,方便的发布地图数据,允许用户 对特征数据进行更新、删除、插入操作,通过 GeoServer 可以比较容易的在用户之间迅速共享空间

GIS 介绍• Openlayers API

• Openlayers 地图渲染1 、实例化 map 对象2 、图层添加3 、控件使用

• Openlayers 事件机制

Page 6: Geoserver Openlayers Geotools. Geoserver 地图服务器,方便的发布地图数据,允许用户 对特征数据进行更新、删除、插入操作,通过 GeoServer 可以比较容易的在用户之间迅速共享空间

GIS 介绍实例化 map 对象var options = {

maxExtent : new OpenLayers.Bounds(11569508.601, 3576641.428, 11600618.472, 3604999.565),

maxResolution : "auto",projection : "EPSG:3785",scales : [108000,54000,27000,14000,6771],units : 'm',//maxScale: 500, minScale: 500000,//numZoomLevels: 5,tileSize : new OpenLayers.Size(256, 256)

};map = new OpenLayers.Map('map', options);

Page 7: Geoserver Openlayers Geotools. Geoserver 地图服务器,方便的发布地图数据,允许用户 对特征数据进行更新、删除、插入操作,通过 GeoServer 可以比较容易的在用户之间迅速共享空间

GIS 介绍• 基础图层 layer = new OpenLayers.Layer.WMS( 'hctelecom:sichuan16', "http://localhost:8089/geoserver/hctelecom/wms",

{ alwaysInRange:true,LAYERS: 'hctelecom:sichuan16',STYLES: '',format: 'image/jpeg', tiled: !true

}, { isBaseLayer : false,opacity : "0.6",

'buffer':0, singleTile: true, alwaysInRange:true ,

eventListeners:{// 'loadstart':baseLayersStart//'loadend': layerAction.baseLayerLoadEnd

} }) map.addLayer(layer);

Page 8: Geoserver Openlayers Geotools. Geoserver 地图服务器,方便的发布地图数据,允许用户 对特征数据进行更新、删除、插入操作,通过 GeoServer 可以比较容易的在用户之间迅速共享空间

GIS 介绍• WFS 矢量数据

layer = new OpenLayers.Layer.WFS( "Unit", "http://192.98.151.17:8081/geoserver/wfs", {typename: 'cq:GPOI_GOV'}, { typename: 'unit', featureNS: 'http://www.openplans.org/cq', extractAttributes: true, maxfeatures: 10, textAttrToDisplay: 'lname' } ); map.addLayer(layer);WFS 矢量数据,由 openlayers 在客户端绘制,数量太多会导致速度缓慢

Page 9: Geoserver Openlayers Geotools. Geoserver 地图服务器,方便的发布地图数据,允许用户 对特征数据进行更新、删除、插入操作,通过 GeoServer 可以比较容易的在用户之间迅速共享空间

GIS 介绍• 添加 feature

1 、 var vector=new OpenLayers.Layer.Vector("feature",{eventListeners:{'featureselected':onFeatureSelectedAction, "beforefeatureadded":onBeforefeatureaddedAction,

"featuresadded"onFeaturesaddedAction},styleMap:new OpenLayers.StyleMap({

fillColor:deftColor,strokeColor:deftColor,strokeWidth:featureLineWidth,pointRadius:10,label:"Drag me ...",fontColor: deftColor,fontSize:"10px",

})});map.addLayer(vector);

Page 10: Geoserver Openlayers Geotools. Geoserver 地图服务器,方便的发布地图数据,允许用户 对特征数据进行更新、删除、插入操作,通过 GeoServer 可以比较容易的在用户之间迅速共享空间

GIS 介绍• 添加 feature

2 、 var point = new OpenLayers.Geometry.Point(104.134, 30.701);

var point1 = new OpenLayers.Geometry.Point(104.056, 30.613);var point2 = new OpenLayers.Geometry.Point(104.059, 30.677);var pointList = [];pointList.push(point);pointList.push(point1);pointList.push(point2);var linearRing = new OpenLayers.Geometry.LinearRing(pointList);var geometryCollection=new OpenLayers.Geometry.Collection(

[new OpenLayers.Geometry.Polygon([linearRing])]);var polygonFeature = new

OpenLayers.Feature.Vector(geometryCollection,{},baseStyle);vector.addFeatures([polygonFeature]);

Page 11: Geoserver Openlayers Geotools. Geoserver 地图服务器,方便的发布地图数据,允许用户 对特征数据进行更新、删除、插入操作,通过 GeoServer 可以比较容易的在用户之间迅速共享空间

GIS 介绍• 添加 feature 控制

var sf = new OpenLayers.Control.SelectFeature(vector); map.addControl(sf); sf.activate();

Page 12: Geoserver Openlayers Geotools. Geoserver 地图服务器,方便的发布地图数据,允许用户 对特征数据进行更新、删除、插入操作,通过 GeoServer 可以比较容易的在用户之间迅速共享空间

GIS 介绍• 添加 Marker

var markLayer = new OpenLayers.Layer.Markers (" 标记 ");map.addLayer(markLayer);var lonlat = new OpenLayers.LonLat(lon,lat);var icon = new OpenLayers.Icon(url, sz, offset, null);var marker = new OpenLayers.Marker(lonlat,icon);markLayer.addMarker(marker);marker.events.register('mousedown', marker,

function(evt) {});

Page 13: Geoserver Openlayers Geotools. Geoserver 地图服务器,方便的发布地图数据,允许用户 对特征数据进行更新、删除、插入操作,通过 GeoServer 可以比较容易的在用户之间迅速共享空间

GIS 介绍• 控件添加

map.addControl(new OpenLayers.Control.PanZoomBar({ position: new OpenLayers.Pixel(2, 15)}));// 缩放

map.addControl(new OpenLayers.Control.OverviewMap({ maximized: true})); // 微缩图map.addControl(new OpenLayers.Control.LayerSwitcher());map.addControl(new OpenLayers.Control.Navigation());map.addControl(new OpenLayers.Control.Scale($('scale')));

map.addControl(new OpenLayers.Control.MousePosition());Var draw=new OpenLayers.Control.DrawFeature(

vector, OpenLayers.Handler.RegularPolygon)控件实现的核心是 handler 类,每个控件中都包含对 handler 的引用,通过 active 和 deactive 两个方法,实现动态的激 活和注销。

Page 14: Geoserver Openlayers Geotools. Geoserver 地图服务器,方便的发布地图数据,允许用户 对特征数据进行更新、删除、插入操作,通过 GeoServer 可以比较容易的在用户之间迅速共享空间

GIS 介绍• 事件机制 - 注册和处理事件

1 、 registercontrol.event.register(“eventType”, this, Handler);

2 、 oncontrol.events.on({

eventTYpe: Handler, scope: this

});

Page 15: Geoserver Openlayers Geotools. Geoserver 地图服务器,方便的发布地图数据,允许用户 对特征数据进行更新、删除、插入操作,通过 GeoServer 可以比较容易的在用户之间迅速共享空间

GIS 介绍• Geotools

Geotools 是 Java 语言编写的开源 GIS 工具包。基于标准的 GIS 接口。 Geotools 主要提供各种 GIS 算法,各种数据格式的读写和显示。在显示方面要差一些,只是用Swing 实现了地图的简单查看和操作

Page 16: Geoserver Openlayers Geotools. Geoserver 地图服务器,方便的发布地图数据,允许用户 对特征数据进行更新、删除、插入操作,通过 GeoServer 可以比较容易的在用户之间迅速共享空间

GIS 介绍• 读取 shp 文件

File file = new File("C:\\BOUNT_line.shp");FileDataStore store =

FileDataStoreFinder.getDataStore(file);FeatureSource featureSource = store.getFeatureSource();MapContext map = new DefaultMapContext();map.setTitle("Quickstart");map.addLayer(featureSource, null);

Page 17: Geoserver Openlayers Geotools. Geoserver 地图服务器,方便的发布地图数据,允许用户 对特征数据进行更新、删除、插入操作,通过 GeoServer 可以比较容易的在用户之间迅速共享空间

GIS 介绍• WMS 数据请求解析

URL url = new URL("http://localhost:8089/geoserver/nurc/wms?service=WMS&version=1.1.0&request=GetMap&layers=nurc:Arc_Sample&styles=&bbox=-180.0,-90.0,180.0,90.0&width=660&height=330&srs=EPSG:4326&format=application/openlayers");

WebMapServer wms = new WebMapServer(url);WMSCapabilities caps = wms.getCapabilities();Layer layer = null;for( Iterator i = caps.getLayerList().iterator(); i.hasNext();){

Layer test = (Layer) i.next();if( test.getName() != null && test.getName().length() != 0 ){

layer = test;break;

}}

Page 18: Geoserver Openlayers Geotools. Geoserver 地图服务器,方便的发布地图数据,允许用户 对特征数据进行更新、删除、插入操作,通过 GeoServer 可以比较容易的在用户之间迅速共享空间

GIS 介绍• WFS// Step 1 - connection parametersMap connectionParameters = new HashMap();connectionParameters.put("WFSDataStoreFactory:GET_CAPABILITIES_URL", "http://localhost:8080/geoserver/wfs?service=WFS&request=GetCapabilities");// Step 2 - connectionDataStore data = DataStoreFinder.getDataStore( connectionParameters );// Step 3 - discouveryString typeNames[] = data.getTypeNames();String typeName = typeNames[0];SimpleFeatureType schema = data.getSchema( typeName );// Step 4 - targetSimpleFeatureSource source = data.getFeatureSource( typeName );// Step 5 - queryString geomName = schema.getGeometryDescriptor().getLocalName();Envelope bbox = new Envelope( -100.0, -70, 25, 40 );FilterFactory2 ff = CommonFactoryFinder.getFilterFactory2( GeoTools.getDefaultHints() );Object polygon = JTS.toGeometry( bbox );Intersects filter = ff.intersects( ff.property( geomName ), ff.literal( polygon ) );Query query = new DefaultQuery( typeName, filter, new String[]{ geomName } );SimpleFeatureCollection features = source.getFeatures( query );

Page 19: Geoserver Openlayers Geotools. Geoserver 地图服务器,方便的发布地图数据,允许用户 对特征数据进行更新、删除、插入操作,通过 GeoServer 可以比较容易的在用户之间迅速共享空间

GIS 介绍• 生成 map 对象生成坐标系CoordinateReferenceSystem crs=CRS.decode("EPSG:900913", false);

实例 map 对象MapContext map = new DefaultMapContext();

添加图层Style stylePL =SLD.createPolygonStyle(Color.decode(borderColor), Color.decode(fillColor), 1.0f);SimpleFeatureCollection fc = FeatureCollections.newCollection();1)map.addLayer(fc , stylePL );MapLayer layer = new DefaultMapLayer(dstore.getFeatureSource(typeName), style);2)map.addLayer(layer );

Page 20: Geoserver Openlayers Geotools. Geoserver 地图服务器,方便的发布地图数据,允许用户 对特征数据进行更新、删除、插入操作,通过 GeoServer 可以比较容易的在用户之间迅速共享空间

GIS 介绍• 生成 GeometryCoordinate[] array = new Coordinate[] {

New Coordinate(lon1,lat1), new Coordinate(lon2,lat2), new Coordinate(lon3,lat3), new Coordinate(lon1,lat1)};

CoordinateSequenceFactory csFactory=CoordinateArraySequenceFactory.instance();

GeometryFactory geomFactory = new GeometryFactory();LinearRing lr=

new LinearRing(csFactory.create(array),geomFactory);Polygon polygon = geomFactory.createPolygon(lr, null);Geometry geometry=polygon;

Page 21: Geoserver Openlayers Geotools. Geoserver 地图服务器,方便的发布地图数据,允许用户 对特征数据进行更新、删除、插入操作,通过 GeoServer 可以比较容易的在用户之间迅速共享空间

GIS 介绍• 生成 Vector gridFile file = new File("E:\\map\\bou1_4p.shp");FileDataStore store = FileDataStoreFinder.getDataStore(file);SimpleFeatureSource ozMapSource = store.getFeatureSource();double gridSize = 10.0;double vertexSpacing = gridSize / 20;MapContext map = new DefaultMapContext();ReferencedEnvelope gridBounds = Envelopes.expandToInclude(ozMapSource.getBounds(), gridSize);SimpleFeatureSource grid = Grids.createSquareGrid(gridBounds, gridSize, vertexSpacing);map.setTitle("Vector grid");map.setCoordinateReferenceSystem(CRS.decode("EPSG:4326", true));map.addLayer(ozMapSource, SLD.createPolygonStyle(Color.BLUE, Color.CYAN, 1.0f));map.addLayer(grid, SLD.createPolygonStyle(Color.LIGHT_GRAY, null, 1.0f));JMapFrame.showMap(map);

Page 22: Geoserver Openlayers Geotools. Geoserver 地图服务器,方便的发布地图数据,允许用户 对特征数据进行更新、删除、插入操作,通过 GeoServer 可以比较容易的在用户之间迅速共享空间

GIS 介绍• 显示

1 、 swingJMapFrame.showMap(map);

Page 23: Geoserver Openlayers Geotools. Geoserver 地图服务器,方便的发布地图数据,允许用户 对特征数据进行更新、删除、插入操作,通过 GeoServer 可以比较容易的在用户之间迅速共享空间

GIS 介绍• 显示

2 、输出 image 数据StreamingRenderer sr=new StreamingRenderer();sr.setContext(map);int width=Integer.parseInt(request.getParameter("WIDTH"));int height=Integer.parseInt(request.getParameter("HEIGHT"));BufferedImage bi = new BufferedImage(width, height,

BufferedImage.TYPE_INT_ARGB);Graphics g = bi.getGraphics();Rectangle rect = new Rectangle(0, 0, width, height);sr.paint((Graphics2D) g, rect, mapArea); // 绘制地图PNGEncodeParam encodeParam =

PNGEncodeParam.getDefaultEncodeParam(bi); response.setContentType("image/png"); // 将图像数据输出到 Servlet

ServletOutputStream out=response.getOutputStream();encoder = ImageCodec.createImageEncoder("PNG", out, encodeParam);encoder.encode(bi.getData(), bi.getColorModel());bi.flush();