用OpenLayers解析GML文件

本文探讨了OpenLayers解析GML文件时效率低下的问题,特别是对于大型GML文件,解析耗时过长。作者指出OpenLayers在解析过程中将所有几何对象转化为Point,导致内存占用过大。为解决这一问题,作者建议在解析时直接用VML或SVG进行绘制,以提高性能。文中提供了一个简单的测试脚本,展示了如何通过自定义解析和绘制方法来加速GML数据的加载和显示。
摘要由CSDN通过智能技术生成

不可否认openlayers的确是个好东西,尤其是他的事件封装机制更是让人爱不释手,感谢致力于openlayers开发的脚本爱好者们。但是作为一个开源的脚本框架,它也存在不少缺陷,GML解析的低效率就是一个严重的问题。

对于一个像美国states的gml文件,大小约为300K左右,有95个面对象,所有面对象一共包含11000个左右的点,这么一个gml文件,不算从WFS请求过来的时间,就是放在本地就用openlayers脚本解析,耗时也在10s以上,虽然这里机器不太好,属于上个世纪的戴尔机器,内存256,CPU2.8G,但是这么长的耗时实在是说不过去。 

后来试用精简了的武汉数据,大小大概400K,只有一个面对象,不过这个面包含很多个点,16145左右,从WFS请求,结果在客户端根本就画不出来,IE死掉了。
后来查看openlayers解析gml数据的代码,很容易就可以发现问题。openlayers对于Geometry对象的组织是这样的,其实最基本的就是点,然后MultiPoint由点构成,继承自Openlayers.Geometry.Collection,而LinearRing,LineString均由Point构成,Polygon由OpenLayers.Geometry.LinearRing构成。
openlayers在解析数据时候,将所有的面、线包含的点全部都对象化为Openlayers.Geometry.Point,并首先将所有的对象读取到内存,得到一个Feature的集合,然后将这个集合提交给渲染器进行渲染。本来这个思想就行不通,加入我们通过WFS收到的文件有10M或者更大,要是把这些全部解析出来然后放到内存,那还不跑死啊,这个就像一个100M的文本文件要解析出来一样,要是等全部解析完了再处理数据那是不行的,万一数据再大呢,比如2G的数据,你还能这样全部读到内存么??
而其实将所有的点都对象化才是它效率低下的根本原因,本人做过测试,将16145个Openlayers.Geometry.Point在现有机器配置下实例化耗时6S(除了一个QQ外,机器不运行任何其他程

对于Vue 3使用OpenLayers打开DWG文件,可以参考以下步骤: 1. 首先,确保你已经安装了Vue 3和OpenLayers的依赖包。你可以使用npm或yarn来安装它们。 2. 在Vue项目的入口文件(通常是main.js)中,引入OpenLayers的相关模块。 ```javascript import 'ol/ol.css'; import { Map, View } from 'ol'; import TileLayer from 'ol/layer/Tile'; import XYZ from 'ol/source/XYZ'; import DWG from 'ol/format/DWG'; ``` 3. 在Vue组件中,创建一个地图容器,并在mounted钩子函数中初始化地图。 ```javascript <template> <div id="map"></div> </template> <script> export default { mounted() { const map = new Map({ target: 'map', layers: [ new TileLayer({ source: new XYZ({ url: 'https://{a-c}.tile.openstreetmap.org/{z}/{x}/{y}.png', }), }), ], view: new View({ center: [0, 0], zoom: 2, }), }); // 加载DWG文件 const dwgUrl = 'path/to/your/dwg/file.dwg'; const dwgFormat = new DWG(); fetch(dwgUrl) .then((response) => response.arrayBuffer()) .then((data) => { const features = dwgFormat.readFeatures(data); // 在地图上添加DWG图层 const dwgLayer = new VectorLayer({ source: new VectorSource({ features: features, }), }); map.addLayer(dwgLayer); }); }, }; </script> <style> #map { width: 100%; height: 400px; } </style> ``` 在上述代码中,我们首先创建了一个地图容器,然后在mounted钩子函数中初始化了地图。在初始化地图时,我们添加了一个OpenStreetMap的瓦片图层作为底图,并设置了初始的中心点和缩放级别。 接下来,我们使用fetch函数加载DWG文件,并使用DWG格式解析器将DWG数据转换为OpenLayers的要素(features)。最后,我们创建一个矢量图层,并将DWG要素添加到该图层中,然后将该图层添加到地图中。 请注意,上述代码中的`dwgUrl`需要替换为你实际的DWG文件路径。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值