当前位置:   article > 正文

OpenLayers接入地图_海图vue openlayers

海图vue openlayers

一、安装

1、官网

(1)官网文档

        OpenLayers - Welcome

(2)参考文档

        http://linwei.xyz/ol3-primer/ch01/index.html

(3)参考示例

        http://develop.smaryun.com:81/API/JS/OL3InterfaceDemo/index.htm

2、安装openlayers
  1. // 安装最新版本
  2. npm i ol
  3. // 安装指定版本,例如7.0.0
  4. npm i ol@7.0.0
  5. // 注意:如果npm无法正常安装,使用cnpm安装
  6. // 安装最新版本
  7. cnpm i ol
  8. // 安装指定版本,例如7.0.0
  9. cnpm i ol@7.0.0

二、配置

1、模块引入

        创建一个名为ol.js的文件,引入ol中需要使用的模块

  1. // ----------------<<CSS文件>>----------------
  2. import "ol/ol.css";
  3. // ----------------<<常用模块>>----------------
  4. import Map from "ol/Map.js";
  5. // import { XYZ } from "ol/source.js";
  6. import XYZ from "ol/source/XYZ";
  7. import View from "ol/View.js";
  8. import Fill from 'ol/style/Fill.js'
  9. import Point from 'ol/geom/Point.js';
  10. import Style from 'ol/style/Style.js';
  11. import Circle from 'ol/style/Circle.js';
  12. import Stroke from 'ol/style/Stroke.js';
  13. import Feature from 'ol/Feature.js';
  14. import TileLayer from "ol/layer/Tile.js";
  15. import LineString from 'ol/geom/LineString.js';
  16. import VectorLayer from 'ol/layer/Vector.js';
  17. import VectorSource from 'ol/source/Vector.js';
  18. import { DoubleClickZoom } from 'ol/interaction.js';
  19. // ----------------<<其他模块>>----------------
  20. import OSM from "ol/source/OSM.js";
  21. import WFS from 'ol/format/WFS.js';
  22. import Icon from 'ol/style/Icon.js';
  23. import Tile from 'ol/layer/Tile.js';
  24. import WMTS from 'ol/source/WMTS.js';
  25. import Image from 'ol/layer/Image.js';
  26. import { buffer } from 'ol/extent.js';
  27. import Overlay from 'ol/Overlay.js';
  28. import GeoJSON from 'ol/format/GeoJSON.js';
  29. import TileWMS from 'ol/source/TileWMS.js';
  30. import ImageWMS from 'ol/source/ImageWMS.js';
  31. import ImageStyle from 'ol/style/Image.js';
  32. import ZoomToExtent from 'ol/control/ZoomToExtent.js';
  33. import { transform, fromLonLat, toLonLat } from 'ol/proj.js'
  34. const ols = {
  35. Map: Map,
  36. XYZ: XYZ,
  37. View: View,
  38. OSM: OSM,
  39. WFS: WFS,
  40. Icon: Icon,
  41. Tile: Tile,
  42. WMTS: WMTS,
  43. Fill: Fill,
  44. Point: Point,
  45. Style: Style,
  46. Image: Image,
  47. buffer: buffer,
  48. Circle: Circle,
  49. Stroke: Stroke,
  50. Feature: Feature,
  51. Overlay: Overlay,
  52. GeoJSON: GeoJSON,
  53. TileWMS: TileWMS,
  54. ImageWMS: ImageWMS,
  55. toLonLat: toLonLat,
  56. TileLayer: TileLayer,
  57. transform: transform,
  58. fromLonLat: fromLonLat,
  59. ImageStyle: ImageStyle,
  60. LineString: LineString,
  61. VectorLayer: VectorLayer,
  62. VectorSource: VectorSource,
  63. ZoomToExtent: ZoomToExtent,
  64. DoubleClickZoom: DoubleClickZoom,
  65. }
  66. export default ols

三、地图渲染 & 模型添加

