openlayers实例_介绍OpenLayers

简介

Web开发有一个专门的方向就是Web GIS,而Openlayers库就是Web GIS里的一个翘楚,想要开源的Web GIS的JavaScript库几乎就没有别的选择。

OpenLayers的官网是

OpenLayers - Welcome​openlayers.org

目前最新的版本是5.3.x。它的github地址是

openlayers/openlayers​github.com
701fdf172ef15f064616dabc69aac0ea.png

看看官网上的一句话介绍——A high-performance, feature-packed library for all your mapping needs.,如果看不出什么来(微言而不大义),那就再看看详细的介绍和特性

OpenLayers makes it easy to put a dynamic map in any web page. It can display map tiles, vector data and markers loaded from any source. OpenLayers has been developed to further the use of geographic information of all kinds. It is completely free, Open Source JavaScript, released under the 2-clause BSD License (also known as the FreeBSD).

  • Tiled Layers
  • Vector Layers
  • Cutting Edge, Fast & Mobile Ready
  • Easy to Customize and Extend

总结出来几个特点是

  1. 做地图的
  2. 能支持不同的层类型,比如瓦片、矢量等
  3. 能支持移动设备了
  4. 方便定制和扩展
  5. Licence也不让你有后顾之忧

要强调的是OpenLayers仅仅是Web GIS的前端,不包含后端,而整个前后端的Web GIS的解决方案可以参考Arc GIS。有的场景下,比如数据量特别大,假设有10000个标记,那么不适合把数据传送到前端在前端渲染,而是在后端制图,在地图移动、缩放的时候把当前范围内的标记通过图像的方式传递到前端展现。

另一个混淆的概念是LBS应用,比如百度地图API、高德地图API等,这种适用于通用型的应用,而对于特别专业化的应用解决方案,比如电信业、交通业就不适合了,它们是不需要展现周围有什么公交站和电影院的 : )。

Hello World

新建目录,然后npm init -y初始化一下,修改package.json

{"name": "openlayers","version": "1.0.0","description": "","main": "index.js","scripts": {"start": "webpack-dev-server --open"},"keywords": [],"author": "","license": "ISC","dependencies": {"ol": "^5.3.3"},"devDependencies": {"html-webpack-plugin": "^3.2.0","webpack": "^4.39.1","webpack-cli": "^3.3.6","webpack-dev-server": "^3.7.2"}
}

新建webpack.config.js文件,以下几乎是最小化的配置了

