vue+openLayers入门教程

介绍:

OpenLayers官网
OpenLayers插件类型

可以理解为专门处理地图的一个库

其中有两大类 map和view,map是ol中的核心组件,初始化一副地图(map),时,至少需要一个可视化区域(view),一个或多个图层(layer)和一个地图加载的挂载点(target)

1.vue中使用Openlayers

注意:地图容器需要设置宽高,否则看不到初始化的地图效果

地图介绍

一.关于投影

​ 1.投影,地球不是正圆的球体,是一个不规则的椭圆体,所以我们要是想让它展开在桌面上,就会发现地图都会和实际有出入,所以人们发明了各种各样的方式来缩小失真的程度.这种方式就是投用,投影目前常用的是2种,分别是:
​ “EPSG:4326”,在地图上将经纬度直接当做X/Y对待(最常用)
​ "EPSG:3785"又称为球面墨卡托投影。将地图投影到一个地图平面上。为了正确的在商业地图API上叠加地图数据,就必须使用该投影。最基本的是在商业地图API上显示栅格瓦片地图——例如TMS,WMS以及其他类似的瓦片。
​ 2.如果我们不指定特别的投影,OpenLayers的默认投影为EPSG:3857
​ 3.source: 数据源
​ 4.Tile: 瓦片图层类,主要用来加载瓦片图。通过实例化瓦片图层对象,绑定其数据源(source) 加载对应的瓦片地图
​ 5.TileArcGISRest: 使用ArcGis为地底图
​ 6.View: 地图视图类

安装方式:

yarn install ol

2.openlayers简单使用说明

一.初始化地图

import {
    Map, View } from "ol";//地图,视图
import OSM from "ol/source/OSM"; //可以理解为数据源,就是一张图片
import TileLayer from "ol/layer/Tile"; //可以理解为图层
import {
    fromLonLat } from "ol/proj";//将坐标从经度/纬度转换为不同的投影。
export default {
   
  data() {
   
    return {
   
      map: null,
    };
  },
  methods: {
   
    createMap() {
   
      this.map = new Map({
   
        target: "map",
        layers: [
          new TileLayer({
   
            source: new OSM({
   }),
          }),
        ],
        view: new View({
   
          center: [116.394926, 39.9125],
          projection: "EPSG:3857",
          zoom: 8,
          maxZoom: 20,
        }),
      });
    },
  },
  mounted() {
   
    this.createMap();
  },
};
openlayersAPI
ol/proj
import {
   fromLonLat} from 'ol/proj'; 将坐标从经度/纬度转换为不同的投影。
fromLonLat(coordinat,projection)
coordinat:坐标为经度和纬度,即以经度为第一个元素,纬度为第二个元素的数组。
projection:目标投影。默认为 Web Mercator,即“EPSG:3857”。

import {
   toLonLat} from 'ol/proj'; 将坐标转换为经度/纬度。
toLonLat(coordinat,projection)
coordinat:投影坐标。
projection:坐标的投影。默认为 Web Mercator,即“EPSG:3857”。

import {
   transform} from 'ol/proj'; 将坐标从源投影转换为目标投影。这将返回一个新坐标(并且不会修改原始坐标)。
transform(coordinate, source, destination)
coordinate:
source:源投影样。
destination:目的地投影式。

3.openlayers一些配置了解

官网:https://openlayers.org/en/latest/apidoc/

this.map.addLayer(maplayer) //在页面新增图层
this.map.map,removeLayer(maplayer) //删除某一图层可结合this.map.getLayers().array_[index]使用
this.map.getLayers() //获取所有图层信息
maplayer.setOpacity(0); //设置透明度
4.vue使用Openlayers绘制点
//创建空的矢量容器(point)
let vectorSource = new VectorSource({
   });
      //创建图标层
      let vectorLayer = new VectorLayer({
   
        source: vectorSource,
      });
      this.clearTc();
      this.map.addLayer(vectorLayer);
      let poi = [];
      if (list.length) {
   
        list.forEach((item, index) => {
   
          item.coord = item.jwd;
          // fromLonLat像素点转经纬度
          poi.push(new Feature(new Point(fromLonLat(item.coord))));
          poi[index].set('name', item.name);
          poi[index].set('value', item.value);
          poi[index].set('id', item.id);
          let bdStyle = new Style({
   
            image: new CircleStyle({
   
              fill: new Fill({
   
                color: [128, 0, 128],
              }),
              radius: 6,
            }),
          });
          poi[index].setStyle(bdStyle);
        });
      }
		//根据业务需求所增加的排序
      poi.sort(function (a, b) {
   
        return b.get('value') - a.get('value');
      });
      poi.forEach((item, index) => {
   
        vectorSource.addFeature(item);
      });