1、初始化地图
  1. <template>
  2. <div id="openLayers">
  3. <!-- map -->
  4. <div id="openLayerContainer"></div>
  5. </div>
  6. </template>
  7. <script>
  8. // 引入模块文件
  9. import ols from "../js/ol";
  10. export default {
  11. name: "",
  12. components: {},
  13. props: {},
  14. data() {
  15. return {
  16. // 点位ID
  17. pointId:0,
  18. // 所有点位坐标集合
  19. pointCoord:[],
  20. // 所有点位图层集合-清除使用
  21. pointVector:[],
  22. // 线条ID
  23. lineId:0,
  24. // 所有线条图层集合-清除使用
  25. lineVector:[],
  26. }
  27. },
  28. computed: {},
  29. created() {},
  30. mounted() {
  31. this.initMap();
  32. },
  33. methods: {
  34. // 初始化地图
  35. initMap() {
  36. const tileMap = new ols.TileLayer({
  37. source: new ols.XYZ({
  38. // 官网在线地图(可以添加在线和离线地图)
  39. url: "http://map.geoq.cn/ArcGIS/rest/services/ChinaOnlineStreetPurplishBlue/MapServer/tile/{z}/{y}/{x}",
  40. }),
  41. });
  42. // 初始化地图
  43. window.openLayers = new ols.Map({
  44. layers: [tileMap], // 直接在配置上加载
  45. target: "openLayerContainer", // 地图容器
  46. view: new ols.View({
  47. projection: "EPSG:4326", // 坐标系
  48. center: [110, 30], // 地图中心点
  49. zoom: 6, // 默认缩放比例
  50. minZoom: 2, // 缩放最小级别 2
  51. maxZoom: 20, // 缩放最大级别 20
  52. }),
  53. });
  54. // 清除默认的左键双击缩放
  55. const dblClickInteraction = openLayers
  56. .getInteractions()
  57. .getArray()
  58. .find((interaction) => {
  59. return interaction instanceof ols.DoubleClickZoom;
  60. });
  61. openLayers.removeInteraction(dblClickInteraction);
  62. // 左键双击
  63. openLayers.on("dblclick", (e) => {
  64. // 添加点位
  65. this.addPoint(e.coordinate);
  66. // 保存点位坐标位置
  67. this.pointCoord.push(e.coordinate);
  68. });
  69. },
  70. },
  71. };
  72. </script>
  73. <style lang="less" scoped>
  74. #openLayers {
  75. width: 100%;
  76. height: 100vh;
  77. #openLayerContainer {
  78. width: 100%;
  79. height: 100%;
  80. }
  81. }
  82. </style>

2、添加模型
(1)官网示例

        每一个点位和线条都会创建一个图层

        ① 添加、清除点位
  1. // 添加点位
  2. addPoint(coordinate) {
  3. // 创建点位
  4. const point = new ols.Feature({
  5. geometry: new ols.Point([coordinate[0], coordinate[1]]),
  6. });
  7. // 设置点位id
  8. point.setId(this.pointId);
  9. // 设置点位样式
  10. point.setStyle(
  11. new ols.Style({
  12. // 形状
  13. image: new ols.Circle({
  14. radius: 3,
  15. fill: new ols.Fill({
  16. color: "rgba(255,0,0,1)",
  17. }),
  18. }),
  19. })
  20. );
  21. //实例化一个矢量图层Vector作为绘制层
  22. const source = new ols.VectorSource({
  23. features: [point],
  24. });
  25. //创建一个图层
  26. const vector = new ols.VectorLayer({
  27. source: source,
  28. });
  29. //将绘制层添加到地图容器中
  30. openLayers.addLayer(vector);
  31. // 图层中添加点
  32. vector.getSource().addFeature(point);
  33. //存储图层
  34. this.pointVector.push(vector);
  35. // 点位id加1,下次创建点位使用
  36. this.pointId++;
  37. },
  38. // 清除点位
  39. clearPoint() {
  40. // 移除点位
  41. this.pointCoord.forEach((item) => {
  42. item
  43. .getSource()
  44. .getFeatures()
  45. .forEach((feature) => {
  46. item.getSource().removeFeature(feature);
  47. });
  48. // 从地图容器重删除绘制层
  49. openLayers.removeLayer(item);
  50. });
  51. // 点位ID
  52. this.pointId = 0;
  53. // 所有点位坐标集合
  54. this.pointCoord = [];
  55. // 所有点位图层集合-清除使用
  56. this.pointVector = [];
  57. },

        ② 添加、清除线条
  1. // 添加线条
  2. addLine() {
  3. if (!this.pointCoord || this.pointCoord.length < 2) {
  4. this.$message.warning("至少需要2个点");
  5. } else {
  6. // 创建线条
  7. const line = new ols.Feature({
  8. geometry: new ols.LineString(this.pointCoord),
  9. });
  10. // 设置线条id
  11. line.setId(this.lineId);
  12. // 设置线条样式
  13. line.setStyle(
  14. new ols.Style({
  15. // 边线
  16. stroke: new ols.Stroke({
  17. color: "#ffffff",
  18. width: 2,
  19. }),
  20. })
  21. );
  22. // 实例化一个矢量图层Vector作为绘制层
  23. const source = new ols.VectorSource({
  24. features: [line],
  25. });
  26. // 创建一个图层
  27. const vector = new ols.VectorLayer({
  28. source: source,
  29. });
  30. // 将绘制图层添加到地图容器中
  31. openLayers.addLayer(vector);
  32. // 图层中添加线
  33. vector.getSource().addFeature(line);
  34. // 存储图层
  35. this.lineVector.push(vector);
  36. // 线条id加1,下次创建线条使用
  37. this.lineId++;
  38. }
  39. },
  40. // 清除线条
  41. clearLine() {
  42. // 移除线条
  43. this.lineVector.forEach((item) => {
  44. item
  45. .getSource()
  46. .getFeatures()
  47. .forEach((feature) => {
  48. item.getSource().removeFeature(feature);
  49. });
  50. // 从地图容器重删除绘制层
  51. openLayers.removeLayer(item);
  52. });
  53. // 线条ID
  54. this.lineId = 0;
  55. // 所有线条图层集合-清除使用
  56. this.lineVector = [];
  57. },