const path = require("path");
const webpack = require("webpack");
const HtmlWebpackPlugin = require("html-webpack-plugin");module.exports = {mode: "development",entry: {app: "./src/index.js"},devtool: "inline-source-map",devServer: {//静态资源放这个目录下,不然会找不到contentBase: "./dist",hot: true},plugins: [new HtmlWebpackPlugin({template: "./dist/index.html"}),new webpack.HotModuleReplacementPlugin()],output: {filename: "[name].bundle.js",path: path.resolve(__dirname, "dist")}
};

入口的html.js文件

<!DOCTYPE html>
<html><head><meta charset="utf-8" /><title>Hello Openlayers</title><link rel="stylesheet" href="./ol.css" /><style>html,body {margin: 0;height: 100%;}#map {position: absolute;top: 0;bottom: 0;width: 100%;}</style></head><body><div id="map"></div></body>
</html>

入口的index.js文件

import { Map, View } from "ol";
import TileLayer from "ol/layer/Tile";
import OSM from "ol/source/OSM";
import { fromLonLat } from "ol/proj";
new Map({target: "map",layers: [new TileLayer({source: new OSM()})],view: new View({center: fromLonLat([121.47, 31.23]),zoom: 15})
});

7c5273e41ecd6007507d1c4e14992a70.png

不需要几行代码就搭建出了一个地图,这里加载的是OpenStreetMap,没有版权、费用的困扰。

基础概念

OpenLayers里有几个重要的概念,理清它们后有助于我们开发。

Map

Map就是地图,它是一个抽象的概念。Map上可以关联多个Layer或者一个View。它的定义在ol/Map下。

Layer

Layer表示一个图层。OpenLayers的名字里就带有Layer,表示最终它的展现效果是通过一层层的Layer来显示出来的,比如你可以在底部显示基础的地图,然后在地图的上方显示一些标记、线路、提示等效果。

它的定义在ol/layer下,有如下四种基础的Layer,前两种属于栅格,后两种属于矢量。

  • ol/layer/Tile - 渲染瓦片图片,就是那种将整个地图分解为一张张图片最后拼起来的
  • ol/layer/Image - 渲染图像
  • ol/layer/Vector - 渲染矢量数据
  • ol/layer/VectorTile - 渲染矢量瓦片

Source

Source就是地图的来源,在OpenLayers里可以支持多种地图源,比如OpenStreetMap 、Bing、XYZ或者矢量的KML等。

Source是跟Layer关联的。它的定义在ol/source下。

View

View用来表示一组属性,比如中心点,缩放大小以及映射等。它的定义在ol/View下。

控件

ol/control下已经定义了一些内置的控件,如果不满意,部分也是可以定制的。

大致有如下一些内置控件

  • 全屏
  • 鼠标经纬度
  • 旋转
  • 缩放
  • 小地图(类似于打游戏时的那种小地图)

d6f762d26f98f2235c586de2cff329bb.png

交互

交互事件定义在ol/interaction下,大致有如下一些交互事件

  • DragRotate
  • DoubleClickZoom
  • DragPan
  • PinchRotate
  • PinchZoom
  • KeyboardPan
  • KeyboardZoom
  • MouseWheelZoom
  • DragZoom

下图是测距和测面积的交互实例

f5646b5484d3267fe37c3a400d934822.png

API和Demo

我觉得只要理清基础概念,那么查阅API就不会很困难,在线API地址是

OpenLayers v5.3.0 API - Index​openlayers.org

可以先浏览一遍Demo,目前大约有将近170个例子,浏览过后就可以对OpenLayers能做一些什么事情心里有数了,它的地址是

OpenLayers Examples​openlayers.org

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/485909.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

macos Jetbrains IDEA用户自定义vm配置信息存储路径, IDEA点击无反应 无法打开问题解决

Jetbrains Clion, IDEA 用户在应用里面修改了自定义的VM配置后的存储路径为 ~/Library/Application Support/JetBrains/xxx2023.3/xxx.vmoptions xxx为你安装的APP名称, 如 Clion .IntelliJIdea 这里的自定义配置如果配置有误就会直接导致JetBrains软件无法打开, 即 点击打开…

Leetcode--322. 零钱兑换

给定不同面额的硬币 coins 和一个总金额 amount。编写一个函数来计算可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额&#xff0c;返回 -1。 示例 1: 输入: coins [1, 2, 5], amount 11 输出: 3 解释: 11 5 5 1 示例 2: 输入: coins [2],…

【sping揭秘】19、关于spring中jdbctemplate中的DataSource怎么来呢

我们这是可以正好借助之前学的factorybean类&#xff0c;自己吧jdbctemplate加载到spring容器中&#xff0c;我们可以封装多个这种对象&#xff0c;那么可以实现针对不同的数据库的jdbctemplate 首先我们肯定要引入对应的jar&#xff0c;来构建数据源对象 <dependency>&l…

2020年度“中国神经科学重大进展”获奖名单【附成果介绍】

来源&#xff1a;brainnews编辑&#xff1a;Simon为了推动神经科学领域的创新发展&#xff0c;充分展示和宣传神经科学领域的重大科研成果&#xff0c;经中国神经科学学会七届二次常务理事会一致通过&#xff0c;开展2020年度“中国神经科学重大进展”推荐工作。按照相关程序&a…

python选择某一行_Python常用语法有哪些 如何快速入门Python开发

Python常用语法有哪些&#xff1f;如何快速入门Python开发&#xff1f;Python编程语言是最容易学习、并且功能强大的语言&#xff0c;吸引了很多人学习入行。很多人想知道如何快速入门Python开发&#xff0c;接下来就给大家分享Python学习入门中常用的语法知识。1、变量。常量&…

Java--线程同步

在单线程程序中&#xff0c;每次只做一件事情&#xff0c;后面的事情需要等待前面这件事情完成才可以进行 如果是多线程程序&#xff0c;这件事情还没做完就又做另外一件事情&#xff0c;这就可能发生两个线程抢占资源的问题 例如&#xff1a;a与b两个人都要去洗手间&#xf…

人类使用AI征服太空技术盘点,《星球大战》中的机器人会成为现实吗?

来源&#xff1a;学术头条作者&#xff1a;Thomas Lawrence一说起太空 AI&#xff0c;你脑海中浮现的是这样的角色吗&#xff1f;图 | 电影《星球大战》的AI机器人&#xff1a;C-3PO和R2-D2&#xff08;来源&#xff1a;starwars.fandom.com)实际上&#xff0c;早在现代计算机问…

springboot jar中没有主清单属性_Spring Boot 常见错误及解决方法

导读Spring Boot 作为 Java 生态中最流行的开发框架&#xff0c;意味着被数以万计的开发者所使用。下面根据我们自身遇到的问题&#xff0c;加上用户提供的一些反馈&#xff0c;来大致梳理下 Spring Boot 的常见错误及解决方法。找不到配置&#xff1f;配置不对&#xff1f;配置…

Leetcode--174. 地下城游戏

一些恶魔抓住了公主&#xff08;P&#xff09;并将她关在了地下城的右下角。地下城是由 M x N 个房间组成的二维网格。我们英勇的骑士&#xff08;K&#xff09;最初被安置在左上角的房间里&#xff0c;他必须穿过地下城并通过对抗恶魔来拯救公主。 骑士的初始健康点数为一个正…

[jQuery] 判断复选框checkbox是否选中checked

返回值是true/false method 1: $("#register").click(function(){if($("#accept").get(0).checked){alert($("#accept").get(0).checked);}else{alert($("#accept").get(0).checked);}});// 其中accept为复选框的id. 或者可以替换为: …

Nature:2020年10大科学发现

文章来源&#xff1a;新浪探索在2020年即将结束之际&#xff0c;《自然》&#xff08;Nature&#xff09;杂志盘点了今年发表的科学新闻和研究观点&#xff0c;从中选出了十项最为重大的科学发现&#xff0c;既包括新冠病毒研究、压力如何导致白发、HIV治疗等医学方面的研究&am…

php mysql上传多张图片_PHP实现一次性多张图片上传功能

原标题&#xff1a;PHP实现一次性多张图片上传功能最近遇到一个需求&#xff0c;就是多张图片上传&#xff0c;按住Ctrl键能选择多张图片一次性上传&#xff0c;上传成功后数据库保存图片的路径及图片原来的文件名。该功能一般在比较成熟的内容编辑器插件中有&#xff0c;今天特…

Leetcode--20. 有效的括号

给定一个只包括 (&#xff0c;)&#xff0c;{&#xff0c;}&#xff0c;[&#xff0c;] 的字符串&#xff0c;判断字符串是否有效。 有效字符串需满足&#xff1a; 左括号必须用相同类型的右括号闭合。 左括号必须以正确的顺序闭合。 注意空字符串可被认为是有效字符串。 示…

【2018.6.7】阶段总结

颓废了好久-.- 不记得从什么时候开始的了吧- 1. 好像是去年初赛翻车&#xff1f;&#xff09;&#xff09;归于以外好像也是我不对&#xff0c;&#xff0c;&#xff0c;总之很多&#xff0c;&#xff0c;不对的地方吧&#xff0c;&#xff0c;&#xff0c;我&#xff0c;&am…

车联网支持实现无人驾驶的思考

来源&#xff1a;机器学习研究组订阅号/ 导读 /无人驾驶是车辆作为运载工具智能化、网联化发展的核心应用功能&#xff0c;也是车联网、智慧交通产业发展的核心应用服务。网联无人驾驶则是在车辆智能化基础上&#xff0c;通过车联网实现车与车、车与路等的互联和信息交互&#…

mysql的代码需要保存吗_php向Mysql数据库保存数据的代码

php向Mysql数据库保存数据的代码PHP如何向MySQL数据库中写入数据你知道吗&#xff1f;你对PHP向MySQL数据库中写入数据了解吗&#xff1f;下面是小编为大家带来的php向Mysql数据库保存数据的代码&#xff0c;欢迎阅读。php向Mysql数据库保存数据的代码PHP向MySQL数据库中写入数…

Leetcode--150. 逆波兰表达式求值

根据逆波兰表示法&#xff0c;求表达式的值。 有效的运算符包括 , -, *, / 。每个运算对象可以是整数&#xff0c;也可以是另一个逆波兰表达式。 说明&#xff1a; 整数除法只保留整数部分。 给定逆波兰表达式总是有效的。换句话说&#xff0c;表达式总会得出有效数值且不存…

简论重大科学发现诞生的时机

来源&#xff1a;秦四清科学网博客。链接地址&#xff1a;http://blog.sciencenet.cn/blog-575926-1263364.html 纵观科学史&#xff0c;几乎每一项重大科学发现诞生的时机需要&#xff1a;&#xff08;1&#xff09;当时已具备足够的知识和资料储备&#xff1b;&#xff08;2&…

数据库接口使用示例

考虑到我们的接口文档可能不是很清晰&#xff0c;昨天对接的时候也发现UI人员对我们的接口逻辑不太理解&#xff0c;所以这里写几个典型范例。虽然对接也快对接完了&#xff08;逃&#xff0c;但是这样至少免得以后忘记了。 &#xff08;注&#xff1a;这里的代码都测试过&…

python pip gpl_python pip怎么更新包

1、pip下载安装1.1 pip下载进入https://pypi.python.org/pypi/pip&#xff0c;下载 .tar.gz压缩包1.2 Linux安装pip# tar -xzvf pip-1.5.4.tar.gz 解压# cd pip-1.5.4 进入解压文件# python setup.py install 安装1.3 升级pippython -m pip install…