NND,openlayers跨域访问geoserver居然要用到代理,貌似Felx就不用,用C#编写代理网上普遍是这样的:
public class GeoServerProxy1 : IHttpHandler { public void ProcessRequest(HttpContext context) { if (context.Request.QueryString["URL"] != null) { string url = ""; url = context.Request.QueryString["URL"].ToString(); HttpWebRequest loHttp = (HttpWebRequest)WebRequest.Create(url); loHttp.Timeout = 10000; // 10 secs loHttp.UserAgent = "Web Client"; HttpWebResponse loWebResponse = (HttpWebResponse)loHttp.GetResponse(); Encoding enc = Encoding.GetEncoding(65001); StreamReader loResponseStream = new StreamReader(loWebResponse.GetResponseStream(), enc); string lcHtml = loResponseStream.ReadToEnd(); context.Response.Write(lcHtml); loWebResponse.Close(); loResponseStream.Close(); } } public bool IsReusable { get { return false; } } }
但是上面这种情况,没有考虑post,不适用于openlayers官方的wfs协议访问,但是可以用于http查询方式的访问,例如:
vectorLayer = new OpenLayers.Layer.Vector("覆冰点", { protocol: new OpenLayers.Protocol.HTTP({ //url: "http://10.180.80.206:9000/geoserver/sdgis/ows?service=WFS&version=1.0.0&request=GetFeature&typeName=sdgis:V_YL_24&maxFeatures=50", //url: "http://10.180.80.206:9000/geoserver/sdgis/ows?service=WFS&version=1.0.0&request=GetFeature&typeName=sdgis:GIS_WEATHER_FORECAST&maxFeatures=50", url: "http://10.180.80.206:9000/geoserver/sdgis/ows?service=WFS&version=1.0.0&request=GetFeature&typeName=sdgis:V_FBJC_PT&maxFeatures=50", format: new OpenLayers.Format.GML() }), styleMap: new OpenLayers.StyleMap({ 'default': { strokeColor: "#00FF00", strokeOpacity: 1, strokeWidth: 2, fillColor: "#FF0000", fillOpacity: 1, pointRadius: 6, strokeDashstyle: 'longdashdot', pointerEvents: "visiblePainted", externalGraphic: "snow.gif", graphicWidth: 12, graphicHeight: 12, //label: "name: ${OWNER}, age: ${FLAGS}", fontColor: "${favColor}", fontSize: "12px", fontFamily: "Courier New, monospace", fontWeight: "bold", labelAlign: "${align}", labelXOffset: "${xOffset}", labelYOffset: "${yOffset}" } }), renderers: renderer, strategies: [new OpenLayers.Strategy.Fixed()] });
我们,先来看看openlayers官方wfs协议是怎么访问的:
var fbjcLayer = new OpenLayers.Layer.Vector("FBJC_PT", { strategies: [new OpenLayers.Strategy.BBOX()], protocol: new OpenLayers.Protocol.WFS({ version: "1.1.0", url: "http://10.180.80.206:9000/geoserver/wfs", featureType: "sdgis:V_FBJC_PT", featureNS: "sdgid" }), renderers: OpenLayers.Layer.Vector.prototype.renderers });
这是一个post请求,我们修改代理程序来支持,如果用网上流传的代理程序会报parameter missing异常,下面是改进后的C#代理:
public class GeoServerProxy1 : IHttpHandler { public void ProcessRequest(HttpContext context) { if (string.IsNullOrEmpty(context.Request["URL"])) return; HttpWebRequest request = (HttpWebRequest) WebRequest.Create(context.Request["URL"]); request.UserAgent = context.Request.UserAgent; request.ContentType = context.Request.ContentType; request.Method = context.Request.HttpMethod; byte[] trans = new byte[1024]; int offset = 0; int offcnt = 0; if (request.Method.ToUpper() == "POST") { Stream nstream = request.GetRequestStream(); while (offset < context.Request.ContentLength) { offcnt = context.Request.InputStream.Read(trans, offset, 1024); if (offcnt > 0) { nstream.Write(trans, 0, offcnt); offset += offcnt; } } nstream.Close(); } HttpWebResponse response = (HttpWebResponse)request.GetResponse(); //Encoding enc = Encoding.GetEncoding(65001); context.Response.ContentType = response.ContentType; StreamReader loResponseStream = new StreamReader(response.GetResponseStream()); string lcHtml = loResponseStream.ReadToEnd(); context.Response.Write(lcHtml); response.Close(); loResponseStream.Close(); } public bool IsReusable { get { return false; } } }
相关推荐
利用openlayers加载geoserver wfs服务发布的矢量图层。
代理服务器是解决跨域问题的一种常见方法。它充当了客户端和目标服务器之间的中介,客户端向代理服务器发送请求,代理服务器再将请求转发到目标服务器,获取的数据再由代理服务器返回给客户端。这样,浏览器就只与...
openlayer3加载geoserver发布的WFS服务,并通过openlayers中的line string实现人/车辆移动的轨迹信息
### OpenLayer加载原理及其应用实例 #### 一、OpenLayer加载原理概述 OpenLayer是一种流行的JavaScript库,专门用于Web GIS应用程序的开发。该库能够帮助开发者轻松地在网页上加载和展示各种地理空间数据,包括但...
解决arcgis server跨域问题: 1、停掉ArcGIS Server的服务。 2、 打开<ArcGIS Server> \framework\runtime\tomcat\conf\web.xml,注册跨域bean 3、lib下拷贝 cors-filter-2.5.jar java-property-utils-1.9.1.jar包 4...
这个压缩包文件"cesium结合geoserver利用WFS服务实现图层编辑"应该包含了一个示例项目,可以帮助你更好地理解这些概念并进行实践。通过学习和实践,你可以掌握这一强大的技术组合,为你的GIS应用增添丰富的交互性和...
然而,当我们尝试从一个域访问WFS服务时,如果该服务位于另一个域,就会遇到跨域问题。为了解决这个问题,我们可以使用代理服务器。 代理服务器是一种在网络应用层或传输层上工作,作为客户端和服务器之间的中介。...
6. **添加WFS图层**:使用L.GeoJSON构造函数,将WFS服务返回的GeoJSON数据转换为可操作的图层,并添加到地图上。通过监听`click`事件,实现点击图层时获取特征信息。 7. **实现编辑功能**:Leaflet有多种方式实现...
在IT行业中,尤其是在地理信息系统(GIS)领域,Cesium和GeoServer是两个非常重要的工具。Cesium是一款基于WebGL的开源...在实际项目中,还需要考虑错误处理、用户界面设计、数据安全等问题,以提供更完善的解决方案。
这仅仅是OpenLayer 3功能的冰山一角,它还支持自定义图层、标记、图层叠加、WMS/WFS服务等,提供了丰富的API供开发者进行深入定制。希望这个教程能帮助你更好地理解和应用OpenLayer 3,打造属于你自己的WebGIS项目。
在这个“Openlayer简单实例10”中,我们着重关注如何将不同的图层,如WMS(Web Map Service)和WFS(Web Feature Service)图层叠加到Google Maps上,并理解相关的核心概念。 首先,`options`对象是用来初始化...
本文实例为大家分享了vue+openlayers加载geojson并实现点击弹窗教程,供大家参考,具体内容如下 第一步:安装vue-cli cnpm install -g @vue/cli 第二步:新建一个项目 1.新建项目 (vue-openlayers为项目名),并...
这里,`your_arcgis_server/wms`是ArcGIS Server提供的WMS服务URL,`your_layer_name`是你想加载的具体图层名。 3. **添加图层到地图**:最后,将WMS图层添加到地图中。 ```javascript map.addLayer(wmsLayer); ``...
《SuperMap Objects入门指南——基于C#.Net的源码解析》 SuperMap Objects是一款强大的地理信息系统(GIS)开发组件,广泛应用于地图数据处理、空间分析和应用系统开发中。本教程将带你逐步入门SuperMap Objects,...
本教程将详细介绍如何将Cesium与GeoServer集成,通过WFS(Web Feature Service)服务来实现图层的删除操作。以下是详细的知识点讲解: 1. **Cesium**:Cesium是一个基于 WebGL 的JavaScript库,它允许开发者在...
为了解决这个问题,我们需要对GeoServer进行一些配置,以启用跨域资源共享(CORS,Cross-Origin Resource Sharing)。 首先,我们来看一下`cors-filter-2.6.jar`这个文件。这是一个用于处理HTTP请求的过滤器,可以...
TMS(Tile Map Service)是一种分块加载地图图像的服务,OpenLayers支持TMS图层,通过`OpenLayers.Layer.TMS`创建。 设置瓦片大小主要在TileCache或WMS服务配置中完成。 大数据量线绘制可以考虑分段加载、动态加载...
3. **集成SharpMap和WFS**: 在SharpMap中,开发者需要创建一个WFS图层,设置WFS服务的URL、请求的图层名以及可能的过滤条件。SharpMap会处理与WFS服务器的通信,获取数据并将其渲染在地图上。 4. **地图投影**: ...
3. **图层管理**:图层是地图的基本组成单元,可以是矢量图层(ol.layer.Vector)展示地理数据,也可以是瓦片图层(ol.layer.Tile)加载网络上的地图切片。例如,可以使用`new ol.layer.Tile({source: new ol.source...
6. **地理数据的加载与展示**:了解如何加载和显示GeoJSON、KML、GML等格式的地理数据,以及如何利用WFS服务进行动态数据交互。 7. **样式与符号化**:深入理解如何定制地图要素的外观,包括颜色、大小、填充、描边...