(2)个人示例

        点位和线条各一个图层

        ① 添加、清除点位
  1. // 添加点位
  2. addPoint(coordinate) {
  3. if (!this.pointVector) {
  4. //实例化一个矢量图层Vector作为绘制层
  5. const source = new ols.VectorSource();
  6. this.pointVector = new ols.VectorLayer({
  7. source: source,
  8. });
  9. }
  10. // 创建点位
  11. const point = new ols.Feature({
  12. geometry: new ols.Point([coordinate[0], coordinate[1]]),
  13. });
  14. // 设置点位id
  15. point.setId(this.pointId);
  16. // 设置点位样式
  17. point.setStyle(
  18. new ols.Style({
  19. // 形状
  20. image: new ols.Circle({
  21. radius: 3,
  22. fill: new ols.Fill({
  23. color: "rgba(255,0,0,1)",
  24. }),
  25. }),
  26. })
  27. );
  28. //将绘制层从地图容器中移除
  29. openLayers.removeLayer(this.pointVector);
  30. //将绘制层添加到地图容器中
  31. openLayers.addLayer(this.pointVector);
  32. //更新地图
  33. openLayers.updateSize();
  34. // 图层中添加点位
  35. this.pointVector.getSource().addFeature(point);
  36. // 存储点位
  37. this.pointArr.push(point);
  38. // 点位id加1,下次创建点位使用
  39. this.pointId++;
  40. },
  41. // 清除点位
  42. clearPoint() {
  43. // 移除点位
  44. this.pointArr.forEach((item) => {
  45. this.pointVector.getSource().removeFeature(item);
  46. });
  47. // 从地图容器中删除绘制层
  48. openLayers.removeLayer(this.pointVector);
  49. // 点位ID
  50. (this.pointId = 0),
  51. // 所有点位坐标集合
  52. (this.pointCoord = []);
  53. // 所有点位图层集合-清除使用
  54. this.pointVector = [];
  55. },

        ② 添加、清除线条
  1. // 添加线条
  2. addLine() {
  3. if (!this.pointCoord || this.pointCoord.length < 2) {
  4. this.$message.warning("至少需要2个点");
  5. } else {
  6. //实例化一个矢量图层Vector作为绘制层
  7. if (!this.lineVector) {
  8. const source = new ols.VectorSource();
  9. this.lineVector = new ols.VectorLayer({
  10. source: source,
  11. });
  12. }
  13. // 创建线条
  14. const line = new ols.Feature({
  15. geometry: new ols.LineString(this.pointCoord),
  16. });
  17. // 设置线条id
  18. line.setId(this.lineId);
  19. // 设置线条样式
  20. line.setStyle(
  21. new ols.Style({
  22. // 边线
  23. stroke: new ols.Stroke({
  24. color: "#ffffff",
  25. width: 2,
  26. }),
  27. })
  28. );
  29. //将绘制层从地图容器中移除
  30. openLayers.removeLayer(this.lineVector);
  31. //将绘制层添加到地图容器中
  32. openLayers.addLayer(this.lineVector);
  33. //更新地图
  34. openLayers.updateSize();
  35. // 图层中添加线
  36. this.lineVector.getSource().addFeature(line);
  37. // 存储线条
  38. this.lineArr.push(line);
  39. // 线条id加1,下次创建线条使用
  40. this.lineId++;
  41. }
  42. },
  43. // 清除线条
  44. clearLine() {
  45. // 移除线条
  46. this.lineArr.forEach((item) => {
  47. this.lineVector.getSource().removeFeature(item);
  48. });
  49. // 从地图容器中删除绘制层
  50. openLayers.removeLayer(this.lineVector);
  51. // 线条ID
  52. this.lineId = 0;
  53. // 所有线条图层集合-清除使用
  54. this.lineVector = [];
  55. },