5.vue使用Openlayers绘制线段
  let newList = [];
    drawList.forEach((item) => {
   
     newList =item.SectionCoord.geometry.coordinates[0].map(
      (ITEM) => fromLonLat(ITEM););
      let line = new Feature(new LineString(newList)); 
         line.setStyle(
         new Style({
   
         stroke: new Stroke({
   
          width: 4,
          color: '#00FF00',
         }),
        })
       );
  let vectorlayer = new VectorLayer({
   
  		source: new VectorSource({
    features: [line] }),
    });
    this.map.addLayer(vectorlayer); //这里是执行,执行之后点就出来了
6.vue使用Openlayers监听点击事件
let that = this;
  this.map.on('click', async (e) => {
   
  let viewResolution = /** @type {number} */ (that.view.getResolution());
   let url = that.map
          .getLayers()
          .array_[1].getSource()
          .getFeatureInfoUrl(e.coordinate, viewResolution, 'EPSG:3857', {
   
            INFO_FORMAT: 'application/json',
            FEATURE_COUNT: 50,
          });
if (url) {
   
  try {
   
    let res = await this.axios.get(url);
    for (let i = 0; i < res.data.features.length; i++) {
   
     if (res.data.features[i].id.includes('jgmile')) {
   
         if (res.data.features[i + 1] == null ||
 			!res.data.features[i].id.includes('jgmile') ) {
   
             //-----------点击的是区间----------
            let id = res.data.features[i].properties.seg;
            let result 
<think>好的,我现在要解决用户在IAR编译器中遇到的错误:“incomplete type is not allowed”。首先,我需要理解这个错误的含义和常见原因。根据我的知识库,这个错误通常发生在代码中使用了未完全定义的类型,比如结构体或联合体声明了但未定义,或者前向声明了某个类型但没有提供完整的定义。 首先,我应该检查用户代码中是否有结构体或联合体的声明但没有定义的情况。比如,如果有一个结构体声明为`struct MyStruct;`,但没有后续的完整定义,那么在需要该结构体大小或成员的地方,编译器就会报这个错误。这时候,需要用户补全结构体的定义,包括成员变量。 其次,检查是否在头文件中只声明了类型而没有包含定义。例如,如果在头文件中使用前向声明,但在使用该类型的源文件中没有包含实际的定义头文件,这也会导致错误。此时,需要确保在使用类型的地方包含了正确的头文件,或者将前向声明替换为完整的定义。 另外,还要考虑typedef的问题。如果用户使用了typedef创建别名,但原始类型未完全定义,同样会引发错误。例如,`typedef struct MyStruct MyType;`之后,如果尝试使用MyType但MyStruct尚未定义,就会出错。需要确保在使用typedef之前,原始类型已经被完整定义。 此外,数组声明中的类型不完整也是一个常见原因。比如声明数组时,如果元素类型未完全定义,编译器无法确定数组的大小,导致错误。需要检查数组声明中的类型是否已经完整定义。 可能还有其他情况,比如在C和C++混合编程时,如果没有正确使用extern "C",或者在头文件中遗漏了必要的包含,也可能导致类型不完整。需要用户检查这些方面。 接下来,我需要将这些可能的原因整理成清晰的解决步骤,并给出具体的代码示例,帮助用户理解如何修改。同时,根据用户提供的引用内容,虽然引用[1]和引用[2]是关于其他错误的,但用户可能希望看到类似的结构,即分点说明解决方案,并引用相关资源。 最后,生成相关问题,帮助用户进一步了解可能相关的编译错误,比如类型未定义、前向声明问题等。这样用户可以有更全面的认识,预防其他类似错误的发生。</think>### IAR编译器错误'incomplete type is not allowed'解决方案 该错误表示代码中使用了**未完全定义的类型**,编译器无法确定其内存布局或成员信息。以下是具体原因及解决方法: #### 1. 结构体/联合体未定义完整 若声明了结构体但未定义成员,在实例化时会报错: ```c struct MyStruct; // 前向声明不完整 struct MyStruct var; // 错误:使用未完成类型 ``` **解决方案**:补全类型定义 ```c struct MyStruct { int id; char name[20]; }; ``` #### 2. 头文件包含缺失 当跨文件使用类型时,需确保定义可见: ```c // file.h struct Data; // 前向声明 // file.c struct Data { // 实际定义 int value; }; ``` **解决方案**:在使用该类型的文件中包含定义头文件 ```c #include "file.c" // 包含实际定义 ``` #### 3. typedef别名问题 使用typedef时原始类型必须完整: ```c typedef struct Node NodeT; // 前向声明 NodeT* ptr; // 允许指针声明 NodeT instance; // 错误:不完整类型 ``` **解决方案**:先完成类型定义再typedef ```c struct Node { int data; struct Node* next; }; typedef struct Node NodeT; ``` #### 4. 数组声明不完整 数组元素类型必须完全定义: ```c struct Element; struct Element arr[10]; // 错误:元素类型未定义 ``` **解决方案**: ```c struct Element { int type; float value; }; struct Element arr[10]; // 合法 ``` #### 调试建议 1. 在IAR工程中搜索错误行号定位问题代码 2. 使用Go to Definition功能追踪类型定义 3. 检查所有头文件包含链 4. 确认没有循环依赖的头文件 编译器需要知道类型的完整信息才能: - 计算sizeof大小 - 分配内存空间 - 访问成员变量 - 进行类型对齐 [^1]: 类似类型转换错误可参考浮点转整型的类型适配问题。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值