OpenLayers - 创建多边形Polygon

OpenLayers版本:4.6.4

叨叨:

本来这不应该成为一个问题,也不值得专门写一篇文章,尤其是对一个已经用过各种MapAPI(Google、百度、高德、SmartEarth...)的人来说,但就是这个本来以为3分钟解决的问题我却用了至少30分钟才把坑填完,最后发现OpenLayers的好多设计理念、思路都和之前用过的API大不相同。

需求:

需求很简单,其实就是用代码把一串经纬度坐标表示的Polygon添加在Map上,注意这里不是创建地图交互工具来用鼠标画Polygon,也不是用GeoJSON或WKT作为数据源,而是用代码手动实现,因为后者OL官网都有示例,前者我并没有找到(可能是因为我英文太烂,如果哪位发现有这样的示例请告诉我)

正题:

我先把最后的代码贴出来,再来分析我踩的那些坑

<script>
    var map = OLU.createBaseMap('mapDiv');
    var polygon = new ol.geom.Polygon([[[110, 39], [116, 39], [116, 33], [110, 33], [110, 39]]]);
    polygon.applyTransform(ol.proj.getTransform('EPSG:4326', 'EPSG:3857'));
    var feature = new ol.Feature(polygon);

    var vectorSource = new ol.source.Vector();
    vectorSource.addFeature(feature);

    var vectorLayer = new ol.layer.Vector({
        source: vectorSource
    });
    map.addLayer(vectorLayer);
</script>

创建Map的过程我封装了一下,基本是最简化的配置,没什么特殊的
坑1:Polygon的构造函数,按照过往经验给一个Point的数组就好了,但是在OL中是一个Point的数组的数组,这还好,最起码在API中能看到,最坑的就是下面的坑;
坑2:一定要做坐标转换,其实折腾了半天我就是缺这一句代码,至于投影坐标系这些东西我还晕着呢,大家自己悟吧。

polygon.applyTransform(ol.proj.getTransform('EPSG:4326', 'EPSG:3857'));

最后要把polygon显示出来需要这样一个流程:
polygon封装到Feature --> feature添加到source --> 通过source创建vector layer --> 把layer添加到map上。
这就是为什么我开始说OL在设计理念上和之前接触的大不相同,之前的大部分API直接通过map.addxxx 函数就可以添加覆盖物,也许要用OL就得把之前自己想当然的那些经验都扔掉。
OpenLayers - 创建多边形Polygon

转载于:https://blog.51cto.com/13802307/2295958

  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我可以回答这个问题。以下是代码示例: <template> <div> <button @click="createPolygonLayer">创建多边形图层</button> <div id="map"></div> </div> </template> <script> import 'ol/ol.css'; import Map from 'ol/Map'; import View from 'ol/View'; import TileLayer from 'ol/layer/Tile'; import OSM from 'ol/source/OSM'; import VectorLayer from 'ol/layer/Vector'; import VectorSource from 'ol/source/Vector'; import {Fill, Stroke, Style} from 'ol/style'; import {Polygon} from 'ol/geom'; export default { name: 'MapComponent', data() { return { map: null, polygonLayer: null, temperatureData: [ {coords: [[-11000000, 4600000], [-10000000, 4600000], [-10000000, 5600000], [-11000000, 5600000]], temperature: 10}, {coords: [[-9000000, 4600000], [-8000000, 4600000], [-8000000, 5600000], [-9000000, 5600000]], temperature: 20}, {coords: [[-7000000, 4600000], [-6000000, 4600000], [-6000000, 5600000], [-7000000, 5600000]], temperature: 30}, {coords: [[-5000000, 4600000], [-4000000, 4600000], [-4000000, 5600000], [-5000000, 5600000]], temperature: 40}, ], }; }, mounted() { this.initMap(); }, methods: { initMap() { this.map = new Map({ target: 'map', layers: [ new TileLayer({ source: new OSM(), }), ], view: new View({ center: [0, 0], zoom: 2, }), }); }, createPolygonLayer() { const polygons = this.temperatureData.map(data => { const polygon = new Polygon([data.coords]); polygon.transform('EPSG:4326', 'EPSG:3857'); polygon.set('temperature', data.temperature); return polygon; }); const vectorSource = new VectorSource({ features: polygons.map(polygon => new ol.Feature({ geometry: polygon, })), }); const vectorLayer = new VectorLayer({ source: vectorSource, style: feature => { const temperature = feature.get('temperature'); return new Style({ fill: new Fill({ color: `rgba(255, 0, 0, ${temperature / 50})`, }), stroke: new Stroke({ color: 'red', width: 1, }), }); }, }); this.map.addLayer(vectorLayer); this.polygonLayer = vectorLayer; }, }, }; </script> 在这个示例中,我们使用Vue和OpenLayers创建了一个地图组件。当用户点击“创建多边形图层”按钮时,我们会根据预先定义的温度数据创建多边形图层,并将其添加到地图上。每个多边形都代表一个区域,并使用不同的颜色来表示该区域的温度。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值