四、其他操作

1、鼠标事件
  1. // 清除默认的左键双击缩放
  2. const dblClickInteraction = openLayers
  3. .getInteractions()
  4. .getArray()
  5. .find((interaction) => {
  6. return interaction instanceof ols.DoubleClickZoom;
  7. });
  8. openLayers.removeInteraction(dblClickInteraction);
  9. //左键单击
  10. openLayers.on("singleclick", (e) => {
  11. console.log("左键单击", e);
  12. });
  13. // 左键双击
  14. openLayers.on("dblclick", (e) => {
  15. console.log("左键双击", e);
  16. });
  17. // 单击(左右键)
  18. openLayers.on("click", (e) => {
  19. console.log("单击", e);
  20. });
  21. // 鼠标移动
  22. openLayers.on("pointermove", (e) => {
  23. console.log("鼠标移动", e);
  24. });
  25. // 鼠标拖拽
  26. openLayers.on("pointerdrag", (e) => {
  27. console.log("鼠标拖拽", e);
  28. });
  29. // 地图移动事件
  30. openLayers.on("moveend", (e) => {
  31. console.log("地图移动事件", e);
  32. });

五、完整案例

1、代码(ol@6.15.1)
  1. <template>
  2. <div class="openLayers">
  3. <!-- map -->
  4. <div id="openLayerContainer"></div>
  5. </div>
  6. </template>
  7. <script>
  8. // ----------------<<CSS文件>>----------------
  9. import "ol/ol.css";
  10. import imgUrl from "@assets/img/car.png"; // 引入图片
  11. // ----------------<<常用模块>>----------------
  12. import Map from "ol/Map.js";
  13. import XYZ from "ol/source/XYZ.js";
  14. import View from "ol/View.js";
  15. import TileLayer from "ol/layer/Tile.js";
  16. import { fromLonLat, transform } from "ol/proj.js";
  17. import styleCircle from "ol/style/Circle.js";
  18. import Style from "ol/style/Style.js";
  19. import Icon from "ol/style/Icon.js";
  20. import Stroke from "ol/style/Stroke.js"; // 线条颜色
  21. import Fill from "ol/style/Fill.js"; // 填充色
  22. import Feature from "ol/Feature.js";
  23. import VectorSource from "ol/source/Vector.js";
  24. import VectorLayer from "ol/layer/Vector.js";
  25. import { LineString, Point, Circle, LinearRing, Polygon } from "ol/geom";
  26. export default {
  27. name: "",
  28. components: {},
  29. props: {},
  30. data() {
  31. return {
  32. // 地图对象
  33. openLayers: null,
  34. // 绘制层
  35. sourceVector: null,
  36. // 图层
  37. layerVector: null,
  38. // 位置信息
  39. position: {
  40. localDoa: 0, // 方位
  41. localROA: 30, // 夹角
  42. localHeight: 0, // 高度
  43. localLon: 130, // 经度
  44. localLat: 30, // 纬度
  45. },
  46. // timer
  47. timer: null,
  48. };
  49. },
  50. computed: {},
  51. created() {},
  52. mounted() {
  53. this.queryLocalPos(); // 获取实时位置
  54. this.initMap();
  55. this.changeTowardParams();
  56. },
  57. methods: {
  58. // ---------------------<<请求>>---------------------
  59. queryLocalPos() {
  60. this.$API.queryLocalPosRequest().then((res) => {
  61. if (res.code == 1000) {
  62. this.position = res.data;
  63. // this.initMap();
  64. }
  65. });
  66. },
  67. // ---------------------<<地图>>---------------------
  68. // 初始化地图
  69. initMap() {
  70. const tileMap = new TileLayer({
  71. source: new XYZ({
  72. // 官网在线地图(可以添加在线和离线地图)
  73. // url: "http://map.geoq.cn/ArcGIS/rest/services/ChinaOnlineStreetPurplishBlue/MapServer/tile/{z}/{y}/{x}",
  74. url: "https://webrd01.is.autonavi.com/appmaptile?lang=zh_cn&size=1&scale=1&style=8&x={x}&y={y}&z={z}",
  75. }),
  76. });
  77. // 初始化地图;
  78. window.openLayers = new Map({
  79. target: "openLayerContainer", // 地图容器
  80. layers: [tileMap], // 直接在配置上加载
  81. view: new View({
  82. projection: "EPSG:3857", // 坐标系
  83. center: fromLonLat([this.position.localLon, this.position.localLat]),
  84. zoom: 9, // 默认缩放比例
  85. minZoom: 5, // 缩放最小级别 1
  86. maxZoom: 10, // 缩放最大级别 20
  87. }),
  88. });
  89. // 画圆
  90. this.drawCircle(this.position, 50000);
  91. // 设置地图中心点-定位功能
  92. // openLayers.getView().setCenter(fromLonLat([this.position.localLon, this.position.localLat]));
  93. // openLayers.on("pointerdrag", function (e) {
  94. // console.log("鼠标拖拽", e);
  95. // });
  96. // openLayers.on("singleclick", function (e) {
  97. // console.log("左键单击", e);
  98. // // const coordinate = transform(e.coordinate, "EPSG:3857", "EPSG:4326");
  99. // });
  100. // openLayers.on("click", function (e) {
  101. // console.log("鼠标点击", e);
  102. // // const coordinate = transform(e.coordinate, "EPSG:3857", "EPSG:4326");
  103. // });
  104. // // 清除默认的左键双击缩放
  105. // const dblClickInteraction = openLayers
  106. // .getInteractions()
  107. // .getArray()
  108. // .find((interaction) => {
  109. // return interaction instanceof ols.DoubleClickZoom;
  110. // });
  111. // openLayers.removeInteraction(dblClickInteraction);
  112. // openLayers.on("dblclick", function (e) {
  113. // console.log("左键双击", e);
  114. // // const coordinate = transform(e.coordinate, "EPSG:3857", "EPSG:4326");
  115. // });
  116. },
  117. // 画圆
  118. drawCircle(ps, range) {
  119. var newCircle = new Feature({
  120. geometry: new Circle(fromLonLat([ps.localLon, ps.localLat]), range),
  121. });
  122. // 设置id
  123. newCircle.setId("newCircle");
  124. newCircle.setStyle(
  125. new Style({
  126. //填充色
  127. fill: new Fill({
  128. color: "rgba(255,228,181,0.5)",
  129. }),
  130. //边线颜色
  131. stroke: new Stroke({
  132. color: "#FE9E28",
  133. width: 3,
  134. }),
  135. //形状
  136. image: new styleCircle({
  137. radius: 7,
  138. fill: new Fill({
  139. color: "rgba(255,228,181,0.5)",
  140. }),
  141. }),
  142. })
  143. );
  144. //实例化一个矢量图层Vector作为绘制层
  145. this.sourceVector = new VectorSource({
  146. features: [newCircle],
  147. });
  148. //创建一个图层
  149. this.layerVector = new VectorLayer({
  150. source: this.sourceVector,
  151. });
  152. //将图层添加到地图容器中
  153. openLayers.addLayer(this.layerVector);
  154. // 添加中心点
  155. this.drawPoint({
  156. lon: ps.localLon,
  157. lat: ps.localLat,
  158. angle: ps.localDoa,
  159. });
  160. // 添加扇形
  161. this.drawCurve(
  162. fromLonLat([ps.localLon, ps.localLat]),
  163. range,
  164. ps.localDoa,
  165. ps.localROA
  166. );
  167. },
  168. // 位置:origin
  169. // 范围:radius
  170. // 朝向:angle
  171. // 角度:range
  172. drawCurve(origin, radius, angle, range) {
  173. const feature = new Feature({
  174. geometry: new Polygon([this.addCurve(origin, radius, angle, range)]),
  175. });
  176. // 设置id
  177. feature.setId("myCurve");
  178. feature.setStyle(
  179. new Style({
  180. //填充色
  181. fill: new Fill({
  182. color: "rgba(255,0,0,.5)",
  183. }),
  184. //边线颜色
  185. stroke: new Stroke({
  186. color: "#FF0000",
  187. width: 1,
  188. }),
  189. })
  190. );
  191. this.layerVector.getSource().addFeatures([feature]);
  192. },
  193. addCurve(origin, radius, angle, range) {
  194. let pointList = [];
  195. /**
  196. * 添加起始点位
  197. */
  198. pointList.push(origin);
  199. /**
  200. * 开始角度
  201. */
  202. let startAngle = angle - range / 2 + 90;
  203. /**
  204. * 根据传进来的角度范围绘制
  205. */
  206. for (let i = 0; i < range; i++) {
  207. startAngle += 1;
  208. /**
  209. * 利用余弦计算出维度,因为在二维地图中正北方向是朝上的,同理经度有正弦可以计算出来
  210. */
  211. let lon = Math.cos((startAngle * Math.PI) / 180) * radius + origin[0];
  212. let lat = Math.sin((startAngle * Math.PI) / 180) * radius + origin[1];
  213. /**
  214. * 添加进数组中
  215. */
  216. pointList.push([lon, lat]);
  217. }
  218. return pointList;
  219. },
  220. // 画点
  221. drawPoint(ps) {
  222. // 创建点位
  223. const point = new Feature({
  224. geometry: new Point(fromLonLat([ps.lon, ps.lat])),
  225. });
  226. // 设置id
  227. point.setId("myPoint");
  228. // 设置点位样式
  229. point.setStyle(
  230. new Style({
  231. image: new Icon({
  232. src: imgUrl,
  233. scale: 0.1,
  234. rotation: -(ps.angle * (6.3 / 360)),
  235. }),
  236. })
  237. );
  238. // 添加到图层
  239. this.layerVector.getSource().addFeatures([point]);
  240. },
  241. // 重新添加所有实体
  242. addAll() {
  243. // 清除所有实体
  244. this.clearAll();
  245. // 添加所有实体
  246. this.drawCircle(this.position, 50000);
  247. // 设置地图中心点
  248. openLayers
  249. .getView()
  250. .setCenter(
  251. fromLonLat([this.position.localLon, this.position.localLat])
  252. );
  253. },
  254. // 清除所有
  255. clearAll() {
  256. // 删除所有feature
  257. this.layerVector
  258. .getSource()
  259. .getFeatures()
  260. .forEach((feature) => {
  261. this.layerVector.getSource().removeFeature(feature);
  262. });
  263. // 删除图层
  264. openLayers.removeLayer(this.layerVector);
  265. },
  266. // 调整方位
  267. changeToward(ps, range) {
  268. this.addAll();
  269. },
  270. // 调整方位参数
  271. changeTowardParams() {
  272. // 自动调整方位
  273. if (this.timer) {
  274. clearInterval(this.timer);
  275. }
  276. this.timer = setInterval(() => {
  277. if (this.position.localDoa == 360) {
  278. this.position.localDoa = 0;
  279. }
  280. this.position.localDoa -= 6;
  281. }, 500);
  282. },
  283. },
  284. watch: {
  285. position: {
  286. handler(newVal, oldVal) {
  287. this.changeToward(newVal, 50000);
  288. },
  289. deep: true,
  290. },
  291. },
  292. beforeDestroy() {
  293. clearInterval(this.timer);
  294. },
  295. };
  296. </script>
  297. <style lang="less" scoped>
  298. .openLayers {
  299. width: 100%;
  300. height: 100%;
  301. #openLayerContainer {
  302. width: 100%;
  303. height: 100%;
  304. background-color: #2f4f4f;
  305. }
  306. }
  307. </style>

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/155765?site
推荐阅读
相关标签
  

闽ICP备14008679号