Compare commits
4 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
cb63b398d3 | ||
|
|
ce89a82e6a | ||
|
|
1c269d6e0b | ||
|
|
83b8fe4b33 |
@@ -2,7 +2,7 @@ version: 2
|
|||||||
jobs:
|
jobs:
|
||||||
build:
|
build:
|
||||||
docker:
|
docker:
|
||||||
- image: circleci/node:latest-browsers
|
- image: circleci/node:10-browsers
|
||||||
|
|
||||||
working_directory: ~/repo
|
working_directory: ~/repo
|
||||||
|
|
||||||
@@ -27,14 +27,6 @@ jobs:
|
|||||||
name: Run Tests
|
name: Run Tests
|
||||||
command: npm test
|
command: npm test
|
||||||
|
|
||||||
- store_artifacts:
|
|
||||||
path: coverage/
|
|
||||||
destination: coverage
|
|
||||||
|
|
||||||
- store_artifacts:
|
|
||||||
path: rendering/cases/
|
|
||||||
destination: rendering
|
|
||||||
|
|
||||||
- run:
|
- run:
|
||||||
name: Build Examples
|
name: Build Examples
|
||||||
command: npm run build-examples
|
command: npm run build-examples
|
||||||
@@ -42,11 +34,3 @@ jobs:
|
|||||||
- store_artifacts:
|
- store_artifacts:
|
||||||
path: build/examples
|
path: build/examples
|
||||||
destination: examples
|
destination: examples
|
||||||
|
|
||||||
- run:
|
|
||||||
name: Build API Docs
|
|
||||||
command: npm run apidoc
|
|
||||||
|
|
||||||
- store_artifacts:
|
|
||||||
path: build/apidoc
|
|
||||||
destination: apidoc
|
|
||||||
|
|||||||
@@ -11,3 +11,7 @@ insert_final_newline = true
|
|||||||
[*.md]
|
[*.md]
|
||||||
indent_size = 2
|
indent_size = 2
|
||||||
trim_trailing_whitespace = false
|
trim_trailing_whitespace = false
|
||||||
|
|
||||||
|
[Makefile]
|
||||||
|
indent_style = tab
|
||||||
|
indent_size = 4
|
||||||
|
|||||||
8
.github/FUNDING.yml
vendored
8
.github/FUNDING.yml
vendored
@@ -1,8 +0,0 @@
|
|||||||
# These are supported funding model platforms
|
|
||||||
|
|
||||||
github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2]
|
|
||||||
patreon: # Replace with a single Patreon username
|
|
||||||
open_collective: openlayers
|
|
||||||
ko_fi: # Replace with a single Ko-fi username
|
|
||||||
tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel
|
|
||||||
custom: # Replace with a single custom sponsorship URL
|
|
||||||
9
.github/ISSUE_TEMPLATE.md
vendored
Normal file
9
.github/ISSUE_TEMPLATE.md
vendored
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
<!--
|
||||||
|
Thank you for your interest in making OpenLayers better!
|
||||||
|
|
||||||
|
If you are reporting a bug, please link to an example that reproduces the problem. This will make it easier for people who may want to help you debug.
|
||||||
|
|
||||||
|
If you have a usage question, you might want to try Stack Overflow first: https://stackoverflow.com/questions/tagged/openlayers
|
||||||
|
|
||||||
|
Thanks
|
||||||
|
-->
|
||||||
19
.github/ISSUE_TEMPLATE/bug_report.md
vendored
19
.github/ISSUE_TEMPLATE/bug_report.md
vendored
@@ -1,19 +0,0 @@
|
|||||||
---
|
|
||||||
name: Bug report
|
|
||||||
about: Create a report to help us improve
|
|
||||||
labels:
|
|
||||||
- bug
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
**Describe the bug**
|
|
||||||
A clear and concise description of what the bug is.
|
|
||||||
|
|
||||||
**To Reproduce**
|
|
||||||
Steps to reproduce the behavior:
|
|
||||||
1. Go to '...'
|
|
||||||
2. Click on '....'
|
|
||||||
3. See error
|
|
||||||
|
|
||||||
**Expected behavior**
|
|
||||||
A clear and concise description of what you expected to happen.
|
|
||||||
13
.github/ISSUE_TEMPLATE/feature_request.md
vendored
13
.github/ISSUE_TEMPLATE/feature_request.md
vendored
@@ -1,13 +0,0 @@
|
|||||||
---
|
|
||||||
name: Feature request
|
|
||||||
about: Suggest an idea for this project
|
|
||||||
labels:
|
|
||||||
- feature request
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
**Is your feature request related to a problem? Please describe.**
|
|
||||||
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
|
|
||||||
|
|
||||||
**Describe the solution you'd like**
|
|
||||||
A clear and concise description of what you want to happen.
|
|
||||||
17
.github/stale.yml
vendored
17
.github/stale.yml
vendored
@@ -1,17 +0,0 @@
|
|||||||
# Number of days of inactivity before an issue becomes stale
|
|
||||||
daysUntilStale: 60
|
|
||||||
# Number of days of inactivity before a stale issue is closed
|
|
||||||
daysUntilClose: 7
|
|
||||||
# Issues with these labels will never be considered stale
|
|
||||||
exemptLabels:
|
|
||||||
- blocker
|
|
||||||
- regression
|
|
||||||
# Label to use when marking an issue as stale
|
|
||||||
staleLabel: stale
|
|
||||||
# Comment to post when marking an issue as stale. Set to `false` to disable
|
|
||||||
markComment: >
|
|
||||||
This issue has been automatically marked as stale because it has not had
|
|
||||||
recent activity. It will be closed if no further activity occurs. Thank you
|
|
||||||
for your contributions.
|
|
||||||
# Comment to post when closing a stale issue. Set to `false` to disable
|
|
||||||
closeComment: false
|
|
||||||
27
.github/workflows/publish.yml
vendored
27
.github/workflows/publish.yml
vendored
@@ -1,27 +0,0 @@
|
|||||||
name: Publish
|
|
||||||
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
branches:
|
|
||||||
- master
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
publish-npm:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v1
|
|
||||||
- uses: actions/setup-node@v1
|
|
||||||
with:
|
|
||||||
node-version: 12
|
|
||||||
registry-url: https://registry.npmjs.org/
|
|
||||||
- name: Install dependencies
|
|
||||||
run: npm ci
|
|
||||||
- name: Publish
|
|
||||||
run: |
|
|
||||||
VERSION=$(node tasks/next-dev-version.js)
|
|
||||||
npm --no-git-tag-version version ${VERSION}
|
|
||||||
npm run build-package
|
|
||||||
cd build/ol
|
|
||||||
npm publish --tag dev
|
|
||||||
env:
|
|
||||||
NODE_AUTH_TOKEN: ${{secrets.npm_token}}
|
|
||||||
@@ -42,7 +42,7 @@ Your pull request must:
|
|||||||
|
|
||||||
* Follow OpenLayers's coding style.
|
* Follow OpenLayers's coding style.
|
||||||
|
|
||||||
* Pass the integration tests run automatically by the CircleCI Continuous
|
* Pass the integration tests run automatically by the Travis Continuous
|
||||||
Integration system.
|
Integration system.
|
||||||
|
|
||||||
* Address a single issue or add a single item of functionality.
|
* Address a single issue or add a single item of functionality.
|
||||||
|
|||||||
@@ -5,9 +5,9 @@
|
|||||||
You will obviously start by
|
You will obviously start by
|
||||||
[forking](https://github.com/openlayers/openlayers/fork) the OpenLayers repository.
|
[forking](https://github.com/openlayers/openlayers/fork) the OpenLayers repository.
|
||||||
|
|
||||||
### CircleCI
|
### Travis CI
|
||||||
|
|
||||||
The CircleCI hook is enabled on the Github repository. This means every pull request
|
The Travis CI hook is enabled on the Github repository. This means every pull request
|
||||||
is run through a full test suite to ensure it compiles and passes the tests. Failing
|
is run through a full test suite to ensure it compiles and passes the tests. Failing
|
||||||
pull requests will not be merged.
|
pull requests will not be merged.
|
||||||
|
|
||||||
|
|||||||
39
LICENSE.md
39
LICENSE.md
@@ -1,25 +1,26 @@
|
|||||||
BSD 2-Clause License
|
Copyright 2005-present OpenLayers Contributors. All rights reserved.
|
||||||
|
|
||||||
Copyright 2005-present, OpenLayers Contributors
|
Redistribution and use in source and binary forms, with or without modification,
|
||||||
All rights reserved.
|
are permitted provided that the following conditions are met:
|
||||||
|
|
||||||
Redistribution and use in source and binary forms, with or without
|
|
||||||
modification, are permitted provided that the following conditions are met:
|
|
||||||
|
|
||||||
1. Redistributions of source code must retain the above copyright notice, this
|
1. Redistributions of source code must retain the above copyright notice, this
|
||||||
list of conditions and the following disclaimer.
|
list of conditions and the following disclaimer.
|
||||||
|
|
||||||
2. Redistributions in binary form must reproduce the above copyright notice,
|
2. Redistributions in binary form must reproduce the above copyright notice,
|
||||||
this list of conditions and the following disclaimer in the documentation
|
this list of conditions and the following disclaimer in the documentation and/or
|
||||||
and/or other materials provided with the distribution.
|
other materials provided with the distribution.
|
||||||
|
|
||||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
THIS SOFTWARE IS PROVIDED BY OPENLAYERS CONTRIBUTORS ``AS IS'' AND ANY EXPRESS
|
||||||
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
|
||||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
SHALL COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||||
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||||
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||||
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
|
||||||
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
The views and conclusions contained in the software and documentation are those
|
||||||
|
of the authors and should not be interpreted as representing official policies,
|
||||||
|
either expressed or implied, of OpenLayers Contributors.
|
||||||
|
|||||||
13
Makefile
Normal file
13
Makefile
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
SRC_GLSL := $(shell find src -type f -name '*.glsl')
|
||||||
|
SRC_SHADER_JS := $(patsubst %shader.glsl,%shader.js,$(SRC_GLSL))
|
||||||
|
SRC_SHADERLOCATIONS_JS := $(patsubst %shader.glsl,%shader/Locations.js,$(SRC_GLSL))
|
||||||
|
|
||||||
|
.PHONY: shaders
|
||||||
|
shaders: $(SRC_SHADER_JS) $(SRC_SHADERLOCATIONS_JS)
|
||||||
|
|
||||||
|
%shader.js: %shader.glsl src/ol/webgl/shader.mustache tasks/glslunit.js
|
||||||
|
@node tasks/glslunit.js --input $< | ./node_modules/.bin/mustache - src/ol/webgl/shader.mustache > $@
|
||||||
|
|
||||||
|
%shader/Locations.js: %shader.glsl src/ol/webgl/shaderlocations.mustache tasks/glslunit.js
|
||||||
|
@mkdir -p $(@D)
|
||||||
|
@node tasks/glslunit.js --input $< | ./node_modules/.bin/mustache - src/ol/webgl/shaderlocations.mustache > $@
|
||||||
28
README.md
28
README.md
@@ -1,6 +1,6 @@
|
|||||||
# OpenLayers
|
# OpenLayers
|
||||||
|
|
||||||
[OpenLayers](https://openlayers.org/) is a high-performance, feature-packed library for creating interactive maps on the web. It can display map tiles, vector data and markers loaded from any source on any web page. OpenLayers has been developed to further the use of geographic information of all kinds. It is completely free, Open Source JavaScript, released under the [BSD 2-Clause License](https://opensource.org/licenses/BSD-2-Clause).
|
[OpenLayers](https://openlayers.org/) is a high-performance, feature-packed library for creating interactive maps on the web. It can display map tiles, vector data and markers loaded from any source on any web page. 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).
|
||||||
|
|
||||||
## Getting Started
|
## Getting Started
|
||||||
|
|
||||||
@@ -41,30 +41,6 @@ See the following examples for more detail on bundling OpenLayers with your appl
|
|||||||
* Using [Parcel](https://github.com/openlayers/ol-parcel)
|
* Using [Parcel](https://github.com/openlayers/ol-parcel)
|
||||||
* Using [Browserify](https://github.com/openlayers/ol-browserify)
|
* Using [Browserify](https://github.com/openlayers/ol-browserify)
|
||||||
|
|
||||||
## IntelliSense support and type checking for VS Code
|
|
||||||
|
|
||||||
The `ol` package contains a `src/` folder with JSDoc annotated sources. TypeScript can get type definitions from these sources with a `jsconfig.json` config file in the project root:
|
|
||||||
```js
|
|
||||||
{
|
|
||||||
"compilerOptions": {
|
|
||||||
"checkJs": true,
|
|
||||||
// Point to the JSDoc typed sources when using modules from the ol package
|
|
||||||
"baseUrl": "./",
|
|
||||||
"paths": {
|
|
||||||
"ol": ["node_modules/ol/src"],
|
|
||||||
"ol/*": ["node_modules/ol/src/*"]
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"include": [
|
|
||||||
"**/*.js",
|
|
||||||
"node_modules/ol/**/*.js"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
```
|
|
||||||
Project template with this configuration: https://gist.github.com/9a7253cb4712e8bf38d75d8ac898e36c.
|
|
||||||
|
|
||||||
Note that the above only works when authoring in plain JavaScript. For similar configurations with a `tsconfig.json` in TypeScript projects, your mileage may vary.
|
|
||||||
|
|
||||||
## Supported Browsers
|
## Supported Browsers
|
||||||
|
|
||||||
OpenLayers runs on all modern browsers that support [HTML5](https://html.spec.whatwg.org/multipage/) and [ECMAScript 5](http://www.ecma-international.org/ecma-262/5.1/). This includes Chrome, Firefox, Safari and Edge. For older browsers and platforms like Internet Explorer (down to version 9) and Android 4.x, [polyfills](http://polyfill.io) for `requestAnimationFrame` and `Element.prototype.classList` are required, and using the KML format requires a polyfill for `URL`.
|
OpenLayers runs on all modern browsers that support [HTML5](https://html.spec.whatwg.org/multipage/) and [ECMAScript 5](http://www.ecma-international.org/ecma-262/5.1/). This includes Chrome, Firefox, Safari and Edge. For older browsers and platforms like Internet Explorer (down to version 9) and Android 4.x, [polyfills](http://polyfill.io) for `requestAnimationFrame` and `Element.prototype.classList` are required, and using the KML format requires a polyfill for `URL`.
|
||||||
@@ -86,4 +62,4 @@ Please see our guide on [contributing](CONTRIBUTING.md) if you're interested in
|
|||||||
- Need help? Find it on [Stack Overflow using the tag 'openlayers'](http://stackoverflow.com/questions/tagged/openlayers)
|
- Need help? Find it on [Stack Overflow using the tag 'openlayers'](http://stackoverflow.com/questions/tagged/openlayers)
|
||||||
- Follow [@openlayers](https://twitter.com/openlayers) on Twitter
|
- Follow [@openlayers](https://twitter.com/openlayers) on Twitter
|
||||||
|
|
||||||
[](https://circleci.com/gh/openlayers/openlayers/tree/master)
|
[](https://travis-ci.org/openlayers/openlayers)
|
||||||
|
|||||||
@@ -1,298 +1,6 @@
|
|||||||
## Upgrade notes
|
## Upgrade notes
|
||||||
|
|
||||||
### v6.0.0
|
### Next version
|
||||||
|
|
||||||
#### Backwards incompatible changes
|
|
||||||
|
|
||||||
##### Usage of `map.forEachLayerAtPixel`
|
|
||||||
|
|
||||||
Due to performance considerations, the layers in a map will sometimes be rendered into one
|
|
||||||
single canvas instead of separate elements.
|
|
||||||
This means `map.forEachLayerAtPixel` will bring up false positives.
|
|
||||||
|
|
||||||
The easiest solution to avoid that is to assign different `className` properties to each layer like so:
|
|
||||||
```js
|
|
||||||
new Layer({
|
|
||||||
// ...
|
|
||||||
className: 'my-layer'
|
|
||||||
})
|
|
||||||
```
|
|
||||||
|
|
||||||
Please note that this may incur a significant performance loss when dealing with many layers and/or
|
|
||||||
targetting mobile devices.
|
|
||||||
|
|
||||||
##### Removal of `TOUCH` constant from `ol/has`
|
|
||||||
|
|
||||||
If you were previously using this constant, you can check if `'ontouchstart'` is defined in `window` instead.
|
|
||||||
|
|
||||||
```js
|
|
||||||
if ('ontouchstart' in window) {
|
|
||||||
// ...
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
##### Removal of `GEOLOCATION` constant from `ol/has`
|
|
||||||
|
|
||||||
If you were previously using this constant, you can check if `'geolocation'` is defined in `navigator` instead.
|
|
||||||
|
|
||||||
```js
|
|
||||||
if ('geolocation' in navigator) {
|
|
||||||
// ...
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
##### Removal of CSS print rules
|
|
||||||
|
|
||||||
The CSS media print rules were removed from the `ol.css` file. To get the previous behavior, use the following CSS:
|
|
||||||
|
|
||||||
```css
|
|
||||||
@media print {
|
|
||||||
.ol-control {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
##### Removal of optional this arguments
|
|
||||||
|
|
||||||
The optional this (i.e. opt_this) arguments were removed from the following methods.
|
|
||||||
Please use closures, the es6 arrow function or the bind method to achieve this effect (Bind is explained here:
|
|
||||||
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/bind).
|
|
||||||
|
|
||||||
* `forEachCorner` in `ol/extent`
|
|
||||||
* `LRUCache#forEach`
|
|
||||||
* `RBush#forEach` and `RBush#forEachInExtent`
|
|
||||||
|
|
||||||
##### The `setCenter`, `setZoom`, `setResolution` and `setRotation` methods on `ol/View` do not bypass constraints anymore
|
|
||||||
|
|
||||||
Previously, these methods allowed setting values that were inconsistent with the given view constraints.
|
|
||||||
This is no longer the case and all changes to the view state now follow the same logic:
|
|
||||||
target values are provided and constraints are applied on these to determine the actual values to be used.
|
|
||||||
|
|
||||||
##### Removal of the `constrainResolution` option on `View.fit`, `PinchZoom`, `MouseWheelZoom` and `ol/interaction.js`
|
|
||||||
|
|
||||||
The `constrainResolution` option is now only supported by the `View` class. A `View.setConstrainResolution` method was added as well.
|
|
||||||
|
|
||||||
Generally, the responsibility of applying center/rotation/resolutions constraints was moved from interactions and controls to the `View` class.
|
|
||||||
|
|
||||||
##### The view `extent` option now applies to the whole viewport
|
|
||||||
|
|
||||||
Previously, this options only constrained the view *center*. This behaviour can still be obtained by specifying `constrainCenterOnly` in the view options.
|
|
||||||
|
|
||||||
As a side effect, the view `rotate` method is gone and has been replaced with `adjustRotation` which takes a delta as input.
|
|
||||||
|
|
||||||
##### The view is constrained so only one world is visible
|
|
||||||
|
|
||||||
Previously, maps showed multiple worlds at low zoom levels. In addition, it used to be possible to pan off the north or south edge of the world. Now, the view is restricted to show only one world, and you cannot pan off the edge. To get the previous behavior, configure the `ol/View` with `multiWorld: true`.
|
|
||||||
|
|
||||||
##### Removal of deprecated methods
|
|
||||||
|
|
||||||
The `inherits` function that was used to inherit the prototype methods from one constructor into another has been removed.
|
|
||||||
The standard ECMAScript classes should be used instead.
|
|
||||||
|
|
||||||
The deprecated `getSnapToPixel` and `setSnapToPixel` functions from the `ImageStyle` class have been removed.
|
|
||||||
|
|
||||||
##### New internal tile coordinates
|
|
||||||
|
|
||||||
Previously, the internal tile coordinates used in the library had an unusual row order – the origin of the tile coordinate system was at the top left as expected, but the rows increased upwards. This meant that all tile coordinates within a tile grid's extent had negative `y` values.
|
|
||||||
|
|
||||||
Now, the internal tile coordinates used in the library have the same row order as standard (e.g. XYZ) tile coordinates. The origin is at the top left (as before), and rows or `y` values increase downward. So the top left tile of a tile grid is now `0, 0`, whereas it was `0, -1` before.
|
|
||||||
|
|
||||||
```
|
|
||||||
x, y values for tile coordinates
|
|
||||||
|
|
||||||
origin
|
|
||||||
*__________________________
|
|
||||||
| | | |
|
|
||||||
| 0, 0 | 1, 0 | 2, 0 |
|
|
||||||
|________|________|________|
|
|
||||||
| | | |
|
|
||||||
| 0, 1 | 1, 1 | 2, 1 |
|
|
||||||
|________|________|________|
|
|
||||||
| | | |
|
|
||||||
| 0, 2 | 1, 2 | 2, 2 |
|
|
||||||
|________|________|________|
|
|
||||||
```
|
|
||||||
|
|
||||||
This change should only affect you if you were using a custom `tileLoadFunction` or `tileUrlFunction`. For example, if you used to have a `tileUrlFunction` that looked like this:
|
|
||||||
|
|
||||||
```js
|
|
||||||
// before
|
|
||||||
function tileUrlFunction(tileCoord) {
|
|
||||||
const z = tileCoord[0];
|
|
||||||
const x = tileCoord[1];
|
|
||||||
const y = -tileCoord[2] - 1;
|
|
||||||
// do something with z, x, y
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
You would now do something like this:
|
|
||||||
```js
|
|
||||||
// after
|
|
||||||
function tileUrlFunction(tileCoord) {
|
|
||||||
const z = tileCoord[0];
|
|
||||||
const x = tileCoord[1];
|
|
||||||
const y = tileCoord[2];
|
|
||||||
// do something with z, x, y
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
In addition (this should be exceedingly rare), if you previously created a `ol/tilegrid/WMTS` by hand and you were providing an array of `sizes`, you no longer have to provide a negative height if your tile origin is the top-left corner (the common case). On the other hand, if you are providing a custom array of `sizes` and your origin is the bottom of the grid (this is uncommon), your height values must now be negative.
|
|
||||||
|
|
||||||
##### Removal of the "vector" render mode for vector tile layers
|
|
||||||
|
|
||||||
If you were previously using `VectorTile` layers with `renderMode: 'vector'`, you have to remove this configuration option. That mode was removed. `'hybrid'` (default) and `'image'` are still available.
|
|
||||||
|
|
||||||
##### Removal of the "renderMode" option for vector layers
|
|
||||||
|
|
||||||
If you were previously using `Vector` layers with `renderMode: 'image'`, you have to remove this configuration option. Instead, use the new `ol/layer/VectorImage` layer with your `ol/source/Vector`.
|
|
||||||
|
|
||||||
##### New declutter behavior
|
|
||||||
|
|
||||||
If a map has more than one layer with `declutter` set to true, decluttering now considers all `Vector` and `VectorTile` layers, instead of decluttering each layer separately. Only `VectorImage` layers continue to be decluttered separately. The higher the z-index of a layer, the higher the priority of its decluttered items.
|
|
||||||
|
|
||||||
Within a layer, the declutter order has changed. Previously, styles with a lower `zIndex` were prioritized over those with a higher `zIndex`. Now the opposite order is used.
|
|
||||||
|
|
||||||
On vector layers, even if decluttered images or texts have a lower z-Index than polygons or lines, they will now be rendered on top of the polygons or lines. For vector tile layers, this was the case already in previous releases.
|
|
||||||
|
|
||||||
##### New `prerender` and `postrender` layer events replace old `precompose`, `render` and `postcompose` events
|
|
||||||
|
|
||||||
If you were previously registering for `precompose` and `postcompose` events, you should now register for `prerender` and `postrender` events on layers. Instead of the previous `render` event, you should now listen for `postrender`. Layers are no longer composed to a single Canvas element. Instead, they are added to the map viewport as individual elements.
|
|
||||||
|
|
||||||
##### New `getVectorContext` function provides access to the immediate vector rendering API
|
|
||||||
|
|
||||||
Previously, render events included a `vectorContext` property that allowed you to render features or geometries directly to the map. This is still possible, but you now have to explicitly create a vector context with the `getVectorContext` function. This change makes the immediate rendering API an explicit dependency if your application uses it. If you don't use this API, your application bundle will not include the vector rendering modules (as it did before).
|
|
||||||
|
|
||||||
Here is an abbreviated example of how to use the `getVectorContext` function:
|
|
||||||
|
|
||||||
```js
|
|
||||||
import {getVectorContext} from 'ol/render';
|
|
||||||
|
|
||||||
// construct your map and layers as usual
|
|
||||||
|
|
||||||
layer.on('postrender', function(event) {
|
|
||||||
const vectorContext = getVectorContext(event);
|
|
||||||
// use any of the drawing methods on the vector context
|
|
||||||
});
|
|
||||||
```
|
|
||||||
|
|
||||||
##### Layers can only be added to a single map
|
|
||||||
|
|
||||||
Previously, it was possible to render a single layer in two maps. Now, each layer can only belong to a single map (in the same way that a single DOM element can only have one parent).
|
|
||||||
|
|
||||||
##### The `OverviewMap` requires a list of layers.
|
|
||||||
|
|
||||||
Due to the constraint above (layers can only be added to a single map), the overview map needs to be constructed with a list of layers.
|
|
||||||
|
|
||||||
##### The `ol/Graticule` has been replaced by `ol/layer/Graticule`
|
|
||||||
|
|
||||||
Previously, a graticule was not a layer. Now it is. See the graticule example for details on how to add a graticule layer to your map.
|
|
||||||
|
|
||||||
##### `ol/format/Feature` API change
|
|
||||||
|
|
||||||
The `getLastExtent()` method, which was required for custom `tileLoadFunction`s in `ol/source/Vector`, has been removed because it is no longer needed (see below).
|
|
||||||
|
|
||||||
##### `ol/VectorTile` API changes
|
|
||||||
|
|
||||||
* Removal of the `getProjection()` and `setProjection()` methods. These were used in custom `tileLoadFunction`s on `ol/source/VectorTile`, which work differently now (see below).
|
|
||||||
* Removal of the `getExtent()` and `setExtent()` methods. These were used in custom `tileLoadFunction`s on `ol/source/VectorTile`, which work differently now (see below).
|
|
||||||
|
|
||||||
##### Custom tileLoadFunction on a VectorTile source needs changes
|
|
||||||
|
|
||||||
Previously, applications needed to call `setProjection()` and `setExtent()` on the tile in a custom `tileLoadFunction` on `ol/source/VectorTile`. The format's `getLastExtent()` method was used to get the extent. All this is no longer needed. Instead, the `extent` (first argument to the loader function) and `projection` (third argument to the loader function) are simply passed as `extent` and `featureProjection` options to the format's `readFeatures()` method.
|
|
||||||
|
|
||||||
Example for an old `tileLoadFunction`:
|
|
||||||
|
|
||||||
```js
|
|
||||||
function(tile, url) {
|
|
||||||
tile.setLoader(function() {
|
|
||||||
fetch(url).then(function(response) {
|
|
||||||
response.arrayBuffer().then(function(data) {
|
|
||||||
var format = tile.getFormat();
|
|
||||||
tile.setProjection(format.readProjection(data));
|
|
||||||
tile.setFeatures(format.readFeatures(data, {
|
|
||||||
// featureProjection is not required for ol/format/MVT
|
|
||||||
featureProjection: map.getView().getProjection()
|
|
||||||
}));
|
|
||||||
tile.setExtent(format.getLastExtent());
|
|
||||||
})
|
|
||||||
})
|
|
||||||
}
|
|
||||||
});
|
|
||||||
```
|
|
||||||
|
|
||||||
This function needs to be changed to:
|
|
||||||
|
|
||||||
```js
|
|
||||||
function(tile, url) {
|
|
||||||
tile.setLoader(function(extent, resolution, projection) {
|
|
||||||
fetch(url).then(function(response) {
|
|
||||||
response.arrayBuffer().then(function(data) {
|
|
||||||
var format = tile.getFormat();
|
|
||||||
tile.setFeatures(format.readFeatures(data, {
|
|
||||||
// extent is only required for ol/format/MVT
|
|
||||||
extent: extent,
|
|
||||||
featureProjection: projection
|
|
||||||
}));
|
|
||||||
})
|
|
||||||
})
|
|
||||||
}
|
|
||||||
});
|
|
||||||
```
|
|
||||||
|
|
||||||
##### Drop of support for the experimental WebGL renderer
|
|
||||||
|
|
||||||
The WebGL map and layers renderers are gone, replaced by a `WebGLHelper` function that provides a lightweight,
|
|
||||||
low-level access to the WebGL API. This is implemented in a new `WebGLPointsLayer` which does simple rendering of large number
|
|
||||||
of points with custom shaders.
|
|
||||||
|
|
||||||
This is now used in the `Heatmap` layer.
|
|
||||||
|
|
||||||
The removed classes and components are:
|
|
||||||
* `WebGLMap` and `WebGLMapRenderer`
|
|
||||||
* `WebGLLayerRenderer`
|
|
||||||
* `WebGLImageLayer` and `WebGLImageLayerRenderer`
|
|
||||||
* `WebGLTileLayer` and `WebGLTileLayerRenderer`
|
|
||||||
* `WebGLVectorLayer` and `WebGLVectorLayerRenderer`
|
|
||||||
* `WebGLReplay` and derived classes, along with associated shaders
|
|
||||||
* `WebGLReplayGroup`
|
|
||||||
* `WebGLImmediateRenderer`
|
|
||||||
* `WebGLMap`
|
|
||||||
* The shader build process using `mustache` and the `Makefile` at the root
|
|
||||||
|
|
||||||
##### Removal of the AtlasManager
|
|
||||||
|
|
||||||
Following the removal of the experimental WebGL renderer, the AtlasManager has been removed as well. The atlas was only used by this renderer.
|
|
||||||
The non API `getChecksum` functions of the style is also removed.
|
|
||||||
|
|
||||||
##### Change of the behavior of the vector source's clear() and refresh() methods
|
|
||||||
|
|
||||||
The `ol/source/Vector#clear()` method no longer triggers a reload of the data from the server. If you were previously using `clear()` to refetch from the server, you now have to use `refresh()`.
|
|
||||||
|
|
||||||
The `ol/source/Vector#refresh()` method now removes all features from the source and triggers a reload of the data from the server. If you were previously using the `refresh()` method to re-render a vector layer, you should instead call `ol/layer/Vector#changed()`.
|
|
||||||
|
|
||||||
##### Renaming of `getGetFeatureInfoUrl` to `getFeatureInfoUrl`
|
|
||||||
|
|
||||||
The `getGetFeatureInfoUrl` of `ol/source/ImageWMS` and `ol/source/TileWMS` is now called `getFeatureInfoUrl`.
|
|
||||||
|
|
||||||
##### `getFeaturesAtPixel` always returns an array
|
|
||||||
|
|
||||||
`getFeaturesAtPixel` now returns an empty array instead of null if no features were found.
|
|
||||||
|
|
||||||
##### Hit detection with unfilled styles
|
|
||||||
|
|
||||||
Hit detection over styled Circle geometry and Circle and RegularShape styles is now consistent with that for styled Polygon geometry. There is no hit detection over the interior of unfilled shapes. To get the previous behavior, specify a Fill style with transparent color.
|
|
||||||
|
|
||||||
#### Other changes
|
|
||||||
|
|
||||||
##### Allow declutter in image render mode
|
|
||||||
|
|
||||||
It is now possible to configure vector tile layers with `declutter: true` and `renderMode: 'image'`. However, note that decluttering will be done per tile, resulting in labels and point symbols getting cut off at tile boundaries.
|
|
||||||
Until now, using both options forced the render mode to be `hybrid`.
|
|
||||||
|
|
||||||
##### Always load tiles while animating or interacting
|
|
||||||
|
|
||||||
`ol/PluggableMap` and subclasses no longer support the `loadTilesWhileAnimating` and `loadTilesWhileInteracting` options. These options were used to enable tile loading during animations and interactions. With the new DOM composition render strategy, it is no longer necessary to postpone tile loading until after animations or interactions.
|
|
||||||
|
|
||||||
### v5.3.0
|
### v5.3.0
|
||||||
|
|
||||||
|
|||||||
6
changelog/v5.3.1.md
Normal file
6
changelog/v5.3.1.md
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
# 5.3.1
|
||||||
|
|
||||||
|
The 5.3.1 release is a patch that addresses an issue when using `angular-cli` to build an OpenLayers-based application.
|
||||||
|
|
||||||
|
* [#9253](https://github.com/openlayers/openlayers/pull/9253) - Add proj.js to the sideEffects list ([@romanzoller](https://github.com/romanzoller))
|
||||||
|
|
||||||
@@ -1,857 +0,0 @@
|
|||||||
# 6.0.0
|
|
||||||
|
|
||||||
Wow. The 6.0 release includes changes from 1780 commits in 544 pull requests since the 5.3 release. Thanks to all who contributed to this effort.
|
|
||||||
|
|
||||||
A major feature in this release is the ability to compose layers with different renderer types. Previously, the map used a single rendering strategy, and all layers in your map had to implement that strategy. Now it is possible to have a map with layers that use different rendering technologies. This makes it possible, for example, to have Canvas (2D) layer composed together with a WebGL based layer in the same map. It is also possible to create layers with custom renderers. So you could have a map that uses another library (like d3) to render one layer and use OpenLayers to render the other layers. We will continue to take advantage of this new flexibility in future releases.
|
|
||||||
|
|
||||||
In addition, the 6.0 release includes a number of vector tile rendering improvements, and should have a lower memory footprint overall. The release also includes a number of experimental features that are not yet part of the stable API. Take a look through the examples for a new WebGL based renderer and the experimental `useGeographic()` function. Watch upcoming releases for more detail on these.
|
|
||||||
|
|
||||||
This release includes a number of backwards incompatible changes. Take a careful look at the notes below when upgrading your application from the 5.3 release.
|
|
||||||
|
|
||||||
#### Backwards incompatible changes
|
|
||||||
|
|
||||||
##### Usage of `map.forEachLayerAtPixel`
|
|
||||||
|
|
||||||
Due to performance considerations, the layers in a map will sometimes be rendered into one
|
|
||||||
single canvas instead of separate elements.
|
|
||||||
This means `map.forEachLayerAtPixel` will bring up false positives.
|
|
||||||
|
|
||||||
The easiest solution to avoid that is to assign different `className` properties to each layer like so:
|
|
||||||
```js
|
|
||||||
new Layer({
|
|
||||||
// ...
|
|
||||||
className: 'my-layer'
|
|
||||||
})
|
|
||||||
```
|
|
||||||
|
|
||||||
Please note that this may incur a significant performance loss when dealing with many layers and/or
|
|
||||||
targetting mobile devices.
|
|
||||||
|
|
||||||
##### Removal of `TOUCH` constant from `ol/has`
|
|
||||||
|
|
||||||
If you were previously using this constant, you can check if `'ontouchstart'` is defined in `window` instead.
|
|
||||||
|
|
||||||
```js
|
|
||||||
if ('ontouchstart' in window) {
|
|
||||||
// ...
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
##### Removal of `GEOLOCATION` constant from `ol/has`
|
|
||||||
|
|
||||||
If you were previously using this constant, you can check if `'geolocation'` is defined in `navigator` instead.
|
|
||||||
|
|
||||||
```js
|
|
||||||
if ('geolocation' in navigator) {
|
|
||||||
// ...
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
##### Removal of CSS print rules
|
|
||||||
|
|
||||||
The CSS media print rules were removed from the `ol.css` file. To get the previous behavior, use the following CSS:
|
|
||||||
|
|
||||||
```css
|
|
||||||
@media print {
|
|
||||||
.ol-control {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
##### Removal of optional this arguments
|
|
||||||
|
|
||||||
The optional this (i.e. opt_this) arguments were removed from the following methods.
|
|
||||||
Please use closures, the es6 arrow function or the bind method to achieve this effect (Bind is explained here:
|
|
||||||
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/bind).
|
|
||||||
|
|
||||||
* `forEachCorner` in `ol/extent`
|
|
||||||
* `LRUCache#forEach`
|
|
||||||
* `RBush#forEach` and `RBush#forEachInExtent`
|
|
||||||
|
|
||||||
##### The `setCenter`, `setZoom`, `setResolution` and `setRotation` methods on `ol/View` do not bypass constraints anymore
|
|
||||||
|
|
||||||
Previously, these methods allowed setting values that were inconsistent with the given view constraints.
|
|
||||||
This is no longer the case and all changes to the view state now follow the same logic:
|
|
||||||
target values are provided and constraints are applied on these to determine the actual values to be used.
|
|
||||||
|
|
||||||
##### Removal of the `constrainResolution` option on `View.fit`, `PinchZoom`, `MouseWheelZoom` and `ol/interaction.js`
|
|
||||||
|
|
||||||
The `constrainResolution` option is now only supported by the `View` class. A `View.setConstrainResolution` method was added as well.
|
|
||||||
|
|
||||||
Generally, the responsibility of applying center/rotation/resolutions constraints was moved from interactions and controls to the `View` class.
|
|
||||||
|
|
||||||
##### The view `extent` option now applies to the whole viewport
|
|
||||||
|
|
||||||
Previously, this options only constrained the view *center*. This behaviour can still be obtained by specifying `constrainCenterOnly` in the view options.
|
|
||||||
|
|
||||||
As a side effect, the view `rotate` method is gone and has been replaced with `adjustRotation` which takes a delta as input.
|
|
||||||
|
|
||||||
##### The view is constrained so only one world is visible
|
|
||||||
|
|
||||||
Previously, maps showed multiple worlds at low zoom levels. In addition, it used to be possible to pan off the north or south edge of the world. Now, the view is restricted to show only one world, and you cannot pan off the edge. To get the previous behavior, configure the `ol/View` with `multiWorld: true`.
|
|
||||||
|
|
||||||
##### Removal of deprecated methods
|
|
||||||
|
|
||||||
The `inherits` function that was used to inherit the prototype methods from one constructor into another has been removed.
|
|
||||||
The standard ECMAScript classes should be used instead.
|
|
||||||
|
|
||||||
The deprecated `getSnapToPixel` and `setSnapToPixel` functions from the `ImageStyle` class have been removed.
|
|
||||||
|
|
||||||
##### New internal tile coordinates
|
|
||||||
|
|
||||||
Previously, the internal tile coordinates used in the library had an unusual row order – the origin of the tile coordinate system was at the top left as expected, but the rows increased upwards. This meant that all tile coordinates within a tile grid's extent had negative `y` values.
|
|
||||||
|
|
||||||
Now, the internal tile coordinates used in the library have the same row order as standard (e.g. XYZ) tile coordinates. The origin is at the top left (as before), and rows or `y` values increase downward. So the top left tile of a tile grid is now `0, 0`, whereas it was `0, -1` before.
|
|
||||||
|
|
||||||
```
|
|
||||||
x, y values for tile coordinates
|
|
||||||
|
|
||||||
origin
|
|
||||||
*__________________________
|
|
||||||
| | | |
|
|
||||||
| 0, 0 | 1, 0 | 2, 0 |
|
|
||||||
|________|________|________|
|
|
||||||
| | | |
|
|
||||||
| 0, 1 | 1, 1 | 2, 1 |
|
|
||||||
|________|________|________|
|
|
||||||
| | | |
|
|
||||||
| 0, 2 | 1, 2 | 2, 2 |
|
|
||||||
|________|________|________|
|
|
||||||
```
|
|
||||||
|
|
||||||
This change should only affect you if you were using a custom `tileLoadFunction` or `tileUrlFunction`. For example, if you used to have a `tileUrlFunction` that looked like this:
|
|
||||||
|
|
||||||
```js
|
|
||||||
// before
|
|
||||||
function tileUrlFunction(tileCoord) {
|
|
||||||
const z = tileCoord[0];
|
|
||||||
const x = tileCoord[1];
|
|
||||||
const y = -tileCoord[2] - 1;
|
|
||||||
// do something with z, x, y
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
You would now do something like this:
|
|
||||||
```js
|
|
||||||
// after
|
|
||||||
function tileUrlFunction(tileCoord) {
|
|
||||||
const z = tileCoord[0];
|
|
||||||
const x = tileCoord[1];
|
|
||||||
const y = tileCoord[2];
|
|
||||||
// do something with z, x, y
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
In addition (this should be exceedingly rare), if you previously created a `ol/tilegrid/WMTS` by hand and you were providing an array of `sizes`, you no longer have to provide a negative height if your tile origin is the top-left corner (the common case). On the other hand, if you are providing a custom array of `sizes` and your origin is the bottom of the grid (this is uncommon), your height values must now be negative.
|
|
||||||
|
|
||||||
##### Removal of the "vector" render mode for vector tile layers
|
|
||||||
|
|
||||||
If you were previously using `VectorTile` layers with `renderMode: 'vector'`, you have to remove this configuration option. That mode was removed. `'hybrid'` (default) and `'image'` are still available.
|
|
||||||
|
|
||||||
##### Removal of the "renderMode" option for vector layers
|
|
||||||
|
|
||||||
If you were previously using `Vector` layers with `renderMode: 'image'`, you have to remove this configuration option. Instead, use the new `ol/layer/VectorImage` layer with your `ol/source/Vector`.
|
|
||||||
|
|
||||||
##### New declutter behavior
|
|
||||||
|
|
||||||
If a map has more than one layer with `declutter` set to true, decluttering now considers all `Vector` and `VectorTile` layers, instead of decluttering each layer separately. Only `VectorImage` layers continue to be decluttered separately. The higher the z-index of a layer, the higher the priority of its decluttered items.
|
|
||||||
|
|
||||||
Within a layer, the declutter order has changed. Previously, styles with a lower `zIndex` were prioritized over those with a higher `zIndex`. Now the opposite order is used.
|
|
||||||
|
|
||||||
On vector layers, even if decluttered images or texts have a lower z-Index than polygons or lines, they will now be rendered on top of the polygons or lines. For vector tile layers, this was the case already in previous releases.
|
|
||||||
|
|
||||||
##### New `prerender` and `postrender` layer events replace old `precompose`, `render` and `postcompose` events
|
|
||||||
|
|
||||||
If you were previously registering for `precompose` and `postcompose` events, you should now register for `prerender` and `postrender` events on layers. Instead of the previous `render` event, you should now listen for `postrender`. Layers are no longer composed to a single Canvas element. Instead, they are added to the map viewport as individual elements.
|
|
||||||
|
|
||||||
##### New `getVectorContext` function provides access to the immediate vector rendering API
|
|
||||||
|
|
||||||
Previously, render events included a `vectorContext` property that allowed you to render features or geometries directly to the map. This is still possible, but you now have to explicitly create a vector context with the `getVectorContext` function. This change makes the immediate rendering API an explicit dependency if your application uses it. If you don't use this API, your application bundle will not include the vector rendering modules (as it did before).
|
|
||||||
|
|
||||||
Here is an abbreviated example of how to use the `getVectorContext` function:
|
|
||||||
|
|
||||||
```js
|
|
||||||
import {getVectorContext} from 'ol/render';
|
|
||||||
|
|
||||||
// construct your map and layers as usual
|
|
||||||
|
|
||||||
layer.on('postrender', function(event) {
|
|
||||||
const vectorContext = getVectorContext(event);
|
|
||||||
// use any of the drawing methods on the vector context
|
|
||||||
});
|
|
||||||
```
|
|
||||||
|
|
||||||
##### Layers can only be added to a single map
|
|
||||||
|
|
||||||
Previously, it was possible to render a single layer in two maps. Now, each layer can only belong to a single map (in the same way that a single DOM element can only have one parent).
|
|
||||||
|
|
||||||
##### The `OverviewMap` requires a list of layers.
|
|
||||||
|
|
||||||
Due to the constraint above (layers can only be added to a single map), the overview map needs to be constructed with a list of layers.
|
|
||||||
|
|
||||||
##### The `ol/Graticule` has been replaced by `ol/layer/Graticule`
|
|
||||||
|
|
||||||
Previously, a graticule was not a layer. Now it is. See the graticule example for details on how to add a graticule layer to your map.
|
|
||||||
|
|
||||||
##### `ol/format/Feature` API change
|
|
||||||
|
|
||||||
The `getLastExtent()` method, which was required for custom `tileLoadFunction`s in `ol/source/Vector`, has been removed because it is no longer needed (see below).
|
|
||||||
|
|
||||||
##### `ol/VectorTile` API changes
|
|
||||||
|
|
||||||
* Removal of the `getProjection()` and `setProjection()` methods. These were used in custom `tileLoadFunction`s on `ol/source/VectorTile`, which work differently now (see below).
|
|
||||||
* Removal of the `getExtent()` and `setExtent()` methods. These were used in custom `tileLoadFunction`s on `ol/source/VectorTile`, which work differently now (see below).
|
|
||||||
|
|
||||||
##### Custom tileLoadFunction on a VectorTile source needs changes
|
|
||||||
|
|
||||||
Previously, applications needed to call `setProjection()` and `setExtent()` on the tile in a custom `tileLoadFunction` on `ol/source/VectorTile`. The format's `getLastExtent()` method was used to get the extent. All this is no longer needed. Instead, the `extent` (first argument to the loader function) and `projection` (third argument to the loader function) are simply passed as `extent` and `featureProjection` options to the format's `readFeatures()` method.
|
|
||||||
|
|
||||||
Example for an old `tileLoadFunction`:
|
|
||||||
|
|
||||||
```js
|
|
||||||
function(tile, url) {
|
|
||||||
tile.setLoader(function() {
|
|
||||||
fetch(url).then(function(response) {
|
|
||||||
response.arrayBuffer().then(function(data) {
|
|
||||||
var format = tile.getFormat();
|
|
||||||
tile.setProjection(format.readProjection(data));
|
|
||||||
tile.setFeatures(format.readFeatures(data, {
|
|
||||||
// featureProjection is not required for ol/format/MVT
|
|
||||||
featureProjection: map.getView().getProjection()
|
|
||||||
}));
|
|
||||||
tile.setExtent(format.getLastExtent());
|
|
||||||
})
|
|
||||||
})
|
|
||||||
}
|
|
||||||
});
|
|
||||||
```
|
|
||||||
|
|
||||||
This function needs to be changed to:
|
|
||||||
|
|
||||||
```js
|
|
||||||
function(tile, url) {
|
|
||||||
tile.setLoader(function(extent, resolution, projection) {
|
|
||||||
fetch(url).then(function(response) {
|
|
||||||
response.arrayBuffer().then(function(data) {
|
|
||||||
var format = tile.getFormat();
|
|
||||||
tile.setFeatures(format.readFeatures(data, {
|
|
||||||
// extent is only required for ol/format/MVT
|
|
||||||
extent: extent,
|
|
||||||
featureProjection: projection
|
|
||||||
}));
|
|
||||||
})
|
|
||||||
})
|
|
||||||
}
|
|
||||||
});
|
|
||||||
```
|
|
||||||
|
|
||||||
##### Drop of support for the experimental WebGL renderer
|
|
||||||
|
|
||||||
The WebGL map and layers renderers are gone, replaced by a `WebGLHelper` function that provides a lightweight,
|
|
||||||
low-level access to the WebGL API. This is implemented in a new `WebGLPointsLayer` which does simple rendering of large number
|
|
||||||
of points with custom shaders.
|
|
||||||
|
|
||||||
This is now used in the `Heatmap` layer.
|
|
||||||
|
|
||||||
The removed classes and components are:
|
|
||||||
* `WebGLMap` and `WebGLMapRenderer`
|
|
||||||
* `WebGLLayerRenderer`
|
|
||||||
* `WebGLImageLayer` and `WebGLImageLayerRenderer`
|
|
||||||
* `WebGLTileLayer` and `WebGLTileLayerRenderer`
|
|
||||||
* `WebGLVectorLayer` and `WebGLVectorLayerRenderer`
|
|
||||||
* `WebGLReplay` and derived classes, along with associated shaders
|
|
||||||
* `WebGLReplayGroup`
|
|
||||||
* `WebGLImmediateRenderer`
|
|
||||||
* `WebGLMap`
|
|
||||||
* The shader build process using `mustache` and the `Makefile` at the root
|
|
||||||
|
|
||||||
##### Removal of the AtlasManager
|
|
||||||
|
|
||||||
Following the removal of the experimental WebGL renderer, the AtlasManager has been removed as well. The atlas was only used by this renderer.
|
|
||||||
The non API `getChecksum` functions of the style is also removed.
|
|
||||||
|
|
||||||
##### Change of the behavior of the vector source's clear() and refresh() methods
|
|
||||||
|
|
||||||
The `ol/source/Vector#clear()` method no longer triggers a reload of the data from the server. If you were previously using `clear()` to refetch from the server, you now have to use `refresh()`.
|
|
||||||
|
|
||||||
The `ol/source/Vector#refresh()` method now removes all features from the source and triggers a reload of the data from the server. If you were previously using the `refresh()` method to re-render a vector layer, you should instead call `ol/layer/Vector#changed()`.
|
|
||||||
|
|
||||||
##### Renaming of `getGetFeatureInfoUrl` to `getFeatureInfoUrl`
|
|
||||||
|
|
||||||
The `getGetFeatureInfoUrl` of `ol/source/ImageWMS` and `ol/source/TileWMS` is now called `getFeatureInfoUrl`.
|
|
||||||
|
|
||||||
##### `getFeaturesAtPixel` always returns an array
|
|
||||||
|
|
||||||
`getFeaturesAtPixel` now returns an empty array instead of null if no features were found.
|
|
||||||
|
|
||||||
##### Hit detection with unfilled styles
|
|
||||||
|
|
||||||
Hit detection over styled Circle geometry and Circle and RegularShape styles is now consistent with that for styled Polygon geometry. There is no hit detection over the interior of unfilled shapes. To get the previous behavior, specify a Fill style with transparent color.
|
|
||||||
|
|
||||||
#### Other changes
|
|
||||||
|
|
||||||
##### Allow declutter in image render mode
|
|
||||||
|
|
||||||
It is now possible to configure vector tile layers with `declutter: true` and `renderMode: 'image'`. However, note that decluttering will be done per tile, resulting in labels and point symbols getting cut off at tile boundaries.
|
|
||||||
Until now, using both options forced the render mode to be `hybrid`.
|
|
||||||
|
|
||||||
##### Always load tiles while animating or interacting
|
|
||||||
|
|
||||||
`ol/PluggableMap` and subclasses no longer support the `loadTilesWhileAnimating` and `loadTilesWhileInteracting` options. These options were used to enable tile loading during animations and interactions. With the new DOM composition render strategy, it is no longer necessary to postpone tile loading until after animations or interactions.
|
|
||||||
|
|
||||||
## Changes
|
|
||||||
|
|
||||||
* [#10036](https://github.com/openlayers/openlayers/pull/10036) - uploading local resources to codesandbox ([@KlausBenndorf](https://github.com/KlausBenndorf))
|
|
||||||
* [#10035](https://github.com/openlayers/openlayers/pull/10035) - Support building the legacy build on windows ([@tschaub](https://github.com/tschaub))
|
|
||||||
* [#10034](https://github.com/openlayers/openlayers/pull/10034) - Mark experimental examples as experimental ([@openlayers](https://github.com/openlayers))
|
|
||||||
* [#10009](https://github.com/openlayers/openlayers/pull/10009) - Geometry editing with a user projection ([@tschaub](https://github.com/tschaub))
|
|
||||||
* [#10024](https://github.com/openlayers/openlayers/pull/10024) - Allow EventTarget to use a different default target ([@ahocevar](https://github.com/ahocevar))
|
|
||||||
* [#10031](https://github.com/openlayers/openlayers/pull/10031) - Cache starting coordinates and add mapBrowserEvent to translateEvent ([@flexjoly](https://github.com/flexjoly))
|
|
||||||
* [#10029](https://github.com/openlayers/openlayers/pull/10029) - Fix link to map default controls ([@ahocevar](https://github.com/ahocevar))
|
|
||||||
* [#10032](https://github.com/openlayers/openlayers/pull/10032) - Do not remove listeners that do not exist ([@ahocevar](https://github.com/ahocevar))
|
|
||||||
* [#10030](https://github.com/openlayers/openlayers/pull/10030) - Add a rule to disallow describe.only() and it.only() in tests ([@tschaub](https://github.com/tschaub))
|
|
||||||
* [#10023](https://github.com/openlayers/openlayers/pull/10023) - Enhance regular shape example docs ([@marcjansen](https://github.com/marcjansen))
|
|
||||||
* [#10025](https://github.com/openlayers/openlayers/pull/10025) - Bugfix for vector-tile-selection example ([@KaiVolland](https://github.com/KaiVolland))
|
|
||||||
* [#10007](https://github.com/openlayers/openlayers/pull/10007) - Changes for #9395 CircleStyle inconsistency ([@mike-000](https://github.com/mike-000))
|
|
||||||
* [#10027](https://github.com/openlayers/openlayers/pull/10027) - Confirm zoomByDelta calls view.animate() ([@tschaub](https://github.com/tschaub))
|
|
||||||
* [#10016](https://github.com/openlayers/openlayers/pull/10016) - WebGL Points Layer: allow expressions in literal style ([@jahow](https://github.com/jahow))
|
|
||||||
* [#10017](https://github.com/openlayers/openlayers/pull/10017) - updated jsdoc-plugin-typescript ([@KlausBenndorf](https://github.com/KlausBenndorf))
|
|
||||||
* [#10012](https://github.com/openlayers/openlayers/pull/10012) - Use the user projection for the map event coordinate ([@tschaub](https://github.com/tschaub))
|
|
||||||
* [#10018](https://github.com/openlayers/openlayers/pull/10018) - Recover from skip feature removal regressions ([@ahocevar](https://github.com/ahocevar))
|
|
||||||
* [#10013](https://github.com/openlayers/openlayers/pull/10013) - Minor reworking of the modify interaction ([@tschaub](https://github.com/tschaub))
|
|
||||||
* [#10015](https://github.com/openlayers/openlayers/pull/10015) - Fix hit detection test for wrapped geometries ([@jahow](https://github.com/jahow))
|
|
||||||
* [#10011](https://github.com/openlayers/openlayers/pull/10011) - Fix a type checking error on the WebGL points renderer ([@jahow](https://github.com/jahow))
|
|
||||||
* [#10010](https://github.com/openlayers/openlayers/pull/10010) - Require type and listener for addEventListener/removeEventListener ([@ahocevar](https://github.com/ahocevar))
|
|
||||||
* [#9994](https://github.com/openlayers/openlayers/pull/9994) - Add a new layer type: WebGLPointsLayer ([@jahow](https://github.com/jahow))
|
|
||||||
* [#10006](https://github.com/openlayers/openlayers/pull/10006) - Check hits for wrapped around geometries ([@KlausBenndorf](https://github.com/KlausBenndorf))
|
|
||||||
* [#10004](https://github.com/openlayers/openlayers/pull/10004) - Return a new simplified geometry after modification ([@tschaub](https://github.com/tschaub))
|
|
||||||
* [#10005](https://github.com/openlayers/openlayers/pull/10005) - Fix some cosmetics on Select interaction ([@tkohr](https://github.com/tkohr))
|
|
||||||
* [#10003](https://github.com/openlayers/openlayers/pull/10003) - Add back Select interaction without overlay ([@tkohr](https://github.com/tkohr))
|
|
||||||
* [#10000](https://github.com/openlayers/openlayers/pull/10000) - Adopt JSDoc annotations to allow '.d.ts' generation ([@KaiVolland](https://github.com/KaiVolland))
|
|
||||||
* [#10001](https://github.com/openlayers/openlayers/pull/10001) - reduced typecasts in layerrenderer ([@KlausBenndorf](https://github.com/KlausBenndorf))
|
|
||||||
* [#9986](https://github.com/openlayers/openlayers/pull/9986) - Make Circle geometry hit detection consistent with Polygon ([@mike-000](https://github.com/mike-000))
|
|
||||||
* [#9999](https://github.com/openlayers/openlayers/pull/9999) - fixed typescript issues ([@KlausBenndorf](https://github.com/KlausBenndorf))
|
|
||||||
* [#9997](https://github.com/openlayers/openlayers/pull/9997) - Avoid error from tsc ([@tschaub](https://github.com/tschaub))
|
|
||||||
* [#9993](https://github.com/openlayers/openlayers/pull/9993) - Add geographic tests for hasFeatureAtPixel and getFeaturesAtPixel ([@tschaub](https://github.com/tschaub))
|
|
||||||
* [#9992](https://github.com/openlayers/openlayers/pull/9992) - Rendering test instructions ([@tschaub](https://github.com/tschaub))
|
|
||||||
* [#9982](https://github.com/openlayers/openlayers/pull/9982) - Don't use vendor prefixes for the transform property ([@fredj](https://github.com/fredj))
|
|
||||||
* [#9989](https://github.com/openlayers/openlayers/pull/9989) - Correct getFeaturesAtPixel spelling and grammar ([@mike-000](https://github.com/mike-000))
|
|
||||||
* [#9988](https://github.com/openlayers/openlayers/pull/9988) - Additional changes to work with user projection ([@tschaub](https://github.com/tschaub))
|
|
||||||
* [#9973](https://github.com/openlayers/openlayers/pull/9973) - Make map work with user projected coordinates ([@tkohr](https://github.com/tkohr))
|
|
||||||
* [#9981](https://github.com/openlayers/openlayers/pull/9981) - Remove simplified geometry cache ([@KlausBenndorf](https://github.com/KlausBenndorf))
|
|
||||||
* [#9980](https://github.com/openlayers/openlayers/pull/9980) - Get simplified transformed geometry ([@tschaub](https://github.com/tschaub))
|
|
||||||
* [#9984](https://github.com/openlayers/openlayers/pull/9984) - Don't attempt to render when there is no source ([@ahocevar](https://github.com/ahocevar))
|
|
||||||
* [#9983](https://github.com/openlayers/openlayers/pull/9983) - getFeaturesAtPixel always returns array ([@KlausBenndorf](https://github.com/KlausBenndorf))
|
|
||||||
* [#9960](https://github.com/openlayers/openlayers/pull/9960) - Always dispatch pointermove events, but calculate event pixel and coordinate lazily ([@ahocevar](https://github.com/ahocevar))
|
|
||||||
* [#9978](https://github.com/openlayers/openlayers/pull/9978) - Handle empty source tiles and queue them properly ([@ahocevar](https://github.com/ahocevar))
|
|
||||||
* [#9974](https://github.com/openlayers/openlayers/pull/9974) - Introduces the _withCredentials flag ([@KaiVolland](https://github.com/KaiVolland))
|
|
||||||
* [#9966](https://github.com/openlayers/openlayers/pull/9966) - Document how to circumvent the canvas reuse optimization ([@jahow](https://github.com/jahow))
|
|
||||||
* [#9961](https://github.com/openlayers/openlayers/pull/9961) - SelectInteraction removal ([@KlausBenndorf](https://github.com/KlausBenndorf))
|
|
||||||
* [#9957](https://github.com/openlayers/openlayers/pull/9957) - Get hasOverlay from child element count ([@ahocevar](https://github.com/ahocevar))
|
|
||||||
* [#9969](https://github.com/openlayers/openlayers/pull/9969) - Dev version based on time ([@tschaub](https://github.com/tschaub))
|
|
||||||
* [#9965](https://github.com/openlayers/openlayers/pull/9965) - Transform the layer extent when a user projection is set ([@tschaub](https://github.com/tschaub))
|
|
||||||
* [#9967](https://github.com/openlayers/openlayers/pull/9967) - Enable HTTPS on Mapbox tile layer in webgl sprite example ([@jahow](https://github.com/jahow))
|
|
||||||
* [#9964](https://github.com/openlayers/openlayers/pull/9964) - Update various examples to use the Mapbox v4-API ([@marcjansen](https://github.com/marcjansen))
|
|
||||||
* [#9963](https://github.com/openlayers/openlayers/pull/9963) - Update to work with globby@10 ([@tschaub](https://github.com/tschaub))
|
|
||||||
* [#9962](https://github.com/openlayers/openlayers/pull/9962) - Improve the API description for "multiWorld" ([@mike-000](https://github.com/mike-000))
|
|
||||||
* [#9710](https://github.com/openlayers/openlayers/pull/9710) - Additional Typescript compliance fixes ([@jahow](https://github.com/jahow))
|
|
||||||
* [#9400](https://github.com/openlayers/openlayers/pull/9400) - Changes to parsing of KML displayName ([@KaiVolland](https://github.com/KaiVolland))
|
|
||||||
* [#9959](https://github.com/openlayers/openlayers/pull/9959) - Set frame state extent when creating frame state ([@tschaub](https://github.com/tschaub))
|
|
||||||
* [#9899](https://github.com/openlayers/openlayers/pull/9899) - Add hidpi option for ol.source.TileArcGISRest ([@LevN0](https://github.com/LevN0))
|
|
||||||
* [#9723](https://github.com/openlayers/openlayers/pull/9723) - Pass the opt_direction value to the getConstrainedResolution function ([@fredj](https://github.com/fredj))
|
|
||||||
* [#9903](https://github.com/openlayers/openlayers/pull/9903) - Respect multiWorld: false when an explicit extent constraint would be respected ([@mike-000](https://github.com/mike-000))
|
|
||||||
* [#9846](https://github.com/openlayers/openlayers/pull/9846) - Make API work with user projected coordinates ([@tschaub](https://github.com/tschaub))
|
|
||||||
* [#9935](https://github.com/openlayers/openlayers/pull/9935) - Add missing import for LinearRing ([@Abdullah0991](https://github.com/Abdullah0991))
|
|
||||||
* [#9931](https://github.com/openlayers/openlayers/pull/9931) - Custom Overview Map CSS fix and rotateWithView option ([@mike-000](https://github.com/mike-000))
|
|
||||||
* [#9951](https://github.com/openlayers/openlayers/pull/9951) - New test for Image layer with extent and rotation ([@mike-000](https://github.com/mike-000))
|
|
||||||
* [#9831](https://github.com/openlayers/openlayers/pull/9831) - Support a LAYER param in getLegendUrl ([@KlausBenndorf](https://github.com/KlausBenndorf))
|
|
||||||
* [#9942](https://github.com/openlayers/openlayers/pull/9942) - Renaming getGetFeatureInfoUrl ([@KlausBenndorf](https://github.com/KlausBenndorf))
|
|
||||||
* [#9930](https://github.com/openlayers/openlayers/pull/9930) - Correct extent clipping in ImageLayer ([@mike-000](https://github.com/mike-000))
|
|
||||||
* [#9923](https://github.com/openlayers/openlayers/pull/9923) - Cancel postrender before disposing renderer ([@ahocevar](https://github.com/ahocevar))
|
|
||||||
* [#9925](https://github.com/openlayers/openlayers/pull/9925) - Workflow to publish a dev release ([@openlayers](https://github.com/openlayers))
|
|
||||||
* [#9919](https://github.com/openlayers/openlayers/pull/9919) - Revise and correct OverviewMap rotation ([@mike-000](https://github.com/mike-000))
|
|
||||||
* [#9908](https://github.com/openlayers/openlayers/pull/9908) - LineString.forEachSegment callback API description ([@mike-000](https://github.com/mike-000))
|
|
||||||
* [#9909](https://github.com/openlayers/openlayers/pull/9909) - Clone the text's padding ([@oterral](https://github.com/oterral))
|
|
||||||
* [#9907](https://github.com/openlayers/openlayers/pull/9907) - Prevent endless cycles observed in OverviewMap ([@mike-000](https://github.com/mike-000))
|
|
||||||
* [#9897](https://github.com/openlayers/openlayers/pull/9897) - Use pointer events everywhere ([@ahocevar](https://github.com/ahocevar))
|
|
||||||
* [#9888](https://github.com/openlayers/openlayers/pull/9888) - Use PointerEvent polyfill instead of our own abstraction ([@ahocevar](https://github.com/ahocevar))
|
|
||||||
* [#9896](https://github.com/openlayers/openlayers/pull/9896) - Misc. WebGL fixes ([@jahow](https://github.com/jahow))
|
|
||||||
* [#9889](https://github.com/openlayers/openlayers/pull/9889) - Event performance improvements ([@ahocevar](https://github.com/ahocevar))
|
|
||||||
* [#9882](https://github.com/openlayers/openlayers/pull/9882) - Handle rotation in the Box Selection example ([@mike-000](https://github.com/mike-000))
|
|
||||||
* [#9877](https://github.com/openlayers/openlayers/pull/9877) - Fix -1 pixel buffer for vector tile extent ([@ahocevar](https://github.com/ahocevar))
|
|
||||||
* [#9873](https://github.com/openlayers/openlayers/pull/9873) - Only check extent when a url tile coordinate is available ([@ahocevar](https://github.com/ahocevar))
|
|
||||||
* [#9871](https://github.com/openlayers/openlayers/pull/9871) - Properly handle tile source key change ([@ahocevar](https://github.com/ahocevar))
|
|
||||||
* [#9870](https://github.com/openlayers/openlayers/pull/9870) - Declutter multi geometries per geometry instead of per feature ([@ahocevar](https://github.com/ahocevar))
|
|
||||||
* [#9872](https://github.com/openlayers/openlayers/pull/9872) - Check extent for wrapped tile coordinate ([@ahocevar](https://github.com/ahocevar))
|
|
||||||
* [#9869](https://github.com/openlayers/openlayers/pull/9869) - Only get squared tolerance once per render ([@MoonE](https://github.com/MoonE))
|
|
||||||
* [#9389](https://github.com/openlayers/openlayers/pull/9389) - Replaces listener test in tile.tests.js and removes artifacts ([@KaiVolland](https://github.com/KaiVolland))
|
|
||||||
* [#9855](https://github.com/openlayers/openlayers/pull/9855) - Make sure vector tile load handler is called ([@tschaub](https://github.com/tschaub))
|
|
||||||
* [#9864](https://github.com/openlayers/openlayers/pull/9864) - Properly update frameState.animate and deal with non-numeric layer opacity ([@tschaub](https://github.com/tschaub))
|
|
||||||
* [#9858](https://github.com/openlayers/openlayers/pull/9858) - Run npm audit fix ([@tschaub](https://github.com/tschaub))
|
|
||||||
* [#9844](https://github.com/openlayers/openlayers/pull/9844) - Set initial tile state to EMPTY when outside source extent ([@ahocevar](https://github.com/ahocevar))
|
|
||||||
* [#9839](https://github.com/openlayers/openlayers/pull/9839) - Enable correct display of side-by-side example when not using the examples template ([@mike-000](https://github.com/mike-000))
|
|
||||||
* [#9838](https://github.com/openlayers/openlayers/pull/9838) - Make WMSServerType appear in API docs ([@ahocevar](https://github.com/ahocevar))
|
|
||||||
* [#9754](https://github.com/openlayers/openlayers/pull/9754) - Export PDF example extent corrections ([@mike-000](https://github.com/mike-000))
|
|
||||||
* [#9834](https://github.com/openlayers/openlayers/pull/9834) - Use nextzen for osm-vector-tiles example ([@ahocevar](https://github.com/ahocevar))
|
|
||||||
* [#9833](https://github.com/openlayers/openlayers/pull/9833) - Remove accidentally added package-lock.json ([@ahocevar](https://github.com/ahocevar))
|
|
||||||
* [#9826](https://github.com/openlayers/openlayers/pull/9826) - Accept additional args when publishing ([@tschaub](https://github.com/tschaub))
|
|
||||||
* [#9812](https://github.com/openlayers/openlayers/pull/9812) - Make zDirection configurable on tile source ([@ahocevar](https://github.com/ahocevar))
|
|
||||||
* [#9824](https://github.com/openlayers/openlayers/pull/9824) - Support zoom limits for layers ([@tschaub](https://github.com/tschaub))
|
|
||||||
* [#9804](https://github.com/openlayers/openlayers/pull/9804) - Replacement for the Shared Views example ([@mike-000](https://github.com/mike-000))
|
|
||||||
* [#9803](https://github.com/openlayers/openlayers/pull/9803) - Remove unused variable in MousePosition control ([@openlayers](https://github.com/openlayers))
|
|
||||||
* [#9802](https://github.com/openlayers/openlayers/pull/9802) - Introduce EMPTY image state to deal with images outside the view extent ([@ahocevar](https://github.com/ahocevar))
|
|
||||||
* [#9797](https://github.com/openlayers/openlayers/pull/9797) - Avoid false positives for line and polygon hit detection ([@ahocevar](https://github.com/ahocevar))
|
|
||||||
* [#9794](https://github.com/openlayers/openlayers/pull/9794) - Fix linting error (import extension missing) ([@marcjansen](https://github.com/marcjansen))
|
|
||||||
* [#9792](https://github.com/openlayers/openlayers/pull/9792) - Improve documentation of getGetLegendGraphicUrl ([@marcjansen](https://github.com/marcjansen))
|
|
||||||
* [#9375](https://github.com/openlayers/openlayers/pull/9375) - Replaces reproj image.tests.js and tile.tests.js ([@KaiVolland](https://github.com/KaiVolland))
|
|
||||||
* [#9762](https://github.com/openlayers/openlayers/pull/9762) - Get legend request ([@KlausBenndorf](https://github.com/KlausBenndorf))
|
|
||||||
* [#9789](https://github.com/openlayers/openlayers/pull/9789) - Use Image.prototype.decode only when src is already set ([@ahocevar](https://github.com/ahocevar))
|
|
||||||
* [#9778](https://github.com/openlayers/openlayers/pull/9778) - Return existing source tiles if at target resolution ([@ahocevar](https://github.com/ahocevar))
|
|
||||||
* [#9622](https://github.com/openlayers/openlayers/pull/9622) - Avoid mutating input in EsriJSON format ([@kekel87](https://github.com/kekel87))
|
|
||||||
* [#9755](https://github.com/openlayers/openlayers/pull/9755) - Font loading improvements ([@ahocevar](https://github.com/ahocevar))
|
|
||||||
* [#9767](https://github.com/openlayers/openlayers/pull/9767) - Fix hit detection for webgl layers on retina devices ([@jahow](https://github.com/jahow))
|
|
||||||
* [#9774](https://github.com/openlayers/openlayers/pull/9774) - Fix observable properties documentation ([@ahocevar](https://github.com/ahocevar))
|
|
||||||
* [#9757](https://github.com/openlayers/openlayers/pull/9757) - Use CanvasLineJoin and CanvasLienCap types instead of string ([@fredj](https://github.com/fredj))
|
|
||||||
* [#9745](https://github.com/openlayers/openlayers/pull/9745) - Simplify heatmap's shaders ([@fredj](https://github.com/fredj))
|
|
||||||
* [#9748](https://github.com/openlayers/openlayers/pull/9748) - Remove hit detection transforms from ol/renderer/webgl/PointsLayer ([@fredj](https://github.com/fredj))
|
|
||||||
* [#9752](https://github.com/openlayers/openlayers/pull/9752) - Custom Animation example and the multiWorld view constraint ([@mike-000](https://github.com/mike-000))
|
|
||||||
* [#9751](https://github.com/openlayers/openlayers/pull/9751) - Add minArea typedef and ctor prop in DragZoom ([@logan-bounet](https://github.com/logan-bounet))
|
|
||||||
* [#9747](https://github.com/openlayers/openlayers/pull/9747) - Set world projection only for tile-pixels units ([@ahocevar](https://github.com/ahocevar))
|
|
||||||
* [#9743](https://github.com/openlayers/openlayers/pull/9743) - Finalize IIIF Image API version 3 ([@lutzhelm](https://github.com/lutzhelm))
|
|
||||||
* [#9733](https://github.com/openlayers/openlayers/pull/9733) - Get rid of JSDoc warnings and fix fires arguments ([@ahocevar](https://github.com/ahocevar))
|
|
||||||
* [#9732](https://github.com/openlayers/openlayers/pull/9732) - Fix EMPTY state and source key handling ([@ahocevar](https://github.com/ahocevar))
|
|
||||||
* [#9724](https://github.com/openlayers/openlayers/pull/9724) - Fix wrong import in tutorial ([@fredj](https://github.com/fredj))
|
|
||||||
* [#9722](https://github.com/openlayers/openlayers/pull/9722) - Remove unused param in getState function ([@fredj](https://github.com/fredj))
|
|
||||||
* [#9655](https://github.com/openlayers/openlayers/pull/9655) - Add hit detection on the WebGL points renderer ([@jahow](https://github.com/jahow))
|
|
||||||
* [#9728](https://github.com/openlayers/openlayers/pull/9728) - Remove accidently added package-lock.json ([@ahocevar](https://github.com/ahocevar))
|
|
||||||
* [#9719](https://github.com/openlayers/openlayers/pull/9719) - Use special MapTiler API key dedicated for OpenLayers examples ([@petrsloup](https://github.com/petrsloup))
|
|
||||||
* [#9714](https://github.com/openlayers/openlayers/pull/9714) - Update the circle style after setRadius calls ([@fredj](https://github.com/fredj))
|
|
||||||
* [#9718](https://github.com/openlayers/openlayers/pull/9718) - Remove unused variable in ol/renderer/webgl/PointsLayer ([@fredj](https://github.com/fredj))
|
|
||||||
* [#9711](https://github.com/openlayers/openlayers/pull/9711) - Remove extra space for the 'viewParams' attribute ([@fredj](https://github.com/fredj))
|
|
||||||
* [#9712](https://github.com/openlayers/openlayers/pull/9712) - Allow an arbitrary tag to be used as feature id ([@tschaub](https://github.com/tschaub))
|
|
||||||
* [#9709](https://github.com/openlayers/openlayers/pull/9709) - Try to make rendering tests run again in puppeteer ([@ahocevar](https://github.com/ahocevar))
|
|
||||||
* [#9705](https://github.com/openlayers/openlayers/pull/9705) - Vector tile renderer optimizations and fixes ([@ahocevar](https://github.com/ahocevar))
|
|
||||||
* [#9706](https://github.com/openlayers/openlayers/pull/9706) - Do not use self to check browser features ([@ahocevar](https://github.com/ahocevar))
|
|
||||||
* [#9704](https://github.com/openlayers/openlayers/pull/9704) - Handle container reuse properly when layers are added/removed ([@ahocevar](https://github.com/ahocevar))
|
|
||||||
* [#9701](https://github.com/openlayers/openlayers/pull/9701) - Remove will-change CSS rule for Overlay container ([@fredj](https://github.com/fredj))
|
|
||||||
* [#9702](https://github.com/openlayers/openlayers/pull/9702) - Fix several TypeScript type check problems ([@lutzhelm](https://github.com/lutzhelm))
|
|
||||||
* [#9700](https://github.com/openlayers/openlayers/pull/9700) - Solves typescript related issues ([@KaiVolland](https://github.com/KaiVolland))
|
|
||||||
* [#9699](https://github.com/openlayers/openlayers/pull/9699) - Fix MapTiler API usage ([@petrsloup](https://github.com/petrsloup))
|
|
||||||
* [#9636](https://github.com/openlayers/openlayers/pull/9636) - Remove and move code from ol/webgl ([@fredj](https://github.com/fredj))
|
|
||||||
* [#9684](https://github.com/openlayers/openlayers/pull/9684) - List complete classes in doc navigation ([@ahocevar](https://github.com/ahocevar))
|
|
||||||
* [#9685](https://github.com/openlayers/openlayers/pull/9685) - Remove glContext from RenderEvent ([@fredj](https://github.com/fredj))
|
|
||||||
* [#9681](https://github.com/openlayers/openlayers/pull/9681) - Remove duplicates from api docs and make navigation more usable ([@ahocevar](https://github.com/ahocevar))
|
|
||||||
* [#9677](https://github.com/openlayers/openlayers/pull/9677) - Add support for tile pixel projection in feature formats ([@ahocevar](https://github.com/ahocevar))
|
|
||||||
* [#9679](https://github.com/openlayers/openlayers/pull/9679) - Set pixelTransform and inversePixelTransform as protected ([@fredj](https://github.com/fredj))
|
|
||||||
* [#9678](https://github.com/openlayers/openlayers/pull/9678) - Update geography class urls ([@ahocevar](https://github.com/ahocevar))
|
|
||||||
* [#9658](https://github.com/openlayers/openlayers/pull/9658) - Don't use HTMLImageElement.decode method on Safari ([@fredj](https://github.com/fredj))
|
|
||||||
* [#9657](https://github.com/openlayers/openlayers/pull/9657) - Better documentation for getFeaturesInExtent function ([@fredj](https://github.com/fredj))
|
|
||||||
* [#9562](https://github.com/openlayers/openlayers/pull/9562) - Optimize the WebGL points renderer using a worker ([@jahow](https://github.com/jahow))
|
|
||||||
* [#9394](https://github.com/openlayers/openlayers/pull/9394) - Introduces import snippets for static functions ([@KaiVolland](https://github.com/KaiVolland))
|
|
||||||
* [#9638](https://github.com/openlayers/openlayers/pull/9638) - #9625: Add filter function to translate interaction ([@agpixdev](https://github.com/agpixdev))
|
|
||||||
* [#9644](https://github.com/openlayers/openlayers/pull/9644) - Use compose function from ol/transform ([@fredj](https://github.com/fredj))
|
|
||||||
* [#9645](https://github.com/openlayers/openlayers/pull/9645) - Handle case of no used tiles ([@ahocevar](https://github.com/ahocevar))
|
|
||||||
* [#9640](https://github.com/openlayers/openlayers/pull/9640) - Import options directly instead of importing a typedef ([@ahocevar](https://github.com/ahocevar))
|
|
||||||
* [#9641](https://github.com/openlayers/openlayers/pull/9641) - Only import what's needed from projections ([@ahocevar](https://github.com/ahocevar))
|
|
||||||
* [#9637](https://github.com/openlayers/openlayers/pull/9637) - Detach label cache on Map#setTarget() ([@ahocevar](https://github.com/ahocevar))
|
|
||||||
* [#9633](https://github.com/openlayers/openlayers/pull/9633) - Mark the `layers` property as optional in OverviewMap constructor ([@fredj](https://github.com/fredj))
|
|
||||||
* [#9634](https://github.com/openlayers/openlayers/pull/9634) - Remove old Android workaround ([@ahocevar](https://github.com/ahocevar))
|
|
||||||
* [#9629](https://github.com/openlayers/openlayers/pull/9629) - Clear overlay canvas when reusing containers ([@ahocevar](https://github.com/ahocevar))
|
|
||||||
* [#9626](https://github.com/openlayers/openlayers/pull/9626) - Remove TOUCH, POINTER and MSPOINTER from ol/has ([@fredj](https://github.com/fredj))
|
|
||||||
* [#9624](https://github.com/openlayers/openlayers/pull/9624) - Remove typecasts in ol/control/OverviewMap ([@fredj](https://github.com/fredj))
|
|
||||||
* [#9615](https://github.com/openlayers/openlayers/pull/9615) - Include full filename in import specifier ([@tschaub](https://github.com/tschaub))
|
|
||||||
* [#9592](https://github.com/openlayers/openlayers/pull/9592) - Remove `layerState` param from `prepareFrame` and `renderFrame` function ([@fredj](https://github.com/fredj))
|
|
||||||
* [#9289](https://github.com/openlayers/openlayers/pull/9289) - Vector source geom ([@sbrunner](https://github.com/sbrunner))
|
|
||||||
* [#9608](https://github.com/openlayers/openlayers/pull/9608) - Use markdown link syntax in jsdoc ([@fredj](https://github.com/fredj))
|
|
||||||
* [#9596](https://github.com/openlayers/openlayers/pull/9596) - Vector source / prevent adding features with duplicate id in the collection ([@jahow](https://github.com/jahow))
|
|
||||||
* [#9604](https://github.com/openlayers/openlayers/pull/9604) - Use window instead of global in addEventListener ([@bartvde](https://github.com/bartvde))
|
|
||||||
* [#9599](https://github.com/openlayers/openlayers/pull/9599) - Create FUNDING.yml ([@openlayers](https://github.com/openlayers))
|
|
||||||
* [#9601](https://github.com/openlayers/openlayers/pull/9601) - Use global addEventListener in PluggableMap ([@bartvde](https://github.com/bartvde))
|
|
||||||
* [#9584](https://github.com/openlayers/openlayers/pull/9584) - Reuse render target ([@ahocevar](https://github.com/ahocevar))
|
|
||||||
* [#6217](https://github.com/openlayers/openlayers/pull/6217) - Add primaryAction condition to DragPan ([@fredj](https://github.com/fredj))
|
|
||||||
* [#9569](https://github.com/openlayers/openlayers/pull/9569) - Fix for change in Zoomify.js/CustomTile signature ([@engsterhold](https://github.com/engsterhold))
|
|
||||||
* [#9582](https://github.com/openlayers/openlayers/pull/9582) - Add app to mark inactive issues as stale ([@tschaub](https://github.com/tschaub))
|
|
||||||
* [#9581](https://github.com/openlayers/openlayers/pull/9581) - Update webpack and use mode in the loader ([@tschaub](https://github.com/tschaub))
|
|
||||||
* [#9576](https://github.com/openlayers/openlayers/pull/9576) - Remove geolocation detection from ol/has ([@fredj](https://github.com/fredj))
|
|
||||||
* [#9575](https://github.com/openlayers/openlayers/pull/9575) - Rework exports for getUid and control defaults ([@tschaub](https://github.com/tschaub))
|
|
||||||
* [#9574](https://github.com/openlayers/openlayers/pull/9574) - Update OL MapGuide example to point to my demo MapGuide Server. ([@jumpinjackie](https://github.com/jumpinjackie))
|
|
||||||
* [#9571](https://github.com/openlayers/openlayers/pull/9571) - Small examples improvements ([@fredj](https://github.com/fredj))
|
|
||||||
* [#9572](https://github.com/openlayers/openlayers/pull/9572) - Add a note about CSS removal in upgrade-notes.md ([@fredj](https://github.com/fredj))
|
|
||||||
* [#9570](https://github.com/openlayers/openlayers/pull/9570) - Remove CSS print rules in ol.css ([@fredj](https://github.com/fredj))
|
|
||||||
* [#9563](https://github.com/openlayers/openlayers/pull/9563) - Fix @abstract and @module annotations ([@tschaub](https://github.com/tschaub))
|
|
||||||
* [#9560](https://github.com/openlayers/openlayers/pull/9560) - Simplify loading detection loop ([@ahocevar](https://github.com/ahocevar))
|
|
||||||
* [#9561](https://github.com/openlayers/openlayers/pull/9561) - Remove memory leak caused by label cache listeners ([@ahocevar](https://github.com/ahocevar))
|
|
||||||
* [#9559](https://github.com/openlayers/openlayers/pull/9559) - Minify worker ([@tschaub](https://github.com/tschaub))
|
|
||||||
* [#9558](https://github.com/openlayers/openlayers/pull/9558) - Stop listening for image decoding ([@tschaub](https://github.com/tschaub))
|
|
||||||
* [#9550](https://github.com/openlayers/openlayers/pull/9550) - Setup for building workers ([@tschaub](https://github.com/tschaub))
|
|
||||||
* [#9555](https://github.com/openlayers/openlayers/pull/9555) - Remove unused roundUpToPowerOfTwo function ([@fredj](https://github.com/fredj))
|
|
||||||
* [#9551](https://github.com/openlayers/openlayers/pull/9551) - Use HTMLImageElement.decode if available ([@fredj](https://github.com/fredj))
|
|
||||||
* [#9500](https://github.com/openlayers/openlayers/pull/9500) - KML string validation with extendedData ([@edellucien](https://github.com/edellucien))
|
|
||||||
* [#9534](https://github.com/openlayers/openlayers/pull/9534) - Remove unnecessary parts from the Mapbox layer example ([@tschaub](https://github.com/tschaub))
|
|
||||||
* [#9548](https://github.com/openlayers/openlayers/pull/9548) - Avoid cut off labels for italic fonts ([@ahocevar](https://github.com/ahocevar))
|
|
||||||
* [#9549](https://github.com/openlayers/openlayers/pull/9549) - Remove unused getReplayTransform_ function in VectorTileLayer ([@fredj](https://github.com/fredj))
|
|
||||||
* [#9545](https://github.com/openlayers/openlayers/pull/9545) - Avoid panning off the edge of the world ([@tschaub](https://github.com/tschaub))
|
|
||||||
* [#9539](https://github.com/openlayers/openlayers/pull/9539) - Document existing error event type ([@tschaub](https://github.com/tschaub))
|
|
||||||
* [#9541](https://github.com/openlayers/openlayers/pull/9541) - Upgrade to rbush@3 ([@tschaub](https://github.com/tschaub))
|
|
||||||
* [#9543](https://github.com/openlayers/openlayers/pull/9543) - Update jsdoc-plugin-typescript to version 2.0.1 ([@tschaub](https://github.com/tschaub))
|
|
||||||
* [#9536](https://github.com/openlayers/openlayers/pull/9536) - More font cache hits ([@ahocevar](https://github.com/ahocevar))
|
|
||||||
* [#9537](https://github.com/openlayers/openlayers/pull/9537) - WebGL / Points renderer refactoring ([@jahow](https://github.com/jahow))
|
|
||||||
* [#9546](https://github.com/openlayers/openlayers/pull/9546) - Lazily create the hit detection context ([@fredj](https://github.com/fredj))
|
|
||||||
* [#9533](https://github.com/openlayers/openlayers/pull/9533) - Canvas optimizations ([@fredj](https://github.com/fredj))
|
|
||||||
* [#9538](https://github.com/openlayers/openlayers/pull/9538) - Correct the module annotation for the vector image layer renderer ([@tschaub](https://github.com/tschaub))
|
|
||||||
* [#9532](https://github.com/openlayers/openlayers/pull/9532) - Remove unused 'container' property in mapbox-layer example ([@fredj](https://github.com/fredj))
|
|
||||||
* [#9530](https://github.com/openlayers/openlayers/pull/9530) - Fix spelling ([@fredj](https://github.com/fredj))
|
|
||||||
* [#9489](https://github.com/openlayers/openlayers/pull/9489) - Fix Zoomify to display retina tiles ([@crubier](https://github.com/crubier))
|
|
||||||
* [#9525](https://github.com/openlayers/openlayers/pull/9525) - Support a custom render function for the Layer class ([@jahow](https://github.com/jahow))
|
|
||||||
* [#9522](https://github.com/openlayers/openlayers/pull/9522) - Use https urls for mapbox.com ([@fredj](https://github.com/fredj))
|
|
||||||
* [#9520](https://github.com/openlayers/openlayers/pull/9520) - [WIP] Improve IIIF tile source and parser documentation ([@lutzhelm](https://github.com/lutzhelm))
|
|
||||||
* [#9523](https://github.com/openlayers/openlayers/pull/9523) - Make the code simpler in the Mapbox example ([@jahow](https://github.com/jahow))
|
|
||||||
* [#9519](https://github.com/openlayers/openlayers/pull/9519) - Use synchronous render in Mapbox example ([@jahow](https://github.com/jahow))
|
|
||||||
* [#9518](https://github.com/openlayers/openlayers/pull/9518) - Fix hit detection for multiple layers when decluttering is off ([@ahocevar](https://github.com/ahocevar))
|
|
||||||
* [#9516](https://github.com/openlayers/openlayers/pull/9516) - Upgrade ol-mapbox-style to v5 ([@ahocevar](https://github.com/ahocevar))
|
|
||||||
* [#9505](https://github.com/openlayers/openlayers/pull/9505) - Avoid blurry vector tiles ([@ahocevar](https://github.com/ahocevar))
|
|
||||||
* [#9430](https://github.com/openlayers/openlayers/pull/9430) - Adds IIIF Image API tile source ([@lutzhelm](https://github.com/lutzhelm))
|
|
||||||
* [#9512](https://github.com/openlayers/openlayers/pull/9512) - Mapbox layer example improvement ([@fredj](https://github.com/fredj))
|
|
||||||
* [#9511](https://github.com/openlayers/openlayers/pull/9511) - Update devDependencies ([@fredj](https://github.com/fredj))
|
|
||||||
* [#9504](https://github.com/openlayers/openlayers/pull/9504) - Minor examples fixes ([@fredj](https://github.com/fredj))
|
|
||||||
* [#9466](https://github.com/openlayers/openlayers/pull/9466) - Declutter in correct order and for all layers ([@ahocevar](https://github.com/ahocevar))
|
|
||||||
* [#9497](https://github.com/openlayers/openlayers/pull/9497) - Fix earth radius in documentation ([@simonseyock](https://github.com/simonseyock))
|
|
||||||
* [#9493](https://github.com/openlayers/openlayers/pull/9493) - Upgrade jsdoc to v3.6.1 ([@ahocevar](https://github.com/ahocevar))
|
|
||||||
* [#9490](https://github.com/openlayers/openlayers/pull/9490) - Misc. API doc improvements ([@jahow](https://github.com/jahow))
|
|
||||||
* [#9492](https://github.com/openlayers/openlayers/pull/9492) - Fix zIndex handling for unmanaged layers ([@ahocevar](https://github.com/ahocevar))
|
|
||||||
* [#9388](https://github.com/openlayers/openlayers/pull/9388) - Restore code coverage report ([@jahow](https://github.com/jahow))
|
|
||||||
* [#9487](https://github.com/openlayers/openlayers/pull/9487) - Avoid header expanding over examples ([@tschaub](https://github.com/tschaub))
|
|
||||||
* [#9488](https://github.com/openlayers/openlayers/pull/9488) - Set the 'lang' attribute to the html tag in examples ([@openlayers](https://github.com/openlayers))
|
|
||||||
* [#9484](https://github.com/openlayers/openlayers/pull/9484) - Build API docs in CI job ([@tschaub](https://github.com/tschaub))
|
|
||||||
* [#9476](https://github.com/openlayers/openlayers/pull/9476) - Document events fired by interactions ([@tschaub](https://github.com/tschaub))
|
|
||||||
* [#9475](https://github.com/openlayers/openlayers/pull/9475) - Call the color callback once per feature ([@tschaub](https://github.com/tschaub))
|
|
||||||
* [#9477](https://github.com/openlayers/openlayers/pull/9477) - Tidy up the JSDoc events plugin ([@tschaub](https://github.com/tschaub))
|
|
||||||
* [#9469](https://github.com/openlayers/openlayers/pull/9469) - Use nearest lower resolution of vector tiles ([@ahocevar](https://github.com/ahocevar))
|
|
||||||
* [#9452](https://github.com/openlayers/openlayers/pull/9452) - Fewer calls to the WebGL color callback ([@tschaub](https://github.com/tschaub))
|
|
||||||
* [#9453](https://github.com/openlayers/openlayers/pull/9453) - Remove unnecessary closure and fix uniform type ([@tschaub](https://github.com/tschaub))
|
|
||||||
* [#9459](https://github.com/openlayers/openlayers/pull/9459) - Use html-to-image instead of dom-to-image-more ([@fredj](https://github.com/fredj))
|
|
||||||
* [#9450](https://github.com/openlayers/openlayers/pull/9450) - Set the interacting flag on pointerdrag instead of pointerdown ([@ahocevar](https://github.com/ahocevar))
|
|
||||||
* [#9439](https://github.com/openlayers/openlayers/pull/9439) - Add attributionsCollapsible option to source/VectorTile ([@ahocevar](https://github.com/ahocevar))
|
|
||||||
* [#9440](https://github.com/openlayers/openlayers/pull/9440) - Skip the header and bad data in CSV parsing ([@tschaub](https://github.com/tschaub))
|
|
||||||
* [#9442](https://github.com/openlayers/openlayers/pull/9442) - Disable opacity transition for raster source sources ([@ahocevar](https://github.com/ahocevar))
|
|
||||||
* [#9441](https://github.com/openlayers/openlayers/pull/9441) - Do not round view center to pixels ([@ahocevar](https://github.com/ahocevar))
|
|
||||||
* [#9435](https://github.com/openlayers/openlayers/pull/9435) - Set the default values after the property name ([@fredj](https://github.com/fredj))
|
|
||||||
* [#9433](https://github.com/openlayers/openlayers/pull/9433) - Remove unused private variables, remove trailing whitespace ([@fredj](https://github.com/fredj))
|
|
||||||
* [#9416](https://github.com/openlayers/openlayers/pull/9416) - Implement rotate and translate functions for circle geometry ([@fredj](https://github.com/fredj))
|
|
||||||
* [#9429](https://github.com/openlayers/openlayers/pull/9429) - Update all devDependencies ([@fredj](https://github.com/fredj))
|
|
||||||
* [#9425](https://github.com/openlayers/openlayers/pull/9425) - Remove unused ol/render/webgl module ([@fredj](https://github.com/fredj))
|
|
||||||
* [#9418](https://github.com/openlayers/openlayers/pull/9418) - Re-export GeometryCollection in ol/geom ([@ahocevar](https://github.com/ahocevar))
|
|
||||||
* [#9411](https://github.com/openlayers/openlayers/pull/9411) - Fix tile state condition in raster layer test ([@fredj](https://github.com/fredj))
|
|
||||||
* [#9410](https://github.com/openlayers/openlayers/pull/9410) - Add new maxDelta property to MouseWheelZoom constructor ([@fredj](https://github.com/fredj))
|
|
||||||
* [#9409](https://github.com/openlayers/openlayers/pull/9409) - Remove more opt_this parameters ([@fredj](https://github.com/fredj))
|
|
||||||
* [#9286](https://github.com/openlayers/openlayers/pull/9286) - Disable transition when an interim tile is available ([@ahocevar](https://github.com/ahocevar))
|
|
||||||
* [#9404](https://github.com/openlayers/openlayers/pull/9404) - View / apply constraints when an interaction starts ([@jahow](https://github.com/jahow))
|
|
||||||
* [#9390](https://github.com/openlayers/openlayers/pull/9390) - Add a new WebGL example for filtering features ([@jahow](https://github.com/jahow))
|
|
||||||
* [#9385](https://github.com/openlayers/openlayers/pull/9385) - PointsLayer added clear of the render Buffers on Source Change ([@Kai-W](https://github.com/Kai-W))
|
|
||||||
* [#9379](https://github.com/openlayers/openlayers/pull/9379) - Fix typo in vector tile source docs ([@openlayers](https://github.com/openlayers))
|
|
||||||
* [#9368](https://github.com/openlayers/openlayers/pull/9368) - Show only one world ([@ahocevar](https://github.com/ahocevar))
|
|
||||||
* [#9362](https://github.com/openlayers/openlayers/pull/9362) - Use local font "Ubuntu Regular" for rendering tests ([@KaiVolland](https://github.com/KaiVolland))
|
|
||||||
* [#9357](https://github.com/openlayers/openlayers/pull/9357) - Render vector tiles at the view resolution ([@ahocevar](https://github.com/ahocevar))
|
|
||||||
* [#9374](https://github.com/openlayers/openlayers/pull/9374) - Fix view initialization with min/max resolution constraint ([@jahow](https://github.com/jahow))
|
|
||||||
* [#9364](https://github.com/openlayers/openlayers/pull/9364) - Replace clip.test.js with new tests ([@KaiVolland](https://github.com/KaiVolland))
|
|
||||||
* [#9360](https://github.com/openlayers/openlayers/pull/9360) - Enables attributions for the RasterSource ([@KaiVolland](https://github.com/KaiVolland))
|
|
||||||
* [#9365](https://github.com/openlayers/openlayers/pull/9365) - Fix View method name in upgrade notes ([@jahow](https://github.com/jahow))
|
|
||||||
* [#9361](https://github.com/openlayers/openlayers/pull/9361) - Add a zDirection option for Zoomify - implements #9343 ([@lutzhelm](https://github.com/lutzhelm))
|
|
||||||
* [#9333](https://github.com/openlayers/openlayers/pull/9333) - Unify rendering tests ([@KaiVolland](https://github.com/KaiVolland))
|
|
||||||
* [#9350](https://github.com/openlayers/openlayers/pull/9350) - Remove unnecessary css in examples ([@fredj](https://github.com/fredj))
|
|
||||||
* [#9351](https://github.com/openlayers/openlayers/pull/9351) - More efficient default styles ([@ahocevar](https://github.com/ahocevar))
|
|
||||||
* [#9346](https://github.com/openlayers/openlayers/pull/9346) - Remove tilePixelRatio options from ol.source.VectorTile ([@fredj](https://github.com/fredj))
|
|
||||||
* [#9345](https://github.com/openlayers/openlayers/pull/9345) - Update all dev dependencies ([@fredj](https://github.com/fredj))
|
|
||||||
* [#9341](https://github.com/openlayers/openlayers/pull/9341) - Remove unused ExecutorGroup methods ([@ahocevar](https://github.com/ahocevar))
|
|
||||||
* [#9337](https://github.com/openlayers/openlayers/pull/9337) - Set map div size in example send to codesandbox ([@fredj](https://github.com/fredj))
|
|
||||||
* [#9335](https://github.com/openlayers/openlayers/pull/9335) - Create codesandbox using the 'parcel' template ([@openlayers](https://github.com/openlayers))
|
|
||||||
* [#9329](https://github.com/openlayers/openlayers/pull/9329) - Don't refresh the layer after addFeatures call ([@fredj](https://github.com/fredj))
|
|
||||||
* [#9328](https://github.com/openlayers/openlayers/pull/9328) - Mark layerFilter in AtPixelOptions as optional ([@fredj](https://github.com/fredj))
|
|
||||||
* [#9325](https://github.com/openlayers/openlayers/pull/9325) - Create a more accurate origin for tile positioning ([@ahocevar](https://github.com/ahocevar))
|
|
||||||
* [#9320](https://github.com/openlayers/openlayers/pull/9320) - enhance tile-debug readability ([@RobertOrthofer](https://github.com/RobertOrthofer))
|
|
||||||
* [#9318](https://github.com/openlayers/openlayers/pull/9318) - Smart cache size ([@ahocevar](https://github.com/ahocevar))
|
|
||||||
* [#9322](https://github.com/openlayers/openlayers/pull/9322) - Use closest lower source resolution for render tiles ([@ahocevar](https://github.com/ahocevar))
|
|
||||||
* [#9321](https://github.com/openlayers/openlayers/pull/9321) - Fixes #9294 (missing documention for methods with `@inheritDoc`) ([@KaiVolland](https://github.com/KaiVolland))
|
|
||||||
* [#9319](https://github.com/openlayers/openlayers/pull/9319) - Add title to license to clarify that it is BSD 2-Clause ([@tschaub](https://github.com/tschaub))
|
|
||||||
* [#9300](https://github.com/openlayers/openlayers/pull/9300) - Fix documentation about zoomDelta for ol.interaction.default function ([@fredj](https://github.com/fredj))
|
|
||||||
* [#9305](https://github.com/openlayers/openlayers/pull/9305) - Fixes failing tests for Chrome v74 ([@KaiVolland](https://github.com/KaiVolland))
|
|
||||||
* [#9315](https://github.com/openlayers/openlayers/pull/9315) - Change CSS class for tooltips in measure example ([@fredj](https://github.com/fredj))
|
|
||||||
* [#9137](https://github.com/openlayers/openlayers/pull/9137) - Refactor the way view constraints are handled & add a view extent constraint ([@jahow](https://github.com/jahow))
|
|
||||||
* [#9313](https://github.com/openlayers/openlayers/pull/9313) - Re-enable and fix disabled tests ([@ahocevar](https://github.com/ahocevar))
|
|
||||||
* [#9314](https://github.com/openlayers/openlayers/pull/9314) - Fix transpilation ([@ahocevar](https://github.com/ahocevar))
|
|
||||||
* [#9308](https://github.com/openlayers/openlayers/pull/9308) - Simplify vector tile projection handling ([@ahocevar](https://github.com/ahocevar))
|
|
||||||
* [#9312](https://github.com/openlayers/openlayers/pull/9312) - Update zoom levels for Stamen source ([@bartvde](https://github.com/bartvde))
|
|
||||||
* [#9310](https://github.com/openlayers/openlayers/pull/9310) - Add transition options to Stamen source ([@fredj](https://github.com/fredj))
|
|
||||||
* [#9307](https://github.com/openlayers/openlayers/pull/9307) - Take line-height into account when measuring text height ([@ahocevar](https://github.com/ahocevar))
|
|
||||||
* [#9306](https://github.com/openlayers/openlayers/pull/9306) - Set the canvas size to 0 on dispose ([@fredj](https://github.com/fredj))
|
|
||||||
* [#9295](https://github.com/openlayers/openlayers/pull/9295) - Update ol-mapbox-style to fix broken mapbox-style example ([@ahocevar](https://github.com/ahocevar))
|
|
||||||
* [#9292](https://github.com/openlayers/openlayers/pull/9292) - Downgrades puppeteer to `~1.11.0` ([@KaiVolland](https://github.com/KaiVolland))
|
|
||||||
* [#9266](https://github.com/openlayers/openlayers/pull/9266) - Full type definition for image vector layer options ([@tschaub](https://github.com/tschaub))
|
|
||||||
* [#9278](https://github.com/openlayers/openlayers/pull/9278) - Update Bing's imagerySet used in examples ([@fredj](https://github.com/fredj))
|
|
||||||
* [#9270](https://github.com/openlayers/openlayers/pull/9270) - Update faq.md ([@bvx89](https://github.com/bvx89))
|
|
||||||
* [#9277](https://github.com/openlayers/openlayers/pull/9277) - Rotate API token ([@ahocevar](https://github.com/ahocevar))
|
|
||||||
* [#9276](https://github.com/openlayers/openlayers/pull/9276) - Use the constructor options instead of changing the private variables ([@fredj](https://github.com/fredj))
|
|
||||||
* [#9275](https://github.com/openlayers/openlayers/pull/9275) - Remove setDeclutter function ([@fredj](https://github.com/fredj))
|
|
||||||
* [#9273](https://github.com/openlayers/openlayers/pull/9273) - Fix WMS GetFeatureInfo examples ([@chrismayer](https://github.com/chrismayer))
|
|
||||||
* [#9246](https://github.com/openlayers/openlayers/pull/9246) - Add missing ol.css in mobile-full-screen example ([@openlayers](https://github.com/openlayers))
|
|
||||||
* [#9264](https://github.com/openlayers/openlayers/pull/9264) - add question about resizing map element ([@tpluscode](https://github.com/tpluscode))
|
|
||||||
* [#9260](https://github.com/openlayers/openlayers/pull/9260) - Remove unused 'geometry' param from ol/render/canvas/Builder ([@fredj](https://github.com/fredj))
|
|
||||||
* [#9254](https://github.com/openlayers/openlayers/pull/9254) - Add tileSize option to ol/source/TileJSON ([@petrsloup](https://github.com/petrsloup))
|
|
||||||
* [#9250](https://github.com/openlayers/openlayers/pull/9250) - Clearer behaviour of clear() and refresh() on sources ([@ahocevar](https://github.com/ahocevar))
|
|
||||||
* [#9251](https://github.com/openlayers/openlayers/pull/9251) - Fix cache size calculation ([@ahocevar](https://github.com/ahocevar))
|
|
||||||
* [#9110](https://github.com/openlayers/openlayers/pull/9110) - Add TilePixelRatio to Zoomify ([@crubier](https://github.com/crubier))
|
|
||||||
* [#9244](https://github.com/openlayers/openlayers/pull/9244) - add stylus only and touch only mode to drawing a shape ([@huyngkh](https://github.com/huyngkh))
|
|
||||||
* [#9240](https://github.com/openlayers/openlayers/pull/9240) - Add setRotateWithView function to ol/style/Text ([@fredj](https://github.com/fredj))
|
|
||||||
* [#9230](https://github.com/openlayers/openlayers/pull/9230) - Consider all tiles for hit detection when decluttering ([@ahocevar](https://github.com/ahocevar))
|
|
||||||
* [#9237](https://github.com/openlayers/openlayers/pull/9237) - Fix zoom after export to PDF is done ([@umbe1987](https://github.com/umbe1987))
|
|
||||||
* [#9239](https://github.com/openlayers/openlayers/pull/9239) - Run tests in Puppeteer and non headless mode ([@ahocevar](https://github.com/ahocevar))
|
|
||||||
* [#9236](https://github.com/openlayers/openlayers/pull/9236) - Move params list to the constructor function ([@fredj](https://github.com/fredj))
|
|
||||||
* [#9233](https://github.com/openlayers/openlayers/pull/9233) - Remove deprecated {get,set}SnapToPixel functions ([@fredj](https://github.com/fredj))
|
|
||||||
* [#9231](https://github.com/openlayers/openlayers/pull/9231) - Set vector tile extent earlier ([@ahocevar](https://github.com/ahocevar))
|
|
||||||
* [#9224](https://github.com/openlayers/openlayers/pull/9224) - Remove vendor prefix for the 'transform' CSS property and fullscreen api ([@fredj](https://github.com/fredj))
|
|
||||||
* [#9222](https://github.com/openlayers/openlayers/pull/9222) - Update all dev dependencies ([@fredj](https://github.com/fredj))
|
|
||||||
* [#9221](https://github.com/openlayers/openlayers/pull/9221) - Remove unused sortByZIndex function ([@ahocevar](https://github.com/ahocevar))
|
|
||||||
* [#9220](https://github.com/openlayers/openlayers/pull/9220) - Don't resize/clear the vector renderer canvas ([@fredj](https://github.com/fredj))
|
|
||||||
* [#9217](https://github.com/openlayers/openlayers/pull/9217) - Don't use loadImage function to avoid infinite loading loop ([@fredj](https://github.com/fredj))
|
|
||||||
* [#9212](https://github.com/openlayers/openlayers/pull/9212) - Remove unnecessary type cast ([@fredj](https://github.com/fredj))
|
|
||||||
* [#9201](https://github.com/openlayers/openlayers/pull/9201) - Only consider child range with drawable tiles ([@ahocevar](https://github.com/ahocevar))
|
|
||||||
* [#9204](https://github.com/openlayers/openlayers/pull/9204) - Add missing 'include' section ([@ahocevar](https://github.com/ahocevar))
|
|
||||||
* [#9203](https://github.com/openlayers/openlayers/pull/9203) - Only promise what we can deliver regarding IntelliSense ([@ahocevar](https://github.com/ahocevar))
|
|
||||||
* [#9200](https://github.com/openlayers/openlayers/pull/9200) - Add upgrade note about renderMode: 'image' for vector layers ([@ahocevar](https://github.com/ahocevar))
|
|
||||||
* [#9197](https://github.com/openlayers/openlayers/pull/9197) - Remove unused opt_this param ([@fredj](https://github.com/fredj))
|
|
||||||
* [#9196](https://github.com/openlayers/openlayers/pull/9196) - getPointResolution returns resolution in projection units ([@ahocevar](https://github.com/ahocevar))
|
|
||||||
* [#9190](https://github.com/openlayers/openlayers/pull/9190) - Fix MultiPolygon area calculation ([@romanzoller](https://github.com/romanzoller))
|
|
||||||
* [#9179](https://github.com/openlayers/openlayers/pull/9179) - Allow declutter with image render mode ([@gberaudo](https://github.com/gberaudo))
|
|
||||||
* [#9187](https://github.com/openlayers/openlayers/pull/9187) - Remove unnecessary type cast ([@fredj](https://github.com/fredj))
|
|
||||||
* [#9186](https://github.com/openlayers/openlayers/pull/9186) - Simplify typing in EsriJSON format ([@fredj](https://github.com/fredj))
|
|
||||||
* [#9161](https://github.com/openlayers/openlayers/pull/9161) - Use type template for the source type of layers ([@fredj](https://github.com/fredj))
|
|
||||||
* [#9184](https://github.com/openlayers/openlayers/pull/9184) - Update all dev dependencies ([@fredj](https://github.com/fredj))
|
|
||||||
* [#9178](https://github.com/openlayers/openlayers/pull/9178) - Sources in npm package for TypeScript support ([@ahocevar](https://github.com/ahocevar))
|
|
||||||
* [#9181](https://github.com/openlayers/openlayers/pull/9181) - Add test to verify that removefeature is triggered ([@ahocevar](https://github.com/ahocevar))
|
|
||||||
* [#9173](https://github.com/openlayers/openlayers/pull/9173) - Document the correct render events ([@ahocevar](https://github.com/ahocevar))
|
|
||||||
* [#9167](https://github.com/openlayers/openlayers/pull/9167) - JSDoc fixes ([@ahocevar](https://github.com/ahocevar))
|
|
||||||
* [#9164](https://github.com/openlayers/openlayers/pull/9164) - event chain documentation ([@KlausBenndorf](https://github.com/KlausBenndorf))
|
|
||||||
* [#9157](https://github.com/openlayers/openlayers/pull/9157) - Remove deprecated inherits function ([@fredj](https://github.com/fredj))
|
|
||||||
* [#9152](https://github.com/openlayers/openlayers/pull/9152) - Vector tile optimizations ([@ahocevar](https://github.com/ahocevar))
|
|
||||||
* [#9154](https://github.com/openlayers/openlayers/pull/9154) - Safer check for window.screen ([@ahocevar](https://github.com/ahocevar))
|
|
||||||
* [#9150](https://github.com/openlayers/openlayers/pull/9150) - Avoid clipping when rendering to tiles that don't exceed the clip extent ([@ahocevar](https://github.com/ahocevar))
|
|
||||||
* [#9149](https://github.com/openlayers/openlayers/pull/9149) - Keep track of used labels ([@ahocevar](https://github.com/ahocevar))
|
|
||||||
* [#9131](https://github.com/openlayers/openlayers/pull/9131) - Don't use strict comparison with style.opacity ([@fredj](https://github.com/fredj))
|
|
||||||
* [#9013](https://github.com/openlayers/openlayers/pull/9013) - Added scalebar option to ol.control.scaleline ([@weskamm](https://github.com/weskamm))
|
|
||||||
* [#9133](https://github.com/openlayers/openlayers/pull/9133) - Reduce memory footprint of tiles and labels ([@ahocevar](https://github.com/ahocevar))
|
|
||||||
* [#9129](https://github.com/openlayers/openlayers/pull/9129) - Reduce garbage generation ([@fredj](https://github.com/fredj))
|
|
||||||
* [#9128](https://github.com/openlayers/openlayers/pull/9128) - Use less render cycles for vector tile layers ([@ahocevar](https://github.com/ahocevar))
|
|
||||||
* [#9120](https://github.com/openlayers/openlayers/pull/9120) - Update all dev dependencies ([@fredj](https://github.com/fredj))
|
|
||||||
* [#9118](https://github.com/openlayers/openlayers/pull/9118) - Don't dispatch change events when reading features ([@fredj](https://github.com/fredj))
|
|
||||||
* [#9114](https://github.com/openlayers/openlayers/pull/9114) - Faster extent calculation with less garbage ([@ahocevar](https://github.com/ahocevar))
|
|
||||||
* [#9109](https://github.com/openlayers/openlayers/pull/9109) - Make package.json valid json object ([@JosephSamela](https://github.com/JosephSamela))
|
|
||||||
* [#9112](https://github.com/openlayers/openlayers/pull/9112) - Properly unregister prepareTile listeners ([@ahocevar](https://github.com/ahocevar))
|
|
||||||
* [#9103](https://github.com/openlayers/openlayers/pull/9103) - Make examples more user friendly ([@ahocevar](https://github.com/ahocevar))
|
|
||||||
* [#9107](https://github.com/openlayers/openlayers/pull/9107) - Fix cgiar csi URL due to #9106 ([@webgeodatavore](https://github.com/webgeodatavore))
|
|
||||||
* [#9058](https://github.com/openlayers/openlayers/pull/9058) - Move all tile loading from the VectorImageTile to the source ([@ahocevar](https://github.com/ahocevar))
|
|
||||||
* [#9102](https://github.com/openlayers/openlayers/pull/9102) - Use dom-to-image library in export-pdf example ([@openlayers](https://github.com/openlayers))
|
|
||||||
* [#9072](https://github.com/openlayers/openlayers/pull/9072) - Remove 'layerStates' property from the FrameState ([@fredj](https://github.com/fredj))
|
|
||||||
* [#9101](https://github.com/openlayers/openlayers/pull/9101) - Always load tiles while animating and interacting ([@ahocevar](https://github.com/ahocevar))
|
|
||||||
* [#9099](https://github.com/openlayers/openlayers/pull/9099) - Allow users to opt out of tracking ([@ahocevar](https://github.com/ahocevar))
|
|
||||||
* [#9098](https://github.com/openlayers/openlayers/pull/9098) - External types bugfix for jsdoc-plugin-typescript ([@ahocevar](https://github.com/ahocevar))
|
|
||||||
* [#9083](https://github.com/openlayers/openlayers/pull/9083) - Reset lastDragTime when condition is not met ([@ahocevar](https://github.com/ahocevar))
|
|
||||||
* [#9090](https://github.com/openlayers/openlayers/pull/9090) - Add texture & color to the WebGL points renderer ([@jahow](https://github.com/jahow))
|
|
||||||
* [#9091](https://github.com/openlayers/openlayers/pull/9091) - Fix heatmap example in IE ([@jahow](https://github.com/jahow))
|
|
||||||
* [#9089](https://github.com/openlayers/openlayers/pull/9089) - Replace rawgit with jsdelivr due to #9082 comment ([@ThomasG77](https://github.com/ThomasG77))
|
|
||||||
* [#9079](https://github.com/openlayers/openlayers/pull/9079) - Listen to all fullscreen event types ([@ahocevar](https://github.com/ahocevar))
|
|
||||||
* [#9070](https://github.com/openlayers/openlayers/pull/9070) - Modify.removePoint returns true only when a vertex was removed ([@ludvigeriksson](https://github.com/ludvigeriksson))
|
|
||||||
* [#9068](https://github.com/openlayers/openlayers/pull/9068) - Use 'PBF' type instead of 'Object' in ol/format/MVT ([@fredj](https://github.com/fredj))
|
|
||||||
* [#9066](https://github.com/openlayers/openlayers/pull/9066) - Rework transformWithOptions ([@fredj](https://github.com/fredj))
|
|
||||||
* [#9064](https://github.com/openlayers/openlayers/pull/9064) - Remove Atlas, AtlasManager and getChecksum functions ([@fredj](https://github.com/fredj))
|
|
||||||
* [#9060](https://github.com/openlayers/openlayers/pull/9060) - Avoid unexpected behavior when passing string coordinates ([@ahocevar](https://github.com/ahocevar))
|
|
||||||
* [#9063](https://github.com/openlayers/openlayers/pull/9063) - Fix module name ([@oterral](https://github.com/oterral))
|
|
||||||
* [#9056](https://github.com/openlayers/openlayers/pull/9056) - Remove typecast for object literals ([@fredj](https://github.com/fredj))
|
|
||||||
* [#9057](https://github.com/openlayers/openlayers/pull/9057) - Use FeatureLike typedef ([@fredj](https://github.com/fredj))
|
|
||||||
* [#9055](https://github.com/openlayers/openlayers/pull/9055) - Remove type cast in ol.View ([@fredj](https://github.com/fredj))
|
|
||||||
* [#9008](https://github.com/openlayers/openlayers/pull/9008) - Decouple render instruction creation from rendering ([@ahocevar](https://github.com/ahocevar))
|
|
||||||
* [#9045](https://github.com/openlayers/openlayers/pull/9045) - Remove CANVAS_LINE_DASH from ol/has ([@openlayers](https://github.com/openlayers))
|
|
||||||
* [#9044](https://github.com/openlayers/openlayers/pull/9044) - Fix comments indentation ([@openlayers](https://github.com/openlayers))
|
|
||||||
* [#9043](https://github.com/openlayers/openlayers/pull/9043) - Fix type notation in examples ([@openlayers](https://github.com/openlayers))
|
|
||||||
* [#9041](https://github.com/openlayers/openlayers/pull/9041) - Reworked the Webgl Heatmap layer & associated utilities ([@jahow](https://github.com/jahow))
|
|
||||||
* [#9042](https://github.com/openlayers/openlayers/pull/9042) - Change onBoxEnd property in DragBox options to optional ([@openlayers](https://github.com/openlayers))
|
|
||||||
* [#9039](https://github.com/openlayers/openlayers/pull/9039) - Add ': void' to non returning functions (error TS7014) ([@OSHistory](https://github.com/OSHistory))
|
|
||||||
* [#9024](https://github.com/openlayers/openlayers/pull/9024) - Add prerender and postrender events for Image layer ([@ahocevar](https://github.com/ahocevar))
|
|
||||||
* [#9028](https://github.com/openlayers/openlayers/pull/9028) - Specify the return array as coordinates ([@OSHistory](https://github.com/OSHistory))
|
|
||||||
* [#9036](https://github.com/openlayers/openlayers/pull/9036) - Remove drag segments of removed features ([@ahocevar](https://github.com/ahocevar))
|
|
||||||
* [#9031](https://github.com/openlayers/openlayers/pull/9031) - Call insertVertexCondition only when a vertex acually can be inserted ([@ludvigeriksson](https://github.com/ludvigeriksson))
|
|
||||||
* [#9029](https://github.com/openlayers/openlayers/pull/9029) - Use camel-cased inheritDoc for consistency ([@OSHistory](https://github.com/OSHistory))
|
|
||||||
* [#9026](https://github.com/openlayers/openlayers/pull/9026) - Update ol-mapbox-style and jsdoc-plugin-typescript ([@ahocevar](https://github.com/ahocevar))
|
|
||||||
* [#9025](https://github.com/openlayers/openlayers/pull/9025) - Remove unused render event ([@ahocevar](https://github.com/ahocevar))
|
|
||||||
* [#9023](https://github.com/openlayers/openlayers/pull/9023) - Fix webgl PointsLayer not rendering anything ([@jahow](https://github.com/jahow))
|
|
||||||
* [#9022](https://github.com/openlayers/openlayers/pull/9022) - Use WebGL even with major performance caveat ([@ahocevar](https://github.com/ahocevar))
|
|
||||||
* [#9020](https://github.com/openlayers/openlayers/pull/9020) - Remove superfluous setTileUrlFunction call ([@ahocevar](https://github.com/ahocevar))
|
|
||||||
* [#9018](https://github.com/openlayers/openlayers/pull/9018) - Duplicate @property for style and renderOrder ([@OSHistory](https://github.com/OSHistory))
|
|
||||||
* [#9012](https://github.com/openlayers/openlayers/pull/9012) - Change projection and urls properties in sources options to optional ([@fredj](https://github.com/fredj))
|
|
||||||
* [#9010](https://github.com/openlayers/openlayers/pull/9010) - Fix ExecutorGroup.js file location in comments ([@fredj](https://github.com/fredj))
|
|
||||||
* [#9009](https://github.com/openlayers/openlayers/pull/9009) - Revert "Simplify import path in examples" ([@fredj](https://github.com/fredj))
|
|
||||||
* [#9005](https://github.com/openlayers/openlayers/pull/9005) - Simplify import path in examples ([@fredj](https://github.com/fredj))
|
|
||||||
* [#9003](https://github.com/openlayers/openlayers/pull/9003) - Remove unused Builder/Executor functions and members ([@ahocevar](https://github.com/ahocevar))
|
|
||||||
* [#9002](https://github.com/openlayers/openlayers/pull/9002) - Fix module path ([@openlayers](https://github.com/openlayers))
|
|
||||||
* [#8996](https://github.com/openlayers/openlayers/pull/8996) - Add imageRatio option for VectorImage layers ([@fredj](https://github.com/fredj))
|
|
||||||
* [#8995](https://github.com/openlayers/openlayers/pull/8995) - Remove leftover comments and code for 'vector' render mode ([@fredj](https://github.com/fredj))
|
|
||||||
* [#8992](https://github.com/openlayers/openlayers/pull/8992) - Use standard tile coords ([@tschaub](https://github.com/tschaub))
|
|
||||||
* [#8994](https://github.com/openlayers/openlayers/pull/8994) - Set projection property in sources options to optional ([@fredj](https://github.com/fredj))
|
|
||||||
* [#8977](https://github.com/openlayers/openlayers/pull/8977) - Add WebGL rendering tests & improve the WebGLHelper API ([@jahow](https://github.com/jahow))
|
|
||||||
* [#8990](https://github.com/openlayers/openlayers/pull/8990) - [Client] Remove renderFrame ([@nicholas-l](https://github.com/nicholas-l))
|
|
||||||
* [#8988](https://github.com/openlayers/openlayers/pull/8988) - Pass along the ability to measure and cache text width ([@tschaub](https://github.com/tschaub))
|
|
||||||
* [#8987](https://github.com/openlayers/openlayers/pull/8987) - Rendering test updates ([@tschaub](https://github.com/tschaub))
|
|
||||||
* [#8983](https://github.com/openlayers/openlayers/pull/8983) - Add issue templates ([@openlayers](https://github.com/openlayers))
|
|
||||||
* [#8982](https://github.com/openlayers/openlayers/pull/8982) - Stacking context for layers, overlays, and controls ([@tschaub](https://github.com/tschaub))
|
|
||||||
* [#8980](https://github.com/openlayers/openlayers/pull/8980) - Change travis references to circleci in doc ([@fredj](https://github.com/fredj))
|
|
||||||
* [#8976](https://github.com/openlayers/openlayers/pull/8976) - Scale tiles instead of canvas ([@ahocevar](https://github.com/ahocevar))
|
|
||||||
* [#8970](https://github.com/openlayers/openlayers/pull/8970) - Fix zIndex positioning ([@ahocevar](https://github.com/ahocevar))
|
|
||||||
* [#8968](https://github.com/openlayers/openlayers/pull/8968) - Use Object.values if available ([@fredj](https://github.com/fredj))
|
|
||||||
* [#8972](https://github.com/openlayers/openlayers/pull/8972) - Remove unused rollup dependency ([@ahocevar](https://github.com/ahocevar))
|
|
||||||
* [#8967](https://github.com/openlayers/openlayers/pull/8967) - Fix webgl types in ol/webgl/PostProcessingPass ([@fredj](https://github.com/fredj))
|
|
||||||
* [#8969](https://github.com/openlayers/openlayers/pull/8969) - Create and use inverse pixel transforms during render ([@tschaub](https://github.com/tschaub))
|
|
||||||
* [#8964](https://github.com/openlayers/openlayers/pull/8964) - Add index to the Collection events ([@fredj](https://github.com/fredj))
|
|
||||||
* [#8915](https://github.com/openlayers/openlayers/pull/8915) - Use CSS z-index to order layers ([@fredj](https://github.com/fredj))
|
|
||||||
* [#8923](https://github.com/openlayers/openlayers/pull/8923) - Use the composite renderer ([@tschaub](https://github.com/tschaub))
|
|
||||||
* [#8951](https://github.com/openlayers/openlayers/pull/8951) - Remove legacy WebGL code & implement a lightweight API for point rendering ([@jahow](https://github.com/jahow))
|
|
||||||
* [#8926](https://github.com/openlayers/openlayers/pull/8926) - Uncouple replay creation and rendering ([@gberaudo](https://github.com/gberaudo))
|
|
||||||
* [#8952](https://github.com/openlayers/openlayers/pull/8952) - Port polygon-style rendering test ([@fredj](https://github.com/fredj))
|
|
||||||
* [#8939](https://github.com/openlayers/openlayers/pull/8939) - Use ol/layer/Layer instead of ol/source/ImageCanvas in d3 example ([@fredj](https://github.com/fredj))
|
|
||||||
* [#8957](https://github.com/openlayers/openlayers/pull/8957) - Fix JSdoc type cast format ([@fredj](https://github.com/fredj))
|
|
||||||
* [#8934](https://github.com/openlayers/openlayers/pull/8934) - Port layer tiles rendering tests ([@fgravin](https://github.com/fgravin))
|
|
||||||
* [#8944](https://github.com/openlayers/openlayers/pull/8944) - Use a layer for the graticule instead of a control ([@jahow](https://github.com/jahow))
|
|
||||||
* [#8948](https://github.com/openlayers/openlayers/pull/8948) - Add rotation in mapbox-gl example ([@fgravin](https://github.com/fgravin))
|
|
||||||
* [#8953](https://github.com/openlayers/openlayers/pull/8953) - Store rendering artifacts immediately after run tests ([@fredj](https://github.com/fredj))
|
|
||||||
* [#8950](https://github.com/openlayers/openlayers/pull/8950) - Use shx to run unix commands in package.json ([@fredj](https://github.com/fredj))
|
|
||||||
* [#8946](https://github.com/openlayers/openlayers/pull/8946) - Make the map renderer tolerant of layers without renderers ([@tschaub](https://github.com/tschaub))
|
|
||||||
* [#8943](https://github.com/openlayers/openlayers/pull/8943) - Port text style rendering tests ([@fredj](https://github.com/fredj))
|
|
||||||
* [#8940](https://github.com/openlayers/openlayers/pull/8940) - Make layers mandatory in the OverviewMap control ([@jahow](https://github.com/jahow))
|
|
||||||
* [#8938](https://github.com/openlayers/openlayers/pull/8938) - Port render-toContext rendering test ([@fredj](https://github.com/fredj))
|
|
||||||
* [#8941](https://github.com/openlayers/openlayers/pull/8941) - Rendering tests render message ([@fredj](https://github.com/fredj))
|
|
||||||
* [#8933](https://github.com/openlayers/openlayers/pull/8933) - Port icon-symbol-svg rendering test ([@fredj](https://github.com/fredj))
|
|
||||||
* [#8931](https://github.com/openlayers/openlayers/pull/8931) - Add Mapbox-gl-js example ([@fgravin](https://github.com/fgravin))
|
|
||||||
* [#8937](https://github.com/openlayers/openlayers/pull/8937) - Make the tile debug source useful for understanding tiles ([@tschaub](https://github.com/tschaub))
|
|
||||||
* [#8930](https://github.com/openlayers/openlayers/pull/8930) - Give the layers container a CSS class name ([@fredj](https://github.com/fredj))
|
|
||||||
* [#8914](https://github.com/openlayers/openlayers/pull/8914) - Add new className property to ol/layer/Base ([@fredj](https://github.com/fredj))
|
|
||||||
* [#8910](https://github.com/openlayers/openlayers/pull/8910) - Implements containsXY for all geometries ([@fredj](https://github.com/fredj))
|
|
||||||
* [#8922](https://github.com/openlayers/openlayers/pull/8922) - Layer is reponsible for its renderer ([@fgravin](https://github.com/fgravin))
|
|
||||||
* [#8936](https://github.com/openlayers/openlayers/pull/8936) - Serve sourcemaps from webpack during rendering tests ([@tschaub](https://github.com/tschaub))
|
|
||||||
* [#8932](https://github.com/openlayers/openlayers/pull/8932) - Add pbf TypeScript type definitions ([@fredj](https://github.com/fredj))
|
|
||||||
* [#8924](https://github.com/openlayers/openlayers/pull/8924) - Reuse vector tile replays for interim tiles ([@ahocevar](https://github.com/ahocevar))
|
|
||||||
* [#8918](https://github.com/openlayers/openlayers/pull/8918) - Use dom-to-image-more library in export-map ([@fredj](https://github.com/fredj))
|
|
||||||
* [#8928](https://github.com/openlayers/openlayers/pull/8928) - Add vector tile example using ol-mapbox-style ([@ahocevar](https://github.com/ahocevar))
|
|
||||||
* [#8925](https://github.com/openlayers/openlayers/pull/8925) - Don't compute value more that once, remove unneeded type cast ([@fredj](https://github.com/fredj))
|
|
||||||
* [#8927](https://github.com/openlayers/openlayers/pull/8927) - Use local data for rendering tests ([@tschaub](https://github.com/tschaub))
|
|
||||||
* [#8920](https://github.com/openlayers/openlayers/pull/8920) - Remove unneeded 'relative' positioning ([@fredj](https://github.com/fredj))
|
|
||||||
* [#8913](https://github.com/openlayers/openlayers/pull/8913) - Implement renderFrame function for intermediate canvas renderer ([@fgravin](https://github.com/fgravin))
|
|
||||||
* [#8916](https://github.com/openlayers/openlayers/pull/8916) - Move canvas creation to intermediate canvas renderer constructor ([@tschaub](https://github.com/tschaub))
|
|
||||||
* [#8917](https://github.com/openlayers/openlayers/pull/8917) - Apply all transforms in the layer renderer ([@tschaub](https://github.com/tschaub))
|
|
||||||
* [#8912](https://github.com/openlayers/openlayers/pull/8912) - Rotation support in the composite renderer ([@tschaub](https://github.com/tschaub))
|
|
||||||
* [#8908](https://github.com/openlayers/openlayers/pull/8908) - Handle layer opacity in the composite renderer ([@tschaub](https://github.com/tschaub))
|
|
||||||
* [#8848](https://github.com/openlayers/openlayers/pull/8848) - Make layer renderers explicit layer dependencies ([@tschaub](https://github.com/tschaub))
|
|
||||||
* [#8892](https://github.com/openlayers/openlayers/pull/8892) - Use the right device orientation property in example ([@fredj](https://github.com/fredj))
|
|
||||||
* [#8904](https://github.com/openlayers/openlayers/pull/8904) - Add support for a default index page in the rendering tests ([@tschaub](https://github.com/tschaub))
|
|
||||||
* [#8903](https://github.com/openlayers/openlayers/pull/8903) - Additional render tests ([@tschaub](https://github.com/tschaub))
|
|
||||||
* [#8895](https://github.com/openlayers/openlayers/pull/8895) - New rendering tests ([@tschaub](https://github.com/tschaub))
|
|
||||||
* [#8893](https://github.com/openlayers/openlayers/pull/8893) - Add proj.js to the sideEffects list ([@fredj](https://github.com/fredj))
|
|
||||||
* [#8887](https://github.com/openlayers/openlayers/pull/8887) - Changes for 5.3.0 ([@openlayers](https://github.com/openlayers))
|
|
||||||
|
|
||||||
|
|
||||||
<details>
|
|
||||||
<summary>Dependency Updates</summary>
|
|
||||||
|
|
||||||
* [#9990](https://github.com/openlayers/openlayers/pull/9990) - Update handlebars to the latest version 🚀 ([@openlayers](https://github.com/openlayers))
|
|
||||||
* [#9987](https://github.com/openlayers/openlayers/pull/9987) - Update webpack to the latest version 🚀 ([@openlayers](https://github.com/openlayers))
|
|
||||||
* [#9972](https://github.com/openlayers/openlayers/pull/9972) - Update handlebars to the latest version 🚀 ([@openlayers](https://github.com/openlayers))
|
|
||||||
* [#9952](https://github.com/openlayers/openlayers/pull/9952) - Update handlebars to the latest version ([@openlayers](https://github.com/openlayers))
|
|
||||||
* [#9932](https://github.com/openlayers/openlayers/pull/9932) - Greenkeeper/webpack 4.40.2 ([@openlayers](https://github.com/openlayers))
|
|
||||||
* [#9928](https://github.com/openlayers/openlayers/pull/9928) - Update puppeteer to the latest version 🚀 ([@openlayers](https://github.com/openlayers))
|
|
||||||
* [#9926](https://github.com/openlayers/openlayers/pull/9926) - Update webpack to the latest version 🚀 ([@openlayers](https://github.com/openlayers))
|
|
||||||
* [#9914](https://github.com/openlayers/openlayers/pull/9914) - Greenkeeper/terser webpack plugin 2.0.1 ([@openlayers](https://github.com/openlayers))
|
|
||||||
* [#9886](https://github.com/openlayers/openlayers/pull/9886) - Update webpack to the latest version 🚀 ([@openlayers](https://github.com/openlayers))
|
|
||||||
* [#9880](https://github.com/openlayers/openlayers/pull/9880) - Greenkeeper/karma coverage 2.0.1 ([@openlayers](https://github.com/openlayers))
|
|
||||||
* [#9876](https://github.com/openlayers/openlayers/pull/9876) - Update yargs to the latest version 🚀 ([@openlayers](https://github.com/openlayers))
|
|
||||||
* [#9856](https://github.com/openlayers/openlayers/pull/9856) - Update webpack to the latest version 🚀 ([@openlayers](https://github.com/openlayers))
|
|
||||||
* [#9857](https://github.com/openlayers/openlayers/pull/9857) - Update karma-chrome-launcher to the latest version 🚀 ([@openlayers](https://github.com/openlayers))
|
|
||||||
* [#9817](https://github.com/openlayers/openlayers/pull/9817) - Update webpack to the latest version 🚀 ([@openlayers](https://github.com/openlayers))
|
|
||||||
* [#9827](https://github.com/openlayers/openlayers/pull/9827) - Update coveralls to the latest version 🚀 ([@openlayers](https://github.com/openlayers))
|
|
||||||
* [#9816](https://github.com/openlayers/openlayers/pull/9816) - Update webpack to the latest version 🚀 ([@openlayers](https://github.com/openlayers))
|
|
||||||
* [#9801](https://github.com/openlayers/openlayers/pull/9801) - Update webpack to the latest version 🚀 ([@openlayers](https://github.com/openlayers))
|
|
||||||
* [#9795](https://github.com/openlayers/openlayers/pull/9795) - Update webpack to the latest version 🚀 ([@openlayers](https://github.com/openlayers))
|
|
||||||
* [#9793](https://github.com/openlayers/openlayers/pull/9793) - Update puppeteer to the latest version 🚀 ([@openlayers](https://github.com/openlayers))
|
|
||||||
* [#9787](https://github.com/openlayers/openlayers/pull/9787) - Update mocha to the latest version 🚀 ([@openlayers](https://github.com/openlayers))
|
|
||||||
* [#9786](https://github.com/openlayers/openlayers/pull/9786) - chore(package): update webpack to version 4.36.1 ([@openlayers](https://github.com/openlayers))
|
|
||||||
* [#9775](https://github.com/openlayers/openlayers/pull/9775) - Update jsdoc to the latest version 🚀 ([@openlayers](https://github.com/openlayers))
|
|
||||||
* [#9772](https://github.com/openlayers/openlayers/pull/9772) - Update karma-chrome-launcher to the latest version 🚀 ([@openlayers](https://github.com/openlayers))
|
|
||||||
* [#9769](https://github.com/openlayers/openlayers/pull/9769) - Update coveralls to the latest version 🚀 ([@openlayers](https://github.com/openlayers))
|
|
||||||
* [#9759](https://github.com/openlayers/openlayers/pull/9759) - Update marked to the latest version 🚀 ([@openlayers](https://github.com/openlayers))
|
|
||||||
* [#9763](https://github.com/openlayers/openlayers/pull/9763) - Update webpack to the latest version 🚀 ([@openlayers](https://github.com/openlayers))
|
|
||||||
* [#9744](https://github.com/openlayers/openlayers/pull/9744) - chore(package): update webpack to version 4.35.2 ([@openlayers](https://github.com/openlayers))
|
|
||||||
* [#9738](https://github.com/openlayers/openlayers/pull/9738) - Update marked to the latest version 🚀 ([@openlayers](https://github.com/openlayers))
|
|
||||||
* [#9737](https://github.com/openlayers/openlayers/pull/9737) - Update globby to the latest version 🚀 ([@openlayers](https://github.com/openlayers))
|
|
||||||
* [#9703](https://github.com/openlayers/openlayers/pull/9703) - Update eslint to the latest version 🚀 ([@openlayers](https://github.com/openlayers))
|
|
||||||
* [#9698](https://github.com/openlayers/openlayers/pull/9698) - Update puppeteer to the latest version 🚀 ([@openlayers](https://github.com/openlayers))
|
|
||||||
* [#9695](https://github.com/openlayers/openlayers/pull/9695) - Update webpack to the latest version 🚀 ([@openlayers](https://github.com/openlayers))
|
|
||||||
* [#9673](https://github.com/openlayers/openlayers/pull/9673) - Update webpack to the latest version 🚀 ([@openlayers](https://github.com/openlayers))
|
|
||||||
* [#9660](https://github.com/openlayers/openlayers/pull/9660) - Update pixelmatch to the latest version 🚀 ([@openlayers](https://github.com/openlayers))
|
|
||||||
* [#9653](https://github.com/openlayers/openlayers/pull/9653) - Update coveralls to the latest version 🚀 ([@openlayers](https://github.com/openlayers))
|
|
||||||
* [#9649](https://github.com/openlayers/openlayers/pull/9649) - Update webpack to the latest version 🚀 ([@openlayers](https://github.com/openlayers))
|
|
||||||
* [#9598](https://github.com/openlayers/openlayers/pull/9598) - Update puppeteer to the latest version 🚀 ([@openlayers](https://github.com/openlayers))
|
|
||||||
* [#9594](https://github.com/openlayers/openlayers/pull/9594) - Update webpack to the latest version 🚀 ([@openlayers](https://github.com/openlayers))
|
|
||||||
* [#9589](https://github.com/openlayers/openlayers/pull/9589) - Update webpack to the latest version 🚀 ([@openlayers](https://github.com/openlayers))
|
|
||||||
* [#9586](https://github.com/openlayers/openlayers/pull/9586) - Update rollup-plugin-terser to the latest version 🚀 ([@openlayers](https://github.com/openlayers))
|
|
||||||
* [#9553](https://github.com/openlayers/openlayers/pull/9553) - chore(package): update ol-mapbox-style to version 5.0.0-beta.2 ([@openlayers](https://github.com/openlayers))
|
|
||||||
* [#9528](https://github.com/openlayers/openlayers/pull/9528) - Update puppeteer to the latest version 🚀 ([@openlayers](https://github.com/openlayers))
|
|
||||||
* [#9517](https://github.com/openlayers/openlayers/pull/9517) - Update jsdoc to the latest version 🚀 ([@openlayers](https://github.com/openlayers))
|
|
||||||
* [#9515](https://github.com/openlayers/openlayers/pull/9515) - Update fs-extra to the latest version 🚀 ([@openlayers](https://github.com/openlayers))
|
|
||||||
* [#9508](https://github.com/openlayers/openlayers/pull/9508) - Update webpack to the latest version 🚀 ([@openlayers](https://github.com/openlayers))
|
|
||||||
* [#9486](https://github.com/openlayers/openlayers/pull/9486) - Update jquery to the latest version 🚀 ([@openlayers](https://github.com/openlayers))
|
|
||||||
* [#9468](https://github.com/openlayers/openlayers/pull/9468) - Update puppeteer to the latest version 🚀 ([@openlayers](https://github.com/openlayers))
|
|
||||||
* [#9444](https://github.com/openlayers/openlayers/pull/9444) - Update mocha to the latest version 🚀 ([@openlayers](https://github.com/openlayers))
|
|
||||||
* [#9432](https://github.com/openlayers/openlayers/pull/9432) - Update handlebars to the latest version 🚀 ([@openlayers](https://github.com/openlayers))
|
|
||||||
* [#9431](https://github.com/openlayers/openlayers/pull/9431) - Update webpack to the latest version 🚀 ([@openlayers](https://github.com/openlayers))
|
|
||||||
* [#9427](https://github.com/openlayers/openlayers/pull/9427) - Update mocha to the latest version 🚀 ([@openlayers](https://github.com/openlayers))
|
|
||||||
* [#9420](https://github.com/openlayers/openlayers/pull/9420) - Update jquery to the latest version 🚀 ([@openlayers](https://github.com/openlayers))
|
|
||||||
* [#9412](https://github.com/openlayers/openlayers/pull/9412) - Update mocha to the latest version 🚀 ([@openlayers](https://github.com/openlayers))
|
|
||||||
* [#9408](https://github.com/openlayers/openlayers/pull/9408) - chore(package): update mocha to version 6.1.1 ([@openlayers](https://github.com/openlayers))
|
|
||||||
* [#9406](https://github.com/openlayers/openlayers/pull/9406) - Update clean-css-cli to the latest version 🚀 ([@openlayers](https://github.com/openlayers))
|
|
||||||
* [#9405](https://github.com/openlayers/openlayers/pull/9405) - Update marked to the latest version 🚀 ([@openlayers](https://github.com/openlayers))
|
|
||||||
* [#9387](https://github.com/openlayers/openlayers/pull/9387) - Update puppeteer to the latest version 🚀 ([@openlayers](https://github.com/openlayers))
|
|
||||||
* [#9342](https://github.com/openlayers/openlayers/pull/9342) - Update handlebars to the latest version 🚀 ([@openlayers](https://github.com/openlayers))
|
|
||||||
* [#9311](https://github.com/openlayers/openlayers/pull/9311) - Update pbf to the latest version 🚀 ([@openlayers](https://github.com/openlayers))
|
|
||||||
* [#9285](https://github.com/openlayers/openlayers/pull/9285) - Update globby to the latest version 🚀 ([@openlayers](https://github.com/openlayers))
|
|
||||||
* [#9280](https://github.com/openlayers/openlayers/pull/9280) - Update ol-mapbox-style to the latest version 🚀 ([@openlayers](https://github.com/openlayers))
|
|
||||||
* [#9279](https://github.com/openlayers/openlayers/pull/9279) - Update webpack to the latest version 🚀 ([@openlayers](https://github.com/openlayers))
|
|
||||||
* [#9268](https://github.com/openlayers/openlayers/pull/9268) - Update mocha to the latest version 🚀 ([@openlayers](https://github.com/openlayers))
|
|
||||||
* [#9261](https://github.com/openlayers/openlayers/pull/9261) - Update coveralls to the latest version 🚀 ([@openlayers](https://github.com/openlayers))
|
|
||||||
* [#9256](https://github.com/openlayers/openlayers/pull/9256) - Update mocha to the latest version 🚀 ([@openlayers](https://github.com/openlayers))
|
|
||||||
* [#9247](https://github.com/openlayers/openlayers/pull/9247) - Update copy-webpack-plugin to the latest version 🚀 ([@openlayers](https://github.com/openlayers))
|
|
||||||
* [#9242](https://github.com/openlayers/openlayers/pull/9242) - Update marked to the latest version 🚀 ([@openlayers](https://github.com/openlayers))
|
|
||||||
* [#9238](https://github.com/openlayers/openlayers/pull/9238) - Update mocha to the latest version 🚀 ([@openlayers](https://github.com/openlayers))
|
|
||||||
* [#9232](https://github.com/openlayers/openlayers/pull/9232) - Update webpack to the latest version 🚀 ([@openlayers](https://github.com/openlayers))
|
|
||||||
* [#9225](https://github.com/openlayers/openlayers/pull/9225) - Update webpack to the latest version 🚀 ([@openlayers](https://github.com/openlayers))
|
|
||||||
* [#9207](https://github.com/openlayers/openlayers/pull/9207) - Update yargs to the latest version 🚀 ([@openlayers](https://github.com/openlayers))
|
|
||||||
* [#9195](https://github.com/openlayers/openlayers/pull/9195) - Update handlebars to the latest version 🚀 ([@openlayers](https://github.com/openlayers))
|
|
||||||
* [#9194](https://github.com/openlayers/openlayers/pull/9194) - chore(package): update webpack to version 4.29.3 ([@openlayers](https://github.com/openlayers))
|
|
||||||
* [#9185](https://github.com/openlayers/openlayers/pull/9185) - Update webpack to the latest version 🚀 ([@openlayers](https://github.com/openlayers))
|
|
||||||
* [#9148](https://github.com/openlayers/openlayers/pull/9148) - Update karma to the latest version 🚀 ([@openlayers](https://github.com/openlayers))
|
|
||||||
* [#9124](https://github.com/openlayers/openlayers/pull/9124) - Update sinon to the latest version 🚀 ([@openlayers](https://github.com/openlayers))
|
|
||||||
* [#9127](https://github.com/openlayers/openlayers/pull/9127) - Update webpack to the latest version 🚀 ([@openlayers](https://github.com/openlayers))
|
|
||||||
* [#9108](https://github.com/openlayers/openlayers/pull/9108) - Update webpack to the latest version 🚀 ([@openlayers](https://github.com/openlayers))
|
|
||||||
* [#9095](https://github.com/openlayers/openlayers/pull/9095) - Update marked to the latest version 🚀 ([@openlayers](https://github.com/openlayers))
|
|
||||||
* [#9092](https://github.com/openlayers/openlayers/pull/9092) - Update webpack to the latest version 🚀 ([@openlayers](https://github.com/openlayers))
|
|
||||||
* [#9085](https://github.com/openlayers/openlayers/pull/9085) - Update webpack to the latest version 🚀 ([@openlayers](https://github.com/openlayers))
|
|
||||||
* [#9080](https://github.com/openlayers/openlayers/pull/9080) - Update webpack to the latest version 🚀 ([@openlayers](https://github.com/openlayers))
|
|
||||||
* [#9076](https://github.com/openlayers/openlayers/pull/9076) - Update webpack to the latest version 🚀 ([@openlayers](https://github.com/openlayers))
|
|
||||||
* [#9037](https://github.com/openlayers/openlayers/pull/9037) - Update webpack to the latest version 🚀 ([@openlayers](https://github.com/openlayers))
|
|
||||||
* [#9032](https://github.com/openlayers/openlayers/pull/9032) - Update webpack to the latest version 🚀 ([@openlayers](https://github.com/openlayers))
|
|
||||||
* [#9004](https://github.com/openlayers/openlayers/pull/9004) - Update webpack to the latest version 🚀 ([@openlayers](https://github.com/openlayers))
|
|
||||||
* [#8989](https://github.com/openlayers/openlayers/pull/8989) - Update marked to the latest version 🚀 ([@openlayers](https://github.com/openlayers))
|
|
||||||
* [#8978](https://github.com/openlayers/openlayers/pull/8978) - Update webpack to the latest version 🚀 ([@openlayers](https://github.com/openlayers))
|
|
||||||
* [#8966](https://github.com/openlayers/openlayers/pull/8966) - Update rollup to the latest version 🚀 ([@openlayers](https://github.com/openlayers))
|
|
||||||
* [#8963](https://github.com/openlayers/openlayers/pull/8963) - Update rollup to the latest version 🚀 ([@openlayers](https://github.com/openlayers))
|
|
||||||
* [#8905](https://github.com/openlayers/openlayers/pull/8905) - Update rollup to the latest version 🚀 ([@openlayers](https://github.com/openlayers))
|
|
||||||
* [#8902](https://github.com/openlayers/openlayers/pull/8902) - Update rollup to the latest version 🚀 ([@openlayers](https://github.com/openlayers))
|
|
||||||
|
|
||||||
|
|
||||||
</details>
|
|
||||||
@@ -1,43 +1,43 @@
|
|||||||
<table><tr>
|
<table><tr>
|
||||||
<th width="33.3%">Map</th><th width="33.3%">View</th><th width="33.3%">Layers</th>
|
<th width="33.3%">Map</th><th width="33.3%">View</th><th width="33.3%">Layers</th>
|
||||||
</tr><tr>
|
</tr><tr>
|
||||||
<td><p>A <a href="module-ol_Map-Map.html">map</a> is made of <a href="module-ol_layer_Base-BaseLayer.html">layers</a>, a <a href="module-ol_View-View.html">view</a> to visualize them, <a href="module-ol_interaction_Interaction-Interaction.html">interactions</a> to modify map content and <a href="module-ol_control_Control-Control.html">controls</a> with UI components.</p>
|
<td><p>A [map](module-ol_Map-Map.html) is made of [layers](module-ol_layer_Base-BaseLayer.html), a [view](module-ol_View-View.html) to visualize them, [interactions](module-ol_interaction_Interaction-Interaction.html) to modify map content and [controls](module-ol_control_Control-Control.html) with UI components.</p>
|
||||||
<a href="module-ol_Map-Map.html">Overview</a><br>
|
[Overview](module-ol_Map-Map.html)<br>
|
||||||
<a href="module-ol_Map-Map.html#Map">Creation</a><br>
|
[Creation](module-ol_Map-Map.html#Map)<br>
|
||||||
<a href="module-ol_MapBrowserEvent-MapBrowserEvent.html">Events</a></td>
|
[Events](module-ol_MapBrowserEvent-MapBrowserEvent.html)</td>
|
||||||
<td><p>The view manages the visual parameters of the map view, like resolution or rotation.</p>
|
<td><p>The view manages the visual parameters of the map view, like resolution or rotation.</p>
|
||||||
<a href="module-ol_View-View.html">View</a> with center, projection, resolution and rotation</td>
|
[View](module-ol_View-View.html) with center, projection, resolution and rotation</td>
|
||||||
<td><p>Layers are lightweight containers that get their data from <a href="module-ol_source_Source-Source.html">sources</a>.</p>
|
<td><p>Layers are lightweight containers that get their data from [sources](module-ol_source_Source-Source.html).</p>
|
||||||
<a href="module-ol_layer_Tile-TileLayer.html">ol/layer/Tile</a><br>
|
[ol/layer/Tile](module-ol_layer_Tile-TileLayer.html)<br>
|
||||||
<a href="module-ol_layer_Image-ImageLayer.html">ol/layer/Image</a><br>
|
[ol/layer/Image](module-ol_layer_Image-ImageLayer.html)<br>
|
||||||
<a href="module-ol_layer_Vector-VectorLayer.html">ol/layer/Vector</a><br>
|
[ol/layer/Vector](module-ol_layer_Vector-VectorLayer.html)<br>
|
||||||
<a href="module-ol_layer_VectorTile-VectorTileLayer.html">ol/layer/VectorTile</a></td>
|
[ol/layer/VectorTile](module-ol_layer_VectorTile-VectorTileLayer.html)</td>
|
||||||
</tr><tr>
|
</tr><tr>
|
||||||
<th>Controls</th><th>Interactions</th><th>Sources and formats</th>
|
<th>Controls</th><th>Interactions</th><th>Sources and formats</th>
|
||||||
</tr><tr>
|
</tr><tr>
|
||||||
<td><a href="module-ol_control.html#.defaults">Map default controls</a><br>
|
<td>[Map default controls](module-ol_control_util.html#.defaults)<br>
|
||||||
<a href="module-ol_control_Control-Control.html">All controls</a>
|
[All controls](module-ol_control_Control-Control.html)
|
||||||
</td>
|
</td>
|
||||||
<td>
|
<td>
|
||||||
<a href="module-ol_interaction.html#~defaults">Map default interactions</a><br>
|
[Map default interactions](module-ol_interaction.html#~defaults)<br>
|
||||||
Interactions for <a href="module-ol_Feature-Feature.html">vector features</a>
|
Interactions for [vector features](module-ol_Feature-Feature.html)
|
||||||
<ul><li><a href="module-ol_interaction_Select-Select.html">ol/interaction/Select</a></li>
|
<ul><li>[ol/interaction/Select](module-ol_interaction_Select-Select.html)</li>
|
||||||
<li><a href="module-ol_interaction_Draw-Draw.html">ol/interaction/Draw</a></li>
|
<li>[ol/interaction/Draw](module-ol_interaction_Draw-Draw.html)</li>
|
||||||
<li><a href="module-ol_interaction_Modify-Modify.html">ol/interaction/Modify</a></li></ul>
|
<li>[ol/interaction/Modify](module-ol_interaction_Modify-Modify.html)</li></ul>
|
||||||
<a href="module-ol_interaction_Interaction-Interaction.html">All interactions</a></td>
|
[All interactions](module-ol_interaction_Interaction-Interaction.html)</td>
|
||||||
<td><a href="module-ol_source_Tile-TileSource.html">Tile sources</a> for <a href="module-ol_layer_Tile-TileLayer.html">ol/layer/Tile</a>
|
<td>[Tile sources](module-ol_source_Tile-TileSource.html) for [ol/layer/Tile](module-ol_layer_Tile-TileLayer.html)
|
||||||
<br><a href="module-ol_source_Image-ImageSource.html">Image sources</a> for <a href="module-ol_layer_Image-ImageLayer.html">ol/layer/Image</a>
|
<br>[Image sources](module-ol_source_Image-ImageSource.html) for [ol/layer/Image](module-ol_layer_Image-ImageLayer.html)
|
||||||
<br><a href="module-ol_source_Vector-VectorSource.html">Vector sources</a> for <a href="module-ol_layer_Vector-VectorLayer.html">ol/layer/Vector</a>
|
<br>[Vector sources](module-ol_source_Vector-VectorSource.html) for [ol/layer/Vector](module-ol_layer_Vector-VectorLayer.html)
|
||||||
<br><a href="module-ol_source_VectorTile-VectorTile.html">Vector tile sources</a> for <a href="module-ol_layer_VectorTile-VectorTileLayer.html">ol/layer/VectorTile</a>
|
<br>[Vector tile sources](module-ol_source_VectorTile-VectorTile.html) for [ol/layer/VectorTile](module-ol_layer_VectorTile-VectorTileLayer.html)
|
||||||
<br><a href="module-ol_format_Feature-FeatureFormat.html">Formats</a> for reading/writing vector data
|
<br>[Formats](module-ol_format_Feature-FeatureFormat.html) for reading/writing vector data
|
||||||
<br><a href="module-ol_format_WMSCapabilities-WMSCapabilities.html">ol/format/WMSCapabilities</a></td></tr>
|
<br>[ol/format/WMSCapabilities](module-ol_format_WMSCapabilities-WMSCapabilities.html)</td></tr>
|
||||||
<tr><th>Projections</th><th>Observable objects</th><th>Other components</th></tr>
|
<tr><th>Projections</th><th>Observable objects</th><th>Other components</th></tr>
|
||||||
<tr><td><p>All coordinates and extents need to be provided in view projection (default: EPSG:3857). To transform, use <a href="module-ol_proj.html#.transform">ol/proj#transform()</a> and <a href="module-ol_proj.html#.transformExtent">ol/proj#transformExtent()</a>.</p>
|
<tr><td><p>All coordinates and extents need to be provided in view projection (default: EPSG:3857). To transform, use [ol/proj#transform()](module-ol_proj.html#.transform) and [ol/proj#transformExtent()](module-ol_proj.html#.transformExtent).</p>
|
||||||
<a href="module-ol_proj.html">ol/proj</a></td>
|
[ol/proj](module-ol_proj.html)</td>
|
||||||
<td><p>Changes to all <a href="module-ol_Object-BaseObject.html">ol/Object</a>s can be observed by calling the <a href="module-ol_Object-BaseObject.html#on">object.on('propertychange')</a> method. Listeners receive an <a href="module-ol_Object-ObjectEvent.html">ol/Object.ObjectEvent</a> with information on the changed property and old value.</p>
|
<td><p>Changes to all [ol/Object](module-ol_Object-BaseObject.html)s can be observed by calling the [object.on('propertychange')](module-ol_Object-BaseObject.html#on) method. Listeners receive an [ol/Object.ObjectEvent](module-ol_Object-ObjectEvent.html) with information on the changed property and old value.</p>
|
||||||
<td>
|
<td>
|
||||||
<a href="module-ol_Geolocation.html">ol/Geolocation</a><br>
|
[ol/Geolocation](module-ol_Geolocation.html)<br>
|
||||||
<a href="module-ol_Overlay-Overlay.html">ol/Overlay</a><br></td>
|
[ol/Overlay](module-ol_Overlay-Overlay.html)<br></td>
|
||||||
</tr></table>
|
</tr></table>
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -31,24 +31,6 @@ function hasApiMembers(doclet) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function includeAugments(doclet) {
|
function includeAugments(doclet) {
|
||||||
// Make sure that `observables` and `fires` are taken from an already processed `class` doclet.
|
|
||||||
// This is necessary because JSDoc generates multiple doclets with the same longname.
|
|
||||||
const cls = classes[doclet.longname];
|
|
||||||
if (cls.observables && !doclet.observables) {
|
|
||||||
doclet.observables = cls.observables;
|
|
||||||
}
|
|
||||||
if (doclet.fires && cls.fires) {
|
|
||||||
for (let i = 0, ii = cls.fires.length; i < ii; ++i) {
|
|
||||||
const fires = cls.fires[i];
|
|
||||||
if (doclet.fires.indexOf(fires) == -1) {
|
|
||||||
doclet.fires.push(fires);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (cls.fires && !doclet.fires) {
|
|
||||||
doclet.fires = cls.fires;
|
|
||||||
}
|
|
||||||
|
|
||||||
const augments = doclet.augments;
|
const augments = doclet.augments;
|
||||||
if (augments) {
|
if (augments) {
|
||||||
let cls;
|
let cls;
|
||||||
@@ -77,9 +59,7 @@ function includeAugments(doclet) {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
cls._hideConstructor = true;
|
cls._hideConstructor = true;
|
||||||
if (!cls.undocumented) {
|
delete cls.undocumented;
|
||||||
cls._documented = true;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -166,13 +146,10 @@ exports.handlers = {
|
|||||||
// constructor from the docs.
|
// constructor from the docs.
|
||||||
doclet._hideConstructor = true;
|
doclet._hideConstructor = true;
|
||||||
includeAugments(doclet);
|
includeAugments(doclet);
|
||||||
} else if (!doclet._hideConstructor && !(doclet.kind == 'typedef' && doclet.longname in types)) {
|
} else if (doclet.undocumented !== false && !doclet._hideConstructor && !(doclet.kind == 'typedef' && doclet.longname in types)) {
|
||||||
// Remove all other undocumented symbols
|
// Remove all other undocumented symbols
|
||||||
doclet.undocumented = true;
|
doclet.undocumented = true;
|
||||||
}
|
}
|
||||||
if (doclet._documented) {
|
|
||||||
delete doclet.undocumented;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,29 +1,32 @@
|
|||||||
const events = {};
|
const events = {};
|
||||||
|
const classes = {};
|
||||||
|
|
||||||
exports.handlers = {
|
exports.handlers = {
|
||||||
|
|
||||||
newDoclet: function(e) {
|
newDoclet: function(e) {
|
||||||
const doclet = e.doclet;
|
const doclet = e.doclet;
|
||||||
if (doclet.kind !== 'event') {
|
let cls;
|
||||||
return;
|
if (doclet.kind == 'event') {
|
||||||
|
cls = doclet.longname.split('#')[0];
|
||||||
|
if (!(cls in events)) {
|
||||||
|
events[cls] = [];
|
||||||
|
}
|
||||||
|
events[cls].push(doclet.longname);
|
||||||
|
} else if (doclet.kind == 'class' && !(doclet.longname in classes)) {
|
||||||
|
classes[doclet.longname] = doclet;
|
||||||
}
|
}
|
||||||
|
|
||||||
const cls = doclet.longname.split('#')[0];
|
|
||||||
if (!(cls in events)) {
|
|
||||||
events[cls] = [];
|
|
||||||
}
|
|
||||||
events[cls].push(doclet.longname);
|
|
||||||
},
|
},
|
||||||
|
|
||||||
parseComplete: function(e) {
|
parseComplete: function(e) {
|
||||||
const doclets = e.doclets;
|
const doclets = e.doclets;
|
||||||
for (let i = 0, ii = doclets.length - 1; i < ii; ++i) {
|
let doclet, i, ii, j, jj, event, fires;
|
||||||
const doclet = doclets[i];
|
for (i = 0, ii = doclets.length - 1; i < ii; ++i) {
|
||||||
|
doclet = doclets[i];
|
||||||
if (doclet.fires) {
|
if (doclet.fires) {
|
||||||
if (doclet.kind == 'class') {
|
if (doclet.kind == 'class') {
|
||||||
const fires = [];
|
fires = [];
|
||||||
for (let j = 0, jj = doclet.fires.length; j < jj; ++j) {
|
for (j = 0, jj = doclet.fires.length; j < jj; ++j) {
|
||||||
const event = doclet.fires[j].replace('event:', '');
|
event = doclet.fires[j].replace('event:', '');
|
||||||
if (events[event]) {
|
if (events[event]) {
|
||||||
fires.push.apply(fires, events[event]);
|
fires.push.apply(fires, events[event]);
|
||||||
} else if (doclet.fires[j] !== 'event:ObjectEvent') {
|
} else if (doclet.fires[j] !== 'event:ObjectEvent') {
|
||||||
|
|||||||
@@ -1,8 +1,12 @@
|
|||||||
/*
|
/*
|
||||||
* This is a hack to prevent inheritDoc tags from entirely removing
|
* This is a hack to prevent inheritDoc tags from entirely removing
|
||||||
* documentation of the method that inherits the documentation.
|
* documentation of the method that inherits the documentation.
|
||||||
|
*
|
||||||
|
* TODO: Remove this hack when https://github.com/jsdoc3/jsdoc/issues/53
|
||||||
|
* is addressed.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
exports.defineTags = function(dictionary) {
|
exports.defineTags = function(dictionary) {
|
||||||
dictionary.defineTag('inheritDoc', {
|
dictionary.defineTag('inheritDoc', {
|
||||||
mustHaveValue: false,
|
mustHaveValue: false,
|
||||||
@@ -88,15 +92,10 @@ exports.handlers = {
|
|||||||
incompleteDoclet.stability = stability;
|
incompleteDoclet.stability = stability;
|
||||||
for (key in candidate) {
|
for (key in candidate) {
|
||||||
if (candidate.hasOwnProperty(key) &&
|
if (candidate.hasOwnProperty(key) &&
|
||||||
keepKeys.indexOf(key) == -1) {
|
keepKeys.indexOf(key) == -1) {
|
||||||
incompleteDoclet[key] = candidate[key];
|
incompleteDoclet[key] = candidate[key];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// We have found a matching parent doc and applied it so we
|
|
||||||
// don't want to ignore this doclet anymore.
|
|
||||||
incompleteDoclet.ignore = false;
|
|
||||||
// We found a match so we can stop break
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -214,39 +214,55 @@ function buildNav(members) {
|
|||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
});
|
});
|
||||||
|
|
||||||
function createEntry(type, v) {
|
|
||||||
return {
|
|
||||||
type: type,
|
|
||||||
longname: v.longname,
|
|
||||||
name: v.name,
|
|
||||||
classes: find({
|
|
||||||
kind: 'class',
|
|
||||||
memberof: v.longname
|
|
||||||
}).map(createEntry.bind(this, 'class')),
|
|
||||||
members: find({
|
|
||||||
kind: 'member',
|
|
||||||
memberof: v.longname
|
|
||||||
}),
|
|
||||||
methods: find({
|
|
||||||
kind: 'function',
|
|
||||||
memberof: v.longname
|
|
||||||
}),
|
|
||||||
typedefs: find({
|
|
||||||
kind: 'typedef',
|
|
||||||
memberof: v.longname
|
|
||||||
}),
|
|
||||||
events: find({
|
|
||||||
kind: 'event',
|
|
||||||
memberof: v.longname
|
|
||||||
})
|
|
||||||
};
|
|
||||||
}
|
|
||||||
_.each(merged, function(v) {
|
_.each(merged, function(v) {
|
||||||
// exclude interfaces from sidebar
|
// exclude interfaces from sidebar
|
||||||
if (v.interface !== true) {
|
if (v.interface !== true) {
|
||||||
if (v.kind == 'module') {
|
if (v.kind == 'module') {
|
||||||
nav.push(createEntry('module', v));
|
nav.push({
|
||||||
|
type: 'module',
|
||||||
|
longname: v.longname,
|
||||||
|
name: v.name,
|
||||||
|
members: find({
|
||||||
|
kind: 'member',
|
||||||
|
memberof: v.longname
|
||||||
|
}),
|
||||||
|
methods: find({
|
||||||
|
kind: 'function',
|
||||||
|
memberof: v.longname
|
||||||
|
}),
|
||||||
|
typedefs: find({
|
||||||
|
kind: 'typedef',
|
||||||
|
memberof: v.longname
|
||||||
|
}),
|
||||||
|
events: find({
|
||||||
|
kind: 'event',
|
||||||
|
memberof: v.longname
|
||||||
|
})
|
||||||
|
});
|
||||||
|
}
|
||||||
|
if (v.kind == 'class') {
|
||||||
|
nav.push({
|
||||||
|
type: 'class',
|
||||||
|
longname: v.longname,
|
||||||
|
name: v.name,
|
||||||
|
members: find({
|
||||||
|
kind: 'member',
|
||||||
|
memberof: v.longname
|
||||||
|
}),
|
||||||
|
methods: find({
|
||||||
|
kind: 'function',
|
||||||
|
memberof: v.longname
|
||||||
|
}),
|
||||||
|
typedefs: find({
|
||||||
|
kind: 'typedef',
|
||||||
|
memberof: v.longname
|
||||||
|
}),
|
||||||
|
fires: v.fires,
|
||||||
|
events: find({
|
||||||
|
kind: 'event',
|
||||||
|
memberof: v.longname
|
||||||
|
})
|
||||||
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -12,18 +12,13 @@ $(function () {
|
|||||||
var $item = $(v);
|
var $item = $(v);
|
||||||
|
|
||||||
if ($item.data('name') && regexp.test($item.data('name'))) {
|
if ($item.data('name') && regexp.test($item.data('name'))) {
|
||||||
const container = $item.parent().parent().parent();
|
|
||||||
container.show();
|
|
||||||
container.closest('.itemMembers').show();
|
|
||||||
container.closest('.item').show();
|
|
||||||
$item.show();
|
$item.show();
|
||||||
$item.closest('.itemMembers').show();
|
$item.closest('.itemMembers').show();
|
||||||
$item.closest('.item').show();
|
$item.closest('.item').show();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
$el.find('.item, .itemMembers').hide();
|
$el.find('.item, .itemMembers').show();
|
||||||
$('.navigation>ul>li').show();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
$el.find('.list').scrollTop(0);
|
$el.find('.list').scrollTop(0);
|
||||||
|
|||||||
@@ -18,7 +18,7 @@
|
|||||||
<sup class="variation"><?js= doc.variation ?></sup>
|
<sup class="variation"><?js= doc.variation ?></sup>
|
||||||
<?js } ?></h2>
|
<?js } ?></h2>
|
||||||
<br>
|
<br>
|
||||||
<?js if (doc.stability || doc.kind == 'namespace' || doc.kind == 'module') {
|
<?js if (doc.stability || doc.kind == 'namespace') {
|
||||||
var ancestors = doc.ancestors.map(a => a.replace(/>\./g, '>').replace(/\.</g, '<')).join('/');
|
var ancestors = doc.ancestors.map(a => a.replace(/>\./g, '>').replace(/\.</g, '<')).join('/');
|
||||||
var parts = [];
|
var parts = [];
|
||||||
if (ancestors) {
|
if (ancestors) {
|
||||||
@@ -26,20 +26,7 @@
|
|||||||
}
|
}
|
||||||
var importPath = parts.join('/');
|
var importPath = parts.join('/');
|
||||||
?>
|
?>
|
||||||
<?js
|
<pre class="prettyprint source"><code>import <?js= doc.name ?> from '<?js= importPath ?>';</code></pre>
|
||||||
var nameParts = doc.name.split('/');
|
|
||||||
var moduleName = nameParts[nameParts.length - 1];
|
|
||||||
if(moduleName) {
|
|
||||||
var firstChar = moduleName.charAt(0);
|
|
||||||
moduleName = firstChar.toUpperCase() + moduleName.slice(1);
|
|
||||||
var isClassModule = firstChar.toUpperCase() === firstChar;
|
|
||||||
}
|
|
||||||
?>
|
|
||||||
<?js if (doc.kind == 'module' && !isClassModule && nameParts.length < 3) {?>
|
|
||||||
<pre class="prettyprint source"><code>import * as ol<?js= moduleName ?> from '<?js= doc.name ?>';</code></pre>
|
|
||||||
<?js } else if(doc.kind !== 'module') { ?>
|
|
||||||
<pre class="prettyprint source"><code>import <?js= doc.name ?> from '<?js= importPath ?>';</code></pre>
|
|
||||||
<?js } ?>
|
|
||||||
<?js } ?>
|
<?js } ?>
|
||||||
<?js if (doc.classdesc) { ?>
|
<?js if (doc.classdesc) { ?>
|
||||||
<div class="class-description"><?js= doc.classdesc ?></div>
|
<div class="class-description"><?js= doc.classdesc ?></div>
|
||||||
@@ -156,7 +143,6 @@
|
|||||||
<h3 class="subsection-title">Methods</h3>
|
<h3 class="subsection-title">Methods</h3>
|
||||||
|
|
||||||
<dl><?js methods.forEach(function(m) { ?>
|
<dl><?js methods.forEach(function(m) { ?>
|
||||||
<?js m.parent = doc ?>
|
|
||||||
<?js= self.partial('method.tmpl', m) ?>
|
<?js= self.partial('method.tmpl', m) ?>
|
||||||
<?js }); ?></dl>
|
<?js }); ?></dl>
|
||||||
<?js } ?>
|
<?js } ?>
|
||||||
|
|||||||
@@ -4,62 +4,12 @@ var version = obj.packageInfo.version;
|
|||||||
<!DOCTYPE html>
|
<!DOCTYPE html>
|
||||||
<html lang="en">
|
<html lang="en">
|
||||||
<head>
|
<head>
|
||||||
<script>
|
|
||||||
var gaProperty = 'UA-2577926-1';
|
|
||||||
// Disable tracking if the opt-out cookie exists.
|
|
||||||
var disableStr = 'ga-disable-' + gaProperty;
|
|
||||||
if (document.cookie.indexOf(disableStr + '=true') > -1) {
|
|
||||||
window[disableStr] = true;
|
|
||||||
}
|
|
||||||
function gaOptout() {
|
|
||||||
document.cookie = disableStr + '=true; expires=Thu, 31 Dec 2099 23:59:59 UTC; path=/';
|
|
||||||
window[disableStr] = true;
|
|
||||||
}
|
|
||||||
function gaOptoutRevoke() {
|
|
||||||
document.cookie = disableStr + '=false; expires=Thu, 31 Dec 2099 23:59:59 UTC; path=/';
|
|
||||||
window[disableStr] = false;
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
<!-- Global site tag (gtag.js) - Google Analytics -->
|
|
||||||
<script async src="https://www.googletagmanager.com/gtag/js?id=UA-2577926-1"></script>
|
<script async src="https://www.googletagmanager.com/gtag/js?id=UA-2577926-1"></script>
|
||||||
<script>
|
<script>
|
||||||
window.dataLayer = window.dataLayer || [];
|
window.dataLayer = window.dataLayer || [];
|
||||||
function gtag(){dataLayer.push(arguments);}
|
function gtag(){dataLayer.push(arguments);}
|
||||||
gtag('js', new Date());
|
gtag('js', new Date());
|
||||||
gtag('config', 'UA-2577926-1', { 'anonymize_ip': true });
|
gtag('config', 'UA-2577926-1');
|
||||||
</script>
|
|
||||||
<link rel="stylesheet" type="text/css" href="//cdnjs.cloudflare.com/ajax/libs/cookieconsent2/3.1.0/cookieconsent.min.css" />
|
|
||||||
<script src="//cdnjs.cloudflare.com/ajax/libs/cookieconsent2/3.1.0/cookieconsent.min.js"></script>
|
|
||||||
<script>
|
|
||||||
window.addEventListener("load", function() {
|
|
||||||
window.cookieconsent.initialise({
|
|
||||||
'palette': {
|
|
||||||
'popup': {
|
|
||||||
'background': '#eaf7f7',
|
|
||||||
'text': '#5c7291'
|
|
||||||
},
|
|
||||||
'button': {
|
|
||||||
'background': '#56cbdb',
|
|
||||||
'text': '#ffffff'
|
|
||||||
}
|
|
||||||
},
|
|
||||||
'theme': 'edgeless',
|
|
||||||
'type': 'opt-out',
|
|
||||||
'onInitialise': function (status) {
|
|
||||||
if (!this.hasConsented()) {
|
|
||||||
gaOptout()
|
|
||||||
}
|
|
||||||
},
|
|
||||||
'onStatusChange': function(status, chosenBefore) {
|
|
||||||
if (!this.hasConsented()) {
|
|
||||||
gaOptout()
|
|
||||||
}
|
|
||||||
},
|
|
||||||
'onRevokeChoice': function() {
|
|
||||||
gaOptoutRevoke()
|
|
||||||
}
|
|
||||||
})
|
|
||||||
});
|
|
||||||
</script>
|
</script>
|
||||||
<meta charset="utf-8">
|
<meta charset="utf-8">
|
||||||
<title>OpenLayers v<?js= version ?> API - <?js= title ?></title>
|
<title>OpenLayers v<?js= version ?> API - <?js= title ?></title>
|
||||||
|
|||||||
@@ -27,10 +27,6 @@ var self = this;
|
|||||||
</dt>
|
</dt>
|
||||||
<dd class="<?js= (data.stability && data.stability !== 'stable') ? 'unstable' : '' ?>">
|
<dd class="<?js= (data.stability && data.stability !== 'stable') ? 'unstable' : '' ?>">
|
||||||
|
|
||||||
<?js if (data.parent && data.parent.kind == 'module' && data.parent.name.split('ol/').length < 3) { ?>
|
|
||||||
<pre class="prettyprint source"><code>import {<?js= data.name ?>} from '<?js= data.parent.name ?>';</code></pre>
|
|
||||||
<?js } ?>
|
|
||||||
|
|
||||||
<?js if (data.description) { ?>
|
<?js if (data.description) { ?>
|
||||||
<div class="description">
|
<div class="description">
|
||||||
<?js= data.description ?>
|
<?js= data.description ?>
|
||||||
|
|||||||
@@ -10,12 +10,11 @@ function toShortName(name) {
|
|||||||
</div>
|
</div>
|
||||||
<ul class="list">
|
<ul class="list">
|
||||||
<?js
|
<?js
|
||||||
let navbuilder;
|
this.nav.forEach(function (item) {
|
||||||
this.nav.forEach(navbuilder = function (item) {
|
|
||||||
?>
|
?>
|
||||||
<li class="item" data-name="<?js= item.longname ?>">
|
<li class="item" data-name="<?js= item.longname ?>">
|
||||||
<span class="title">
|
<span class="title">
|
||||||
<?js= self.linkto(item.longname, item.type === 'module' ? item.longname.replace('module:', '') : item.name) ?>
|
<?js= self.linkto(item.longname, item.longname.replace('module:', '')) ?>
|
||||||
<?js if (item.type === 'namespace' &&
|
<?js if (item.type === 'namespace' &&
|
||||||
(item.members.length + item.typedefs.length + item.methods.length +
|
(item.members.length + item.typedefs.length + item.methods.length +
|
||||||
item.events.length > 0)) { ?>
|
item.events.length > 0)) { ?>
|
||||||
@@ -23,18 +22,6 @@ function toShortName(name) {
|
|||||||
</span>
|
</span>
|
||||||
<ul class="members itemMembers">
|
<ul class="members itemMembers">
|
||||||
<?js
|
<?js
|
||||||
if (item.classes.length) {
|
|
||||||
?>
|
|
||||||
<span class="subtitle">Classes</span>
|
|
||||||
<?js
|
|
||||||
item.classes.forEach(function (v) {
|
|
||||||
navbuilder(v);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
?>
|
|
||||||
</ul>
|
|
||||||
<ul class="members itemMembers">
|
|
||||||
<?js
|
|
||||||
if (item.members.length) {
|
if (item.members.length) {
|
||||||
?>
|
?>
|
||||||
<span class="subtitle">Members</span>
|
<span class="subtitle">Members</span>
|
||||||
|
|||||||
@@ -1,64 +0,0 @@
|
|||||||
{
|
|
||||||
"compilerOptions": {
|
|
||||||
/* Basic Options */
|
|
||||||
"target": "ES5", /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017','ES2018' or 'ESNEXT'. */
|
|
||||||
"module": "es2015", /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', or 'ESNext'. */
|
|
||||||
// "lib": [], /* Specify library files to be included in the compilation. */
|
|
||||||
"allowJs": true, /* Allow javascript files to be compiled. */
|
|
||||||
// "checkJs": true, /* Report errors in .js files. */
|
|
||||||
// "jsx": "preserve", /* Specify JSX code generation: 'preserve', 'react-native', or 'react'. */
|
|
||||||
// "declaration": true, /* Generates corresponding '.d.ts' file. */
|
|
||||||
// "declarationMap": true, /* Generates a sourcemap for each corresponding '.d.ts' file. */
|
|
||||||
"sourceMap": true, /* Generates corresponding '.map' file. */
|
|
||||||
// "outFile": "./", /* Concatenate and emit output to single file. */
|
|
||||||
"outDir": "../build/ol", /* Redirect output structure to the directory. */
|
|
||||||
// "rootDir": "./", /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */
|
|
||||||
// "composite": true, /* Enable project compilation */
|
|
||||||
// "removeComments": true, /* Do not emit comments to output. */
|
|
||||||
// "noEmit": true, /* Do not emit outputs. */
|
|
||||||
"importHelpers": false, /* Import emit helpers from 'tslib'. */
|
|
||||||
// "downlevelIteration": true, /* Provide full support for iterables in 'for-of', spread, and destructuring when targeting 'ES5' or 'ES3'. */
|
|
||||||
// "isolatedModules": true, /* Transpile each file as a separate module (similar to 'ts.transpileModule'). */
|
|
||||||
|
|
||||||
/* Strict Type-Checking Options */
|
|
||||||
"strict": false, /* Enable all strict type-checking options. */
|
|
||||||
// "noImplicitAny": true, /* Raise error on expressions and declarations with an implied 'any' type. */
|
|
||||||
// "strictNullChecks": true, /* Enable strict null checks. */
|
|
||||||
// "strictFunctionTypes": true, /* Enable strict checking of function types. */
|
|
||||||
// "strictBindCallApply": true, /* Enable strict 'bind', 'call', and 'apply' methods on functions. */
|
|
||||||
// "strictPropertyInitialization": true, /* Enable strict checking of property initialization in classes. */
|
|
||||||
// "noImplicitThis": true, /* Raise error on 'this' expressions with an implied 'any' type. */
|
|
||||||
// "alwaysStrict": true, /* Parse in strict mode and emit "use strict" for each source file. */
|
|
||||||
|
|
||||||
/* Additional Checks */
|
|
||||||
// "noUnusedLocals": true, /* Report errors on unused locals. */
|
|
||||||
// "noUnusedParameters": true, /* Report errors on unused parameters. */
|
|
||||||
// "noImplicitReturns": true, /* Report error when not all code paths in function return a value. */
|
|
||||||
// "noFallthroughCasesInSwitch": true, /* Report errors for fallthrough cases in switch statement. */
|
|
||||||
|
|
||||||
/* Module Resolution Options */
|
|
||||||
"moduleResolution": "node", /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */
|
|
||||||
// "baseUrl": "./", /* Base directory to resolve non-absolute module names. */
|
|
||||||
// "paths": {}, /* A series of entries which re-map imports to lookup locations relative to the 'baseUrl'. */
|
|
||||||
// "rootDirs": [], /* List of root folders whose combined content represents the structure of the project at runtime. */
|
|
||||||
// "typeRoots": [], /* List of folders to include type definitions from. */
|
|
||||||
// "types": [], /* Type declaration files to be included in compilation. */
|
|
||||||
// "allowSyntheticDefaultImports": true, /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */
|
|
||||||
"esModuleInterop": false, /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */
|
|
||||||
// "preserveSymlinks": true, /* Do not resolve the real path of symlinks. */
|
|
||||||
|
|
||||||
/* Source Map Options */
|
|
||||||
// "sourceRoot": "", /* Specify the location where debugger should locate TypeScript files instead of source locations. */
|
|
||||||
// "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */
|
|
||||||
// "inlineSourceMap": true, /* Emit a single file with source maps instead of having a separate file. */
|
|
||||||
"inlineSources": false /* Emit the source alongside the sourcemaps within a single file; requires '--inlineSourceMap' or '--sourceMap' to be set. */
|
|
||||||
|
|
||||||
/* Experimental Options */
|
|
||||||
// "experimentalDecorators": true, /* Enables experimental support for ES7 decorators. */
|
|
||||||
// "emitDecoratorMetadata": true, /* Enables experimental support for emitting type metadata for decorators. */
|
|
||||||
},
|
|
||||||
"include": [
|
|
||||||
"../build/ol/src/**/*.js"
|
|
||||||
],
|
|
||||||
"exclude": []
|
|
||||||
}
|
|
||||||
@@ -111,7 +111,7 @@ Features for `updates` must have an id set by the feature reader or `ol.Feature#
|
|||||||
|
|
||||||
### 28
|
### 28
|
||||||
|
|
||||||
`renderMode` must be `'image'` or `'hybrid'`.
|
`renderMode` must be `'image'`, `'hybrid'` or `'vector'`.
|
||||||
|
|
||||||
### 29
|
### 29
|
||||||
|
|
||||||
@@ -220,32 +220,3 @@ Duplicate item added to a unique collection. For example, it may be that you tr
|
|||||||
### 59
|
### 59
|
||||||
|
|
||||||
Invalid command found in the PBF. This indicates that the loaded vector tile may be corrupt.
|
Invalid command found in the PBF. This indicates that the loaded vector tile may be corrupt.
|
||||||
|
|
||||||
### 60
|
|
||||||
|
|
||||||
Missing or invalid `size`.
|
|
||||||
|
|
||||||
### 61
|
|
||||||
|
|
||||||
Cannot determine IIIF Image API version from provided image information JSON.
|
|
||||||
|
|
||||||
### 62
|
|
||||||
|
|
||||||
A `WebGLArrayBuffer` must either be of type `ELEMENT_ARRAY_BUFFER` or `ARRAY_BUFFER`.
|
|
||||||
|
|
||||||
### 63
|
|
||||||
|
|
||||||
Support for the `OES_element_index_uint` WebGL extension is mandatory for WebGL layers.
|
|
||||||
|
|
||||||
### 64
|
|
||||||
|
|
||||||
Layer opacity must be a number.
|
|
||||||
|
|
||||||
### 65
|
|
||||||
|
|
||||||
A symbol literal representation must be defined on the style supplied to a `WebGLPointsLayer` instance.
|
|
||||||
|
|
||||||
### 66
|
|
||||||
|
|
||||||
`forEachFeatureAtCoordinate` cannot be used on a WebGL layer if the hit detection logic has not been enabled.
|
|
||||||
This is done by providing adequate shaders using the `hitVertexShader` and `hitFragmentShader` properties of `WebGLPointsLayerRenderer`.
|
|
||||||
|
|||||||
29
doc/faq.md
29
doc/faq.md
@@ -21,7 +21,7 @@ Table of contents:
|
|||||||
* [Why aren't there any features in my source?](#why-aren-t-there-any-features-in-my-source-)
|
* [Why aren't there any features in my source?](#why-aren-t-there-any-features-in-my-source-)
|
||||||
* [How do I force a re-render of the map?](#how-do-i-force-a-re-render-of-the-map-)
|
* [How do I force a re-render of the map?](#how-do-i-force-a-re-render-of-the-map-)
|
||||||
* [Why are my features not found?](#why-are-my-features-not-found-)
|
* [Why are my features not found?](#why-are-my-features-not-found-)
|
||||||
* [Why is zooming or clicking off, inaccurate?](#user-content-why-is-zooming-or-clicking-off-inaccurate)
|
|
||||||
|
|
||||||
## What projection is OpenLayers using?
|
## What projection is OpenLayers using?
|
||||||
|
|
||||||
@@ -371,30 +371,3 @@ const vectorLayer = new VectorLayer({
|
|||||||
```
|
```
|
||||||
|
|
||||||
The recommended value is the size of the largest symbol, line width or label.
|
The recommended value is the size of the largest symbol, line width or label.
|
||||||
|
|
||||||
## Why is zooming or clicking in the map off/inaccurate?
|
|
||||||
|
|
||||||
OpenLayers does not update the map when the container element is resized. This can be caused by progressive updates
|
|
||||||
to CSS styles or manually resizing the map. When that happens, any interaction will become inaccurate: the map would zoom in and out, and end up not being centered on the pointer. This makes it hard to do certain interactions, e.g. selecting the desired feature.
|
|
||||||
|
|
||||||
There is currently no built-in way to react to element's size changes, as [Resize Observer API](https://developer.mozilla.org/en-US/docs/Web/API/ResizeObserver) is only implemented in Chrome.
|
|
||||||
|
|
||||||
There is however an easy to use [polyfill](https://github.com/que-etc/resize-observer-polyfill):
|
|
||||||
|
|
||||||
```javascript
|
|
||||||
import Map from 'ol/Map';
|
|
||||||
import ResizeObserver from 'resize-observer-polyfill';
|
|
||||||
|
|
||||||
const mapElement = document.querySelector('#map')
|
|
||||||
const map = new Map({
|
|
||||||
target: mapElement
|
|
||||||
})
|
|
||||||
|
|
||||||
const sizeObserver = new ResizeObserver(() => {
|
|
||||||
map.updateSize()
|
|
||||||
})
|
|
||||||
sizeObserver.observe(mapElement)
|
|
||||||
|
|
||||||
// called when the map is destroyed
|
|
||||||
// sizeObserver.disconnect()
|
|
||||||
```
|
|
||||||
|
|||||||
@@ -18,14 +18,14 @@ Below you'll find a complete working example. Create a new file, copy in the co
|
|||||||
<!doctype html>
|
<!doctype html>
|
||||||
<html lang="en">
|
<html lang="en">
|
||||||
<head>
|
<head>
|
||||||
<link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/openlayers/openlayers.github.io@master/en/{{ latest }}/css/ol.css" type="text/css">
|
<link rel="stylesheet" href="https://cdn.rawgit.com/openlayers/openlayers.github.io/master/en/{{ latest }}/css/ol.css" type="text/css">
|
||||||
<style>
|
<style>
|
||||||
.map {
|
.map {
|
||||||
height: 400px;
|
height: 400px;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
<script src="https://cdn.jsdelivr.net/gh/openlayers/openlayers.github.io@master/en/{{ latest }}/build/ol.js"></script>
|
<script src="https://cdn.rawgit.com/openlayers/openlayers.github.io/master/en/{{ latest }}/build/ol.js"></script>
|
||||||
<title>OpenLayers example</title>
|
<title>OpenLayers example</title>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
@@ -60,7 +60,7 @@ To include a map a web page you will need 3 things:
|
|||||||
### Include OpenLayers
|
### Include OpenLayers
|
||||||
|
|
||||||
```xml
|
```xml
|
||||||
<script src="https://cdn.jsdelivr.net/gh/openlayers/openlayers.github.io@master/en/{{ latest }}/build/ol.js"></script>
|
<script src="https://cdn.rawgit.com/openlayers/openlayers.github.io/master/en/{{ latest }}/build/ol.js"></script>
|
||||||
```
|
```
|
||||||
|
|
||||||
The first part is to include the JavaScript library. For the purpose of this tutorial, here we simply point to the openlayers.org website to get the whole library. In a production environment, we would build a custom version of the library including only the module needed for our application.
|
The first part is to include the JavaScript library. For the purpose of this tutorial, here we simply point to the openlayers.org website to get the whole library. In a production environment, we would build a custom version of the library including only the module needed for our application.
|
||||||
|
|||||||
@@ -17,7 +17,7 @@ OpenLayers is available as [`ol` npm package](https://npmjs.com/package/ol), whi
|
|||||||
|
|
||||||
## Renderers and Browser Support
|
## Renderers and Browser Support
|
||||||
|
|
||||||
By default, OpenLayers uses a performance optimized Canvas renderer.
|
By default, OpenLayers uses a performance optimized Canvas renderer. An experimental WebGL renderer (without text rendering support) is also available.
|
||||||
|
|
||||||
OpenLayers runs on all modern browsers that support [HTML5](https://html.spec.whatwg.org/multipage/) and [ECMAScript 5](http://www.ecma-international.org/ecma-262/5.1/). This includes Chrome, Firefox, Safari and Edge. For older browsers and platforms like Internet Explorer (down to version 9) and Android 4.x, [polyfills](http://polyfill.io), the application bundle needs to be transpiled (e.g. using [Babel](https://babeljs.io)) and bundled with polyfills for `requestAnimationFrame`, `Element.prototype.classList` and `URL`.
|
OpenLayers runs on all modern browsers that support [HTML5](https://html.spec.whatwg.org/multipage/) and [ECMAScript 5](http://www.ecma-international.org/ecma-262/5.1/). This includes Chrome, Firefox, Safari and Edge. For older browsers and platforms like Internet Explorer (down to version 9) and Android 4.x, [polyfills](http://polyfill.io), the application bundle needs to be transpiled (e.g. using [Babel](https://babeljs.io)) and bundled with polyfills for `requestAnimationFrame`, `Element.prototype.classList` and `URL`.
|
||||||
|
|
||||||
@@ -44,6 +44,6 @@ import {Tile, Vector} from 'ol/layer';
|
|||||||
In addition to these re-exported classes, modules with lowercase names also provide constants or functions as named exports:
|
In addition to these re-exported classes, modules with lowercase names also provide constants or functions as named exports:
|
||||||
|
|
||||||
```js
|
```js
|
||||||
import {getUid} from 'ol';
|
import {inherits} from 'ol';
|
||||||
import {fromLonLat} from 'ol/proj';
|
import {fromLonLat} from 'ol/proj';
|
||||||
```
|
```
|
||||||
|
|||||||
@@ -11,11 +11,9 @@ In this tutorial, we will be using [Parcel](https://parceljs.org) to bundle our
|
|||||||
|
|
||||||
## Initial steps
|
## Initial steps
|
||||||
|
|
||||||
Create a new empty directory for your project and navigate to it by running `mkdir new-project && cd new-project`. Initialize your project with
|
Create a new empty directory for your project and navigate to it by running `mkdir new-project && cd new-project`. Initialize your project using `npm init` and answer the questions asked.
|
||||||
|
|
||||||
npm init
|
Add OpenLayers as dependency to your application with
|
||||||
|
|
||||||
This will create a `package.json` file in your working directory. Add OpenLayers as dependency to your application with
|
|
||||||
|
|
||||||
npm install ol
|
npm install ol
|
||||||
|
|
||||||
@@ -71,21 +69,13 @@ You will also need an `index.html` file that will use your bundle. Here is a sim
|
|||||||
|
|
||||||
## Creating a bundle
|
## Creating a bundle
|
||||||
|
|
||||||
With two additional lines in `package.json` you can introduce the commands `npm run build` and `npm start` to manually build your bundle and watch for changes, respectively. The final `package.json` with the two additional commands `"start"` and `"build"` should look like this:
|
With simple scripts you can introduce the commands `npm run build` and `npm start` to manually build your bundle and watch for changes, respectively. Add the following to the script section in `package.json`:
|
||||||
|
|
||||||
```json
|
```json
|
||||||
{
|
"scripts": {
|
||||||
"name": "test",
|
"test": "echo \"Error: no test specified\" && exit 1",
|
||||||
"version": "1.0.0",
|
"start": "parcel index.html",
|
||||||
"description": "",
|
"build": "parcel build --public-url . index.html"
|
||||||
"main": "index.js",
|
|
||||||
"scripts": {
|
|
||||||
"test": "echo \"Error: no test specified\" && exit 1",
|
|
||||||
"start": "parcel index.html",
|
|
||||||
"build": "parcel build --public-url . index.html"
|
|
||||||
},
|
|
||||||
"author": "",
|
|
||||||
"license": "ISC"
|
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
That's it. Now to run your application, enter
|
That's it. Now to run your application, enter
|
||||||
|
|||||||
@@ -75,7 +75,7 @@ The above snippets can be combined into a single script that renders a map with
|
|||||||
import Map from 'ol/Map';
|
import Map from 'ol/Map';
|
||||||
import View from 'ol/View';
|
import View from 'ol/View';
|
||||||
import OSM from 'ol/source/OSM';
|
import OSM from 'ol/source/OSM';
|
||||||
import TileLayer from 'ol/layer/Tile';
|
import TileLayer from 'ol/source/Tile';
|
||||||
|
|
||||||
new Map({
|
new Map({
|
||||||
layers: [
|
layers: [
|
||||||
|
|||||||
@@ -9,7 +9,6 @@
|
|||||||
"GyroNorm": false,
|
"GyroNorm": false,
|
||||||
"jsPDF": false,
|
"jsPDF": false,
|
||||||
"jsts": false,
|
"jsts": false,
|
||||||
"mapboxgl": false,
|
|
||||||
"saveAs": false,
|
"saveAs": false,
|
||||||
"toastr": false,
|
"toastr": false,
|
||||||
"topojson": false,
|
"topojson": false,
|
||||||
|
|||||||
@@ -24,6 +24,9 @@ const map = new Map({
|
|||||||
source: new OSM()
|
source: new OSM()
|
||||||
})
|
})
|
||||||
],
|
],
|
||||||
|
// Improve user experience by loading tiles while animating. Will make
|
||||||
|
// animations stutter on mobile or slow devices.
|
||||||
|
loadTilesWhileAnimating: true,
|
||||||
view: view
|
view: view
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@@ -12,8 +12,9 @@ cloak:
|
|||||||
<div id="map" class="map"></div>
|
<div id="map" class="map"></div>
|
||||||
<select id="layer-select">
|
<select id="layer-select">
|
||||||
<option value="Aerial">Aerial</option>
|
<option value="Aerial">Aerial</option>
|
||||||
<option value="AerialWithLabelsOnDemand" selected>Aerial with labels</option>
|
<option value="AerialWithLabels" selected>Aerial with labels</option>
|
||||||
<option value="RoadOnDemand">Road</option>
|
<option value="Road">Road (static)</option>
|
||||||
<option value="CanvasDark">Road dark</option>
|
<option value="RoadOnDemand">Road (dynamic)</option>
|
||||||
<option value="OrdnanceSurvey">Ordnance Survey</option>
|
<option value="collinsBart">Collins Bart</option>
|
||||||
|
<option value="ordnanceSurvey">Ordnance Survey</option>
|
||||||
</select>
|
</select>
|
||||||
|
|||||||
@@ -5,11 +5,12 @@ import BingMaps from '../src/ol/source/BingMaps.js';
|
|||||||
|
|
||||||
|
|
||||||
const styles = [
|
const styles = [
|
||||||
|
'Road',
|
||||||
'RoadOnDemand',
|
'RoadOnDemand',
|
||||||
'Aerial',
|
'Aerial',
|
||||||
'AerialWithLabelsOnDemand',
|
'AerialWithLabels',
|
||||||
'CanvasDark',
|
'collinsBart',
|
||||||
'OrdnanceSurvey'
|
'ordnanceSurvey'
|
||||||
];
|
];
|
||||||
const layers = [];
|
const layers = [];
|
||||||
let i, ii;
|
let i, ii;
|
||||||
@@ -28,6 +29,9 @@ for (i = 0, ii = styles.length; i < ii; ++i) {
|
|||||||
}
|
}
|
||||||
const map = new Map({
|
const map = new Map({
|
||||||
layers: layers,
|
layers: layers,
|
||||||
|
// Improve user experience by loading tiles while dragging/zooming. Will make
|
||||||
|
// zooming choppy on mobile or slow devices.
|
||||||
|
loadTilesWhileInteracting: true,
|
||||||
target: 'map',
|
target: 'map',
|
||||||
view: new View({
|
view: new View({
|
||||||
center: [-6655.5402445057125, 6709968.258934638],
|
center: [-6655.5402445057125, 6709968.258934638],
|
||||||
|
|||||||
4
examples/blend-modes.css
Normal file
4
examples/blend-modes.css
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
.map{
|
||||||
|
background-repeat: repeat;
|
||||||
|
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAN1wAADdcBQiibeAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAApSURBVBiVY7x///5/BjSgqKjIiC7GhC6ACwygQgxHMzAwMGDz4FDwDAD5/wevjSk4mwAAAABJRU5ErkJggg==);
|
||||||
|
}
|
||||||
68
examples/blend-modes.html
Normal file
68
examples/blend-modes.html
Normal file
@@ -0,0 +1,68 @@
|
|||||||
|
---
|
||||||
|
layout: example.html
|
||||||
|
title: Blend Modes
|
||||||
|
shortdesc: Shows how to change the canvas compositing / blending mode in post- and precompose eventhandlers.
|
||||||
|
docs: >
|
||||||
|
<p>This example shows how to change the canvas compositing / blending mode in
|
||||||
|
post- and precompose event handlers. The Canvas 2D API provides the property
|
||||||
|
<code>globalCompositeOperation</code> with which one can influence which
|
||||||
|
composition operation will be used when drawing on the canvas. The various
|
||||||
|
options are well described on the <a href="https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/globalCompositeOperation">MDN
|
||||||
|
documentation page</a>.</p>
|
||||||
|
|
||||||
|
<p>In this example three circles on the corners of an equilateral triangle are
|
||||||
|
drawn with red, green or blue styles respectively. By setting the
|
||||||
|
<code>globalCompositeOperation</code> you can change how these colors turn out
|
||||||
|
when they are combined on the map.</p>
|
||||||
|
|
||||||
|
<p>You can select an operation in the select-field and you can also control
|
||||||
|
which layers will be affected by the chosen operation through the layer
|
||||||
|
checkboxes.</p>
|
||||||
|
tags: "blendmode, blend-mode, blend mode, blendingmode, blending-mode, blending mode, composition, compositing, canvas, vector"
|
||||||
|
---
|
||||||
|
<div id="map" class="map"></div>
|
||||||
|
<form class="form-horizontal">
|
||||||
|
<label>
|
||||||
|
<select id="blend-mode" class="form-control">
|
||||||
|
<option value="source-over">source-over (default)</option>
|
||||||
|
<option>source-in</option>
|
||||||
|
<option>source-out</option>
|
||||||
|
<option>source-atop</option>
|
||||||
|
<option>destination-over</option>
|
||||||
|
<option>destination-in</option>
|
||||||
|
<option>destination-out</option>
|
||||||
|
<option>destination-atop</option>
|
||||||
|
<option>lighter</option>
|
||||||
|
<option>copy</option>
|
||||||
|
<option>xor</option>
|
||||||
|
<option>multiply</option>
|
||||||
|
<option>screen</option>
|
||||||
|
<option>overlay</option>
|
||||||
|
<option>darken</option>
|
||||||
|
<option>lighten</option>
|
||||||
|
<option>color-dodge</option>
|
||||||
|
<option>color-burn</option>
|
||||||
|
<option>hard-light</option>
|
||||||
|
<option>soft-light</option>
|
||||||
|
<option selected>difference</option>
|
||||||
|
<option>exclusion</option>
|
||||||
|
<option>hue</option>
|
||||||
|
<option>saturation</option>
|
||||||
|
<option>color</option>
|
||||||
|
<option>luminosity</option>
|
||||||
|
</select>
|
||||||
|
Canvas compositing / blending mode
|
||||||
|
</label>
|
||||||
|
<label>
|
||||||
|
<input type="checkbox" id="affect-red" checked>
|
||||||
|
Red circle affected
|
||||||
|
</label>
|
||||||
|
<label>
|
||||||
|
<input type="checkbox" id="affect-green" checked>
|
||||||
|
Green circle affected
|
||||||
|
</label>
|
||||||
|
<label>
|
||||||
|
<input type="checkbox" id="affect-blue" checked>
|
||||||
|
Blue circle affected
|
||||||
|
</label>
|
||||||
|
</form>
|
||||||
173
examples/blend-modes.js
Normal file
173
examples/blend-modes.js
Normal file
@@ -0,0 +1,173 @@
|
|||||||
|
import Feature from '../src/ol/Feature.js';
|
||||||
|
import Map from '../src/ol/Map.js';
|
||||||
|
import View from '../src/ol/View.js';
|
||||||
|
import Point from '../src/ol/geom/Point.js';
|
||||||
|
import VectorLayer from '../src/ol/layer/Vector.js';
|
||||||
|
import VectorSource from '../src/ol/source/Vector.js';
|
||||||
|
import {Circle as CircleStyle, Fill, Stroke, Style} from '../src/ol/style.js';
|
||||||
|
|
||||||
|
|
||||||
|
// Create separate layers for red, green an blue circles.
|
||||||
|
//
|
||||||
|
// Every layer has one feature that is styled with a circle, together the
|
||||||
|
// features form the corners of an equilateral triangle and their styles overlap
|
||||||
|
const redLayer = new VectorLayer({
|
||||||
|
source: new VectorSource({
|
||||||
|
features: [new Feature(new Point([0, 0]))]
|
||||||
|
}),
|
||||||
|
style: new Style({
|
||||||
|
image: new CircleStyle({
|
||||||
|
fill: new Fill({
|
||||||
|
color: 'rgba(255,0,0,0.8)'
|
||||||
|
}),
|
||||||
|
stroke: new Stroke({
|
||||||
|
color: 'rgb(255,0,0)',
|
||||||
|
width: 15
|
||||||
|
}),
|
||||||
|
radius: 120
|
||||||
|
})
|
||||||
|
})
|
||||||
|
});
|
||||||
|
const greenLayer = new VectorLayer({
|
||||||
|
source: new VectorSource({
|
||||||
|
// 433.013 is roughly 250 * Math.sqrt(3)
|
||||||
|
features: [new Feature(new Point([250, 433.013]))]
|
||||||
|
}),
|
||||||
|
style: new Style({
|
||||||
|
image: new CircleStyle({
|
||||||
|
fill: new Fill({
|
||||||
|
color: 'rgba(0,255,0,0.8)'
|
||||||
|
}),
|
||||||
|
stroke: new Stroke({
|
||||||
|
color: 'rgb(0,255,0)',
|
||||||
|
width: 15
|
||||||
|
}),
|
||||||
|
radius: 120
|
||||||
|
})
|
||||||
|
})
|
||||||
|
});
|
||||||
|
const blueLayer = new VectorLayer({
|
||||||
|
source: new VectorSource({
|
||||||
|
features: [new Feature(new Point([500, 0]))]
|
||||||
|
}),
|
||||||
|
style: new Style({
|
||||||
|
image: new CircleStyle({
|
||||||
|
fill: new Fill({
|
||||||
|
color: 'rgba(0,0,255,0.8)'
|
||||||
|
}),
|
||||||
|
stroke: new Stroke({
|
||||||
|
color: 'rgb(0,0,255)',
|
||||||
|
width: 15
|
||||||
|
}),
|
||||||
|
radius: 120
|
||||||
|
})
|
||||||
|
})
|
||||||
|
});
|
||||||
|
|
||||||
|
// Create the map, the view is centered on the triangle. Zooming and panning is
|
||||||
|
// restricted to a sane area
|
||||||
|
const map = new Map({
|
||||||
|
layers: [
|
||||||
|
redLayer,
|
||||||
|
greenLayer,
|
||||||
|
blueLayer
|
||||||
|
],
|
||||||
|
target: 'map',
|
||||||
|
view: new View({
|
||||||
|
center: [250, 220],
|
||||||
|
extent: [0, 0, 500, 500],
|
||||||
|
resolution: 4,
|
||||||
|
minResolution: 2,
|
||||||
|
maxResolution: 32
|
||||||
|
})
|
||||||
|
});
|
||||||
|
|
||||||
|
// Get the form elements and bind the listeners
|
||||||
|
const select = document.getElementById('blend-mode');
|
||||||
|
const affectRed = document.getElementById('affect-red');
|
||||||
|
const affectGreen = document.getElementById('affect-green');
|
||||||
|
const affectBlue = document.getElementById('affect-blue');
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This method sets the globalCompositeOperation to the value of the select
|
||||||
|
* field and it is bound to the precompose event of the layers.
|
||||||
|
*
|
||||||
|
* @param {module:ol/render/Event~RenderEvent} evt The render event.
|
||||||
|
*/
|
||||||
|
const setBlendModeFromSelect = function(evt) {
|
||||||
|
evt.context.globalCompositeOperation = select.value;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This method resets the globalCompositeOperation to the default value of
|
||||||
|
* 'source-over' and it is bound to the postcompose event of the layers.
|
||||||
|
*
|
||||||
|
* @param {module:ol/render/Event~RenderEvent} evt The render event.
|
||||||
|
*/
|
||||||
|
const resetBlendModeFromSelect = function(evt) {
|
||||||
|
evt.context.globalCompositeOperation = 'source-over';
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Bind the pre- and postcompose handlers to the passed layer.
|
||||||
|
*
|
||||||
|
* @param {module:ol/layer/Vector} layer The layer to bind the handlers to.
|
||||||
|
*/
|
||||||
|
const bindLayerListeners = function(layer) {
|
||||||
|
layer.on('precompose', setBlendModeFromSelect);
|
||||||
|
layer.on('postcompose', resetBlendModeFromSelect);
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Unind the pre- and postcompose handlers to the passed layers.
|
||||||
|
*
|
||||||
|
* @param {module:ol/layer/Vector} layer The layer to unbind the handlers from.
|
||||||
|
*/
|
||||||
|
const unbindLayerListeners = function(layer) {
|
||||||
|
layer.un('precompose', setBlendModeFromSelect);
|
||||||
|
layer.un('postcompose', resetBlendModeFromSelect);
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handler for the click event of the 'affect-XXX' checkboxes.
|
||||||
|
*
|
||||||
|
* @this {HTMLInputElement}
|
||||||
|
*/
|
||||||
|
const affectLayerClicked = function() {
|
||||||
|
let layer;
|
||||||
|
if (this.id == 'affect-red') {
|
||||||
|
layer = redLayer;
|
||||||
|
} else if (this.id == 'affect-green') {
|
||||||
|
layer = greenLayer;
|
||||||
|
} else {
|
||||||
|
layer = blueLayer;
|
||||||
|
}
|
||||||
|
if (this.checked) {
|
||||||
|
bindLayerListeners(layer);
|
||||||
|
} else {
|
||||||
|
unbindLayerListeners(layer);
|
||||||
|
}
|
||||||
|
map.render();
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
// Rerender map when blend mode changes
|
||||||
|
select.addEventListener('change', function() {
|
||||||
|
map.render();
|
||||||
|
});
|
||||||
|
|
||||||
|
// Unbind / bind listeners depending on the checked state when the checkboxes
|
||||||
|
// are clicked
|
||||||
|
affectRed.addEventListener('click', affectLayerClicked);
|
||||||
|
affectGreen.addEventListener('click', affectLayerClicked);
|
||||||
|
affectBlue.addEventListener('click', affectLayerClicked);
|
||||||
|
|
||||||
|
// Initially bind listeners
|
||||||
|
bindLayerListeners(redLayer);
|
||||||
|
bindLayerListeners(greenLayer);
|
||||||
|
bindLayerListeners(blueLayer);
|
||||||
@@ -25,8 +25,7 @@ const map = new Map({
|
|||||||
target: 'map',
|
target: 'map',
|
||||||
view: new View({
|
view: new View({
|
||||||
center: [0, 0],
|
center: [0, 0],
|
||||||
zoom: 2,
|
zoom: 2
|
||||||
constrainRotation: 16
|
|
||||||
})
|
})
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -44,39 +43,12 @@ const dragBox = new DragBox({
|
|||||||
map.addInteraction(dragBox);
|
map.addInteraction(dragBox);
|
||||||
|
|
||||||
dragBox.on('boxend', function() {
|
dragBox.on('boxend', function() {
|
||||||
// features that intersect the box geometry are added to the
|
// features that intersect the box are added to the collection of
|
||||||
// collection of selected features
|
// selected features
|
||||||
|
|
||||||
// if the view is not obliquely rotated the box geometry and
|
|
||||||
// its extent are equalivalent so intersecting features can
|
|
||||||
// be added directly to the collection
|
|
||||||
const rotation = map.getView().getRotation();
|
|
||||||
const oblique = rotation % (Math.PI / 2) !== 0;
|
|
||||||
const candidateFeatures = oblique ? [] : selectedFeatures;
|
|
||||||
const extent = dragBox.getGeometry().getExtent();
|
const extent = dragBox.getGeometry().getExtent();
|
||||||
vectorSource.forEachFeatureIntersectingExtent(extent, function(feature) {
|
vectorSource.forEachFeatureIntersectingExtent(extent, function(feature) {
|
||||||
candidateFeatures.push(feature);
|
selectedFeatures.push(feature);
|
||||||
});
|
});
|
||||||
|
|
||||||
// when the view is obliquely rotated the box extent will
|
|
||||||
// exceed its geometry so both the box and the candidate
|
|
||||||
// feature geometries are rotated around a common anchor
|
|
||||||
// to confirm that, with the box geometry aligned with its
|
|
||||||
// extent, the geometries intersect
|
|
||||||
if (oblique) {
|
|
||||||
const anchor = [0, 0];
|
|
||||||
const geometry = dragBox.getGeometry().clone();
|
|
||||||
geometry.rotate(-rotation, anchor);
|
|
||||||
const extent = geometry.getExtent();
|
|
||||||
candidateFeatures.forEach(function(feature) {
|
|
||||||
const geometry = feature.getGeometry().clone();
|
|
||||||
geometry.rotate(-rotation, anchor);
|
|
||||||
if (geometry.intersectsExtent(extent)) {
|
|
||||||
selectedFeatures.push(feature);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
// clear selection when drawing a new box and when clicking on the map
|
// clear selection when drawing a new box and when clicking on the map
|
||||||
|
|||||||
@@ -61,8 +61,8 @@ const style = new Style({
|
|||||||
* The styling function for the vector layer, will return an array of styles
|
* The styling function for the vector layer, will return an array of styles
|
||||||
* which either contains the aboove gradient or pattern.
|
* which either contains the aboove gradient or pattern.
|
||||||
*
|
*
|
||||||
* @param {import("../src/ol/Feature.js").default} feature The feature to style.
|
* @param {module:ol/Feature~Feature} feature The feature to style.
|
||||||
* @return {Style} The style to use for the feature.
|
* @return {module:ol/style/Style} The style to use for the feature.
|
||||||
*/
|
*/
|
||||||
const getStackedStyle = function(feature) {
|
const getStackedStyle = function(feature) {
|
||||||
const id = feature.getId();
|
const id = feature.getId();
|
||||||
|
|||||||
@@ -4,7 +4,10 @@ title: Canvas Tiles
|
|||||||
shortdesc: Renders tiles with coordinates for debugging.
|
shortdesc: Renders tiles with coordinates for debugging.
|
||||||
docs: >
|
docs: >
|
||||||
The black grid tiles are generated on the client with an HTML5 canvas. The
|
The black grid tiles are generated on the client with an HTML5 canvas. The
|
||||||
displayed tile coordinates are the XYZ tile coordinates.
|
displayed tile coordinates are OpenLayers tile coordinates. These increase
|
||||||
|
from bottom to top, but standard XYZ tiling scheme coordinates increase from
|
||||||
|
top to bottom. To calculate the `y` for a standard XYZ tile coordinate, use
|
||||||
|
`-y - 1`.
|
||||||
tags: "layers, openstreetmap, canvas"
|
tags: "layers, openstreetmap, canvas"
|
||||||
---
|
---
|
||||||
<div id="map" class="map"></div>
|
<div id="map" class="map"></div>
|
||||||
|
|||||||
@@ -1,21 +1,26 @@
|
|||||||
import Map from '../src/ol/Map.js';
|
import Map from '../src/ol/Map.js';
|
||||||
import View from '../src/ol/View.js';
|
import View from '../src/ol/View.js';
|
||||||
import TileLayer from '../src/ol/layer/Tile.js';
|
import TileLayer from '../src/ol/layer/Tile.js';
|
||||||
|
import {fromLonLat} from '../src/ol/proj.js';
|
||||||
import {OSM, TileDebug} from '../src/ol/source.js';
|
import {OSM, TileDebug} from '../src/ol/source.js';
|
||||||
|
|
||||||
|
|
||||||
|
const osmSource = new OSM();
|
||||||
const map = new Map({
|
const map = new Map({
|
||||||
layers: [
|
layers: [
|
||||||
new TileLayer({
|
new TileLayer({
|
||||||
source: new OSM()
|
source: osmSource
|
||||||
}),
|
}),
|
||||||
new TileLayer({
|
new TileLayer({
|
||||||
source: new TileDebug()
|
source: new TileDebug({
|
||||||
|
projection: 'EPSG:3857',
|
||||||
|
tileGrid: osmSource.getTileGrid()
|
||||||
|
})
|
||||||
})
|
})
|
||||||
],
|
],
|
||||||
target: 'map',
|
target: 'map',
|
||||||
view: new View({
|
view: new View({
|
||||||
center: [0, 0],
|
center: fromLonLat([-0.1275, 51.507222]),
|
||||||
zoom: 1
|
zoom: 10
|
||||||
})
|
})
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -21,6 +21,8 @@ tags: "center, rotation, openstreetmap"
|
|||||||
<div class="padding-bottom"></div>
|
<div class="padding-bottom"></div>
|
||||||
<div class="center"></div>
|
<div class="center"></div>
|
||||||
</div>
|
</div>
|
||||||
<button id="zoomtoswitzerland">Zoom to Switzerland</button> (best fit).<br/>
|
<button id="zoomtoswitzerlandbest">Zoom to Switzerland</button> (best fit),<br/>
|
||||||
|
<button id="zoomtoswitzerlandconstrained">Zoom to Switzerland</button> (respect resolution constraint).<br/>
|
||||||
|
<button id="zoomtoswitzerlandnearest">Zoom to Switzerland</button> (nearest),<br/>
|
||||||
<button id="zoomtolausanne">Zoom to Lausanne</button> (with min resolution),<br/>
|
<button id="zoomtolausanne">Zoom to Lausanne</button> (with min resolution),<br/>
|
||||||
<button id="centerlausanne">Center on Lausanne</button>
|
<button id="centerlausanne">Center on Lausanne</button>
|
||||||
|
|||||||
@@ -5,7 +5,6 @@ import {Tile as TileLayer, Vector as VectorLayer} from '../src/ol/layer.js';
|
|||||||
import {OSM, Vector as VectorSource} from '../src/ol/source.js';
|
import {OSM, Vector as VectorSource} from '../src/ol/source.js';
|
||||||
import {Circle as CircleStyle, Fill, Stroke, Style} from '../src/ol/style.js';
|
import {Circle as CircleStyle, Fill, Stroke, Style} from '../src/ol/style.js';
|
||||||
|
|
||||||
/** @type {VectorSource<import("../src/ol/geom/SimpleGeometry.js").default>} */
|
|
||||||
const source = new VectorSource({
|
const source = new VectorSource({
|
||||||
url: 'data/geojson/switzerland.geojson',
|
url: 'data/geojson/switzerland.geojson',
|
||||||
format: new GeoJSON()
|
format: new GeoJSON()
|
||||||
@@ -48,25 +47,40 @@ const map = new Map({
|
|||||||
view: view
|
view: view
|
||||||
});
|
});
|
||||||
|
|
||||||
const zoomtoswitzerland =
|
const zoomtoswitzerlandbest = document.getElementById('zoomtoswitzerlandbest');
|
||||||
document.getElementById('zoomtoswitzerland');
|
zoomtoswitzerlandbest.addEventListener('click', function() {
|
||||||
zoomtoswitzerland.addEventListener('click', function() {
|
|
||||||
const feature = source.getFeatures()[0];
|
const feature = source.getFeatures()[0];
|
||||||
const polygon = feature.getGeometry();
|
const polygon = /** @type {module:ol/geom/SimpleGeometry~SimpleGeometry} */ (feature.getGeometry());
|
||||||
|
view.fit(polygon, {padding: [170, 50, 30, 150], constrainResolution: false});
|
||||||
|
}, false);
|
||||||
|
|
||||||
|
const zoomtoswitzerlandconstrained =
|
||||||
|
document.getElementById('zoomtoswitzerlandconstrained');
|
||||||
|
zoomtoswitzerlandconstrained.addEventListener('click', function() {
|
||||||
|
const feature = source.getFeatures()[0];
|
||||||
|
const polygon = /** @type {module:ol/geom/SimpleGeometry~SimpleGeometry} */ (feature.getGeometry());
|
||||||
view.fit(polygon, {padding: [170, 50, 30, 150]});
|
view.fit(polygon, {padding: [170, 50, 30, 150]});
|
||||||
}, false);
|
}, false);
|
||||||
|
|
||||||
|
const zoomtoswitzerlandnearest =
|
||||||
|
document.getElementById('zoomtoswitzerlandnearest');
|
||||||
|
zoomtoswitzerlandnearest.addEventListener('click', function() {
|
||||||
|
const feature = source.getFeatures()[0];
|
||||||
|
const polygon = /** @type {module:ol/geom/SimpleGeometry~SimpleGeometry} */ (feature.getGeometry());
|
||||||
|
view.fit(polygon, {padding: [170, 50, 30, 150], nearest: true});
|
||||||
|
}, false);
|
||||||
|
|
||||||
const zoomtolausanne = document.getElementById('zoomtolausanne');
|
const zoomtolausanne = document.getElementById('zoomtolausanne');
|
||||||
zoomtolausanne.addEventListener('click', function() {
|
zoomtolausanne.addEventListener('click', function() {
|
||||||
const feature = source.getFeatures()[1];
|
const feature = source.getFeatures()[1];
|
||||||
const point = feature.getGeometry();
|
const point = /** @type {module:ol/geom/SimpleGeometry~SimpleGeometry} */ (feature.getGeometry());
|
||||||
view.fit(point, {padding: [170, 50, 30, 150], minResolution: 50});
|
view.fit(point, {padding: [170, 50, 30, 150], minResolution: 50});
|
||||||
}, false);
|
}, false);
|
||||||
|
|
||||||
const centerlausanne = document.getElementById('centerlausanne');
|
const centerlausanne = document.getElementById('centerlausanne');
|
||||||
centerlausanne.addEventListener('click', function() {
|
centerlausanne.addEventListener('click', function() {
|
||||||
const feature = source.getFeatures()[1];
|
const feature = source.getFeatures()[1];
|
||||||
const point = feature.getGeometry();
|
const point = /** @type {module:ol/geom/Point~Point} */ (feature.getGeometry());
|
||||||
const size = map.getSize();
|
const size = /** @type {module:ol/size~Size} */ (map.getSize());
|
||||||
view.centerOn(point.getCoordinates(), size, [570, 500]);
|
view.centerOn(point.getCoordinates(), size, [570, 500]);
|
||||||
}, false);
|
}, false);
|
||||||
|
|||||||
@@ -100,7 +100,8 @@ function xyz2rgb(x) {
|
|||||||
|
|
||||||
const raster = new RasterSource({
|
const raster = new RasterSource({
|
||||||
sources: [new Stamen({
|
sources: [new Stamen({
|
||||||
layer: 'watercolor'
|
layer: 'watercolor',
|
||||||
|
transition: 0
|
||||||
})],
|
})],
|
||||||
operation: function(pixels, data) {
|
operation: function(pixels, data) {
|
||||||
const hcl = rgb2hcl(pixels[0]);
|
const hcl = rgb2hcl(pixels[0]);
|
||||||
|
|||||||
@@ -9,11 +9,14 @@ import OSM from '../src/ol/source/OSM.js';
|
|||||||
// Define rotate to north control.
|
// Define rotate to north control.
|
||||||
//
|
//
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @constructor
|
||||||
|
* @extends {module:ol/control/Control~Control}
|
||||||
|
* @param {Object=} opt_options Control options.
|
||||||
|
*/
|
||||||
class RotateNorthControl extends Control {
|
class RotateNorthControl extends Control {
|
||||||
|
|
||||||
/**
|
|
||||||
* @param {Object=} opt_options Control options.
|
|
||||||
*/
|
|
||||||
constructor(opt_options) {
|
constructor(opt_options) {
|
||||||
const options = opt_options || {};
|
const options = opt_options || {};
|
||||||
|
|
||||||
|
|||||||
@@ -6,8 +6,5 @@ docs: >
|
|||||||
This example demonstrates creating a custom interaction by subclassing `ol/interaction/Pointer`.
|
This example demonstrates creating a custom interaction by subclassing `ol/interaction/Pointer`.
|
||||||
Note that the built in interaction `ol/interaction/Translate` might be a better option for moving features.
|
Note that the built in interaction `ol/interaction/Translate` might be a better option for moving features.
|
||||||
tags: "drag, feature, vector, editing, custom, interaction"
|
tags: "drag, feature, vector, editing, custom, interaction"
|
||||||
cloak:
|
|
||||||
- key: pk.eyJ1IjoiYWhvY2V2YXIiLCJhIjoiY2pzbmg0Nmk5MGF5NzQzbzRnbDNoeHJrbiJ9.7_-_gL8ur7ZtEiNwRfCy7Q
|
|
||||||
value: Your Mapbox access token from https://mapbox.com/ here
|
|
||||||
---
|
---
|
||||||
<div id="map" class="map"></div>
|
<div id="map" class="map"></div>
|
||||||
|
|||||||
@@ -8,6 +8,10 @@ import {TileJSON, Vector as VectorSource} from '../src/ol/source.js';
|
|||||||
import {Fill, Icon, Stroke, Style} from '../src/ol/style.js';
|
import {Fill, Icon, Stroke, Style} from '../src/ol/style.js';
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @constructor
|
||||||
|
* @extends {module:ol/interaction/Pointer}
|
||||||
|
*/
|
||||||
class Drag extends PointerInteraction {
|
class Drag extends PointerInteraction {
|
||||||
constructor() {
|
constructor() {
|
||||||
super({
|
super({
|
||||||
@@ -18,7 +22,7 @@ class Drag extends PointerInteraction {
|
|||||||
});
|
});
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @type {import("../src/ol/coordinate.js").Coordinate}
|
* @type {module:ol/pixel~Pixel}
|
||||||
* @private
|
* @private
|
||||||
*/
|
*/
|
||||||
this.coordinate_ = null;
|
this.coordinate_ = null;
|
||||||
@@ -30,7 +34,7 @@ class Drag extends PointerInteraction {
|
|||||||
this.cursor_ = 'pointer';
|
this.cursor_ = 'pointer';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @type {Feature}
|
* @type {module:ol/Feature~Feature}
|
||||||
* @private
|
* @private
|
||||||
*/
|
*/
|
||||||
this.feature_ = null;
|
this.feature_ = null;
|
||||||
@@ -45,7 +49,7 @@ class Drag extends PointerInteraction {
|
|||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param {import("../src/ol/MapBrowserEvent.js").default} evt Map browser event.
|
* @param {module:ol/MapBrowserEvent~MapBrowserEvent} evt Map browser event.
|
||||||
* @return {boolean} `true` to start the drag sequence.
|
* @return {boolean} `true` to start the drag sequence.
|
||||||
*/
|
*/
|
||||||
function handleDownEvent(evt) {
|
function handleDownEvent(evt) {
|
||||||
@@ -66,7 +70,7 @@ function handleDownEvent(evt) {
|
|||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param {import("../src/ol/MapBrowserEvent.js").default} evt Map browser event.
|
* @param {module:ol/MapBrowserEvent~MapBrowserEvent} evt Map browser event.
|
||||||
*/
|
*/
|
||||||
function handleDragEvent(evt) {
|
function handleDragEvent(evt) {
|
||||||
const deltaX = evt.coordinate[0] - this.coordinate_[0];
|
const deltaX = evt.coordinate[0] - this.coordinate_[0];
|
||||||
@@ -81,7 +85,7 @@ function handleDragEvent(evt) {
|
|||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param {import("../src/ol/MapBrowserEvent.js").default} evt Event.
|
* @param {module:ol/MapBrowserEvent~MapBrowserEvent} evt Event.
|
||||||
*/
|
*/
|
||||||
function handleMoveEvent(evt) {
|
function handleMoveEvent(evt) {
|
||||||
if (this.cursor_) {
|
if (this.cursor_) {
|
||||||
@@ -123,14 +127,13 @@ const polygonFeature = new Feature(
|
|||||||
new Polygon([[[-3e6, -1e6], [-3e6, 1e6],
|
new Polygon([[[-3e6, -1e6], [-3e6, 1e6],
|
||||||
[-1e6, 1e6], [-1e6, -1e6], [-3e6, -1e6]]]));
|
[-1e6, 1e6], [-1e6, -1e6], [-3e6, -1e6]]]));
|
||||||
|
|
||||||
const key = 'pk.eyJ1IjoiYWhvY2V2YXIiLCJhIjoiY2pzbmg0Nmk5MGF5NzQzbzRnbDNoeHJrbiJ9.7_-_gL8ur7ZtEiNwRfCy7Q';
|
|
||||||
|
|
||||||
const map = new Map({
|
const map = new Map({
|
||||||
interactions: defaultInteractions().extend([new Drag()]),
|
interactions: defaultInteractions().extend([new Drag()]),
|
||||||
layers: [
|
layers: [
|
||||||
new TileLayer({
|
new TileLayer({
|
||||||
source: new TileJSON({
|
source: new TileJSON({
|
||||||
url: 'https://a.tiles.mapbox.com/v4/aj.1x1-degrees.json?access_token=' + key
|
url: 'https://api.tiles.mapbox.com/v3/mapbox.geography-class.json?secure'
|
||||||
})
|
})
|
||||||
}),
|
}),
|
||||||
new VectorLayer({
|
new VectorLayer({
|
||||||
@@ -138,13 +141,13 @@ const map = new Map({
|
|||||||
features: [pointFeature, lineFeature, polygonFeature]
|
features: [pointFeature, lineFeature, polygonFeature]
|
||||||
}),
|
}),
|
||||||
style: new Style({
|
style: new Style({
|
||||||
image: new Icon({
|
image: new Icon(/** @type {module:ol/style/Icon~Options} */ ({
|
||||||
anchor: [0.5, 46],
|
anchor: [0.5, 46],
|
||||||
anchorXUnits: 'fraction',
|
anchorXUnits: 'fraction',
|
||||||
anchorYUnits: 'pixels',
|
anchorYUnits: 'pixels',
|
||||||
opacity: 0.95,
|
opacity: 0.95,
|
||||||
src: 'data/icon.png'
|
src: 'data/icon.png'
|
||||||
}),
|
})),
|
||||||
stroke: new Stroke({
|
stroke: new Stroke({
|
||||||
width: 3,
|
width: 3,
|
||||||
color: [255, 0, 0, 1]
|
color: [255, 0, 0, 1]
|
||||||
|
|||||||
@@ -1,4 +0,0 @@
|
|||||||
path.boundary {
|
|
||||||
fill: none;
|
|
||||||
stroke: #777;
|
|
||||||
}
|
|
||||||
@@ -3,10 +3,10 @@ layout: example.html
|
|||||||
title: d3 Integration
|
title: d3 Integration
|
||||||
shortdesc: Example of using OpenLayers and d3 together.
|
shortdesc: Example of using OpenLayers and d3 together.
|
||||||
docs: >
|
docs: >
|
||||||
The example loads TopoJSON geometries and uses d3 (<code>d3.geo.path</code>) to render these geometries to a SVG element.
|
<p>The example loads TopoJSON geometries and uses d3 (<code>d3.geo.path</code>) to render these geometries to a canvas element that is then used as the image of an OpenLayers image layer.</p>
|
||||||
tags: "d3"
|
tags: "d3"
|
||||||
resources:
|
resources:
|
||||||
- https://unpkg.com/d3@5.9.2/dist/d3.js
|
- https://unpkg.com/d3@4.12.0/build/d3.js
|
||||||
- https://unpkg.com/topojson@3.0.2/dist/topojson.js
|
- https://unpkg.com/topojson@3.0.2/dist/topojson.js
|
||||||
---
|
---
|
||||||
<div id="map" class="map"></div>
|
<div id="map" class="map"></div>
|
||||||
|
|||||||
124
examples/d3.js
vendored
124
examples/d3.js
vendored
@@ -1,70 +1,10 @@
|
|||||||
import Map from '../src/ol/Map.js';
|
import Map from '../src/ol/Map.js';
|
||||||
import View from '../src/ol/View.js';
|
import View from '../src/ol/View.js';
|
||||||
import {getWidth, getCenter} from '../src/ol/extent.js';
|
import {getWidth, getCenter} from '../src/ol/extent.js';
|
||||||
import {Layer, Tile as TileLayer} from '../src/ol/layer.js';
|
import {Image as ImageLayer, Tile as TileLayer} from '../src/ol/layer.js';
|
||||||
import SourceState from '../src/ol/source/State.js';
|
|
||||||
import {fromLonLat, toLonLat} from '../src/ol/proj.js';
|
import {fromLonLat, toLonLat} from '../src/ol/proj.js';
|
||||||
import Stamen from '../src/ol/source/Stamen.js';
|
import {ImageCanvas as ImageCanvasSource, Stamen} from '../src/ol/source.js';
|
||||||
|
|
||||||
class CanvasLayer extends Layer {
|
|
||||||
|
|
||||||
constructor(options) {
|
|
||||||
super(options);
|
|
||||||
|
|
||||||
this.features = options.features;
|
|
||||||
|
|
||||||
this.svg = d3.select(document.createElement('div')).append('svg')
|
|
||||||
.style('position', 'absolute');
|
|
||||||
|
|
||||||
this.svg.append('path')
|
|
||||||
.datum(this.features)
|
|
||||||
.attr('class', 'boundary');
|
|
||||||
}
|
|
||||||
|
|
||||||
getSourceState() {
|
|
||||||
return SourceState.READY;
|
|
||||||
}
|
|
||||||
|
|
||||||
render(frameState) {
|
|
||||||
const width = frameState.size[0];
|
|
||||||
const height = frameState.size[1];
|
|
||||||
const projection = frameState.viewState.projection;
|
|
||||||
const d3Projection = d3.geoMercator().scale(1).translate([0, 0]);
|
|
||||||
let d3Path = d3.geoPath().projection(d3Projection);
|
|
||||||
|
|
||||||
const pixelBounds = d3Path.bounds(this.features);
|
|
||||||
const pixelBoundsWidth = pixelBounds[1][0] - pixelBounds[0][0];
|
|
||||||
const pixelBoundsHeight = pixelBounds[1][1] - pixelBounds[0][1];
|
|
||||||
|
|
||||||
const geoBounds = d3.geoBounds(this.features);
|
|
||||||
const geoBoundsLeftBottom = fromLonLat(geoBounds[0], projection);
|
|
||||||
const geoBoundsRightTop = fromLonLat(geoBounds[1], projection);
|
|
||||||
let geoBoundsWidth = geoBoundsRightTop[0] - geoBoundsLeftBottom[0];
|
|
||||||
if (geoBoundsWidth < 0) {
|
|
||||||
geoBoundsWidth += getWidth(projection.getExtent());
|
|
||||||
}
|
|
||||||
const geoBoundsHeight = geoBoundsRightTop[1] - geoBoundsLeftBottom[1];
|
|
||||||
|
|
||||||
const widthResolution = geoBoundsWidth / pixelBoundsWidth;
|
|
||||||
const heightResolution = geoBoundsHeight / pixelBoundsHeight;
|
|
||||||
const r = Math.max(widthResolution, heightResolution);
|
|
||||||
const scale = r / frameState.viewState.resolution;
|
|
||||||
|
|
||||||
const center = toLonLat(getCenter(frameState.extent), projection);
|
|
||||||
d3Projection.scale(scale).center(center).translate([width / 2, height / 2]);
|
|
||||||
|
|
||||||
d3Path = d3Path.projection(d3Projection);
|
|
||||||
d3Path(this.features);
|
|
||||||
|
|
||||||
this.svg.attr('width', width);
|
|
||||||
this.svg.attr('height', height);
|
|
||||||
|
|
||||||
this.svg.select('path')
|
|
||||||
.attr('d', d3Path);
|
|
||||||
|
|
||||||
return this.svg.node();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const map = new Map({
|
const map = new Map({
|
||||||
layers: [
|
layers: [
|
||||||
@@ -85,11 +25,63 @@ const map = new Map({
|
|||||||
/**
|
/**
|
||||||
* Load the topojson data and create an ol/layer/Image for that data.
|
* Load the topojson data and create an ol/layer/Image for that data.
|
||||||
*/
|
*/
|
||||||
d3.json('data/topojson/us.json').then(function(us) {
|
d3.json('data/topojson/us.json', function(error, us) {
|
||||||
|
const features = topojson.feature(us, us.objects.counties);
|
||||||
|
|
||||||
const layer = new CanvasLayer({
|
/**
|
||||||
features: topojson.feature(us, us.objects.counties)
|
* This function uses d3 to render the topojson features to a canvas.
|
||||||
|
* @param {module:ol/extent~Extent} extent Extent.
|
||||||
|
* @param {number} resolution Resolution.
|
||||||
|
* @param {number} pixelRatio Pixel ratio.
|
||||||
|
* @param {module:ol/size~Size} size Size.
|
||||||
|
* @param {module:ol/proj/Projection~Projection} projection Projection.
|
||||||
|
* @return {HTMLCanvasElement} A canvas element.
|
||||||
|
*/
|
||||||
|
const canvasFunction = function(extent, resolution, pixelRatio, size, projection) {
|
||||||
|
const canvasWidth = size[0];
|
||||||
|
const canvasHeight = size[1];
|
||||||
|
|
||||||
|
const canvas = d3.select(document.createElement('canvas'));
|
||||||
|
canvas.attr('width', canvasWidth).attr('height', canvasHeight);
|
||||||
|
|
||||||
|
const context = canvas.node().getContext('2d');
|
||||||
|
|
||||||
|
const d3Projection = d3.geoMercator().scale(1).translate([0, 0]);
|
||||||
|
let d3Path = d3.geoPath().projection(d3Projection);
|
||||||
|
|
||||||
|
const pixelBounds = d3Path.bounds(features);
|
||||||
|
const pixelBoundsWidth = pixelBounds[1][0] - pixelBounds[0][0];
|
||||||
|
const pixelBoundsHeight = pixelBounds[1][1] - pixelBounds[0][1];
|
||||||
|
|
||||||
|
const geoBounds = d3.geoBounds(features);
|
||||||
|
const geoBoundsLeftBottom = fromLonLat(geoBounds[0], projection);
|
||||||
|
const geoBoundsRightTop = fromLonLat(geoBounds[1], projection);
|
||||||
|
let geoBoundsWidth = geoBoundsRightTop[0] - geoBoundsLeftBottom[0];
|
||||||
|
if (geoBoundsWidth < 0) {
|
||||||
|
geoBoundsWidth += getWidth(projection.getExtent());
|
||||||
|
}
|
||||||
|
const geoBoundsHeight = geoBoundsRightTop[1] - geoBoundsLeftBottom[1];
|
||||||
|
|
||||||
|
const widthResolution = geoBoundsWidth / pixelBoundsWidth;
|
||||||
|
const heightResolution = geoBoundsHeight / pixelBoundsHeight;
|
||||||
|
const r = Math.max(widthResolution, heightResolution);
|
||||||
|
const scale = r / (resolution / pixelRatio);
|
||||||
|
|
||||||
|
const center = toLonLat(getCenter(extent), projection);
|
||||||
|
d3Projection.scale(scale).center(center)
|
||||||
|
.translate([canvasWidth / 2, canvasHeight / 2]);
|
||||||
|
d3Path = d3Path.projection(d3Projection).context(context);
|
||||||
|
d3Path(features);
|
||||||
|
context.stroke();
|
||||||
|
|
||||||
|
return canvas.node();
|
||||||
|
};
|
||||||
|
|
||||||
|
const layer = new ImageLayer({
|
||||||
|
source: new ImageCanvasSource({
|
||||||
|
canvasFunction: canvasFunction,
|
||||||
|
projection: 'EPSG:3857'
|
||||||
|
})
|
||||||
});
|
});
|
||||||
|
|
||||||
map.addLayer(layer);
|
map.addLayer(layer);
|
||||||
});
|
});
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because one or more lines are too long
@@ -1,7 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
|
||||||
|
|
||||||
<svg width="20" height="20" xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<g>
|
|
||||||
<rect width="20" height="20" style="fill:#fff" />
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
||||||
|
Before Width: | Height: | Size: 194 B |
Binary file not shown.
|
Before Width: | Height: | Size: 7.8 KiB |
@@ -29,7 +29,7 @@ gn.init().then(function() {
|
|||||||
gn.start(function(event) {
|
gn.start(function(event) {
|
||||||
const center = view.getCenter();
|
const center = view.getCenter();
|
||||||
const resolution = view.getResolution();
|
const resolution = view.getResolution();
|
||||||
const alpha = toRadians(event.do.alpha);
|
const alpha = toRadians(event.do.beta);
|
||||||
const beta = toRadians(event.do.beta);
|
const beta = toRadians(event.do.beta);
|
||||||
const gamma = toRadians(event.do.gamma);
|
const gamma = toRadians(event.do.gamma);
|
||||||
|
|
||||||
@@ -40,6 +40,6 @@ gn.init().then(function() {
|
|||||||
center[0] -= resolution * gamma * 25;
|
center[0] -= resolution * gamma * 25;
|
||||||
center[1] += resolution * beta * 25;
|
center[1] += resolution * beta * 25;
|
||||||
|
|
||||||
view.setCenter(center);
|
view.setCenter(view.constrainCenter(center));
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ layout: example.html
|
|||||||
title: Drag-and-Drop Image Vector
|
title: Drag-and-Drop Image Vector
|
||||||
shortdesc: Example of using the drag-and-drop interaction with image vector rendering.
|
shortdesc: Example of using the drag-and-drop interaction with image vector rendering.
|
||||||
docs: >
|
docs: >
|
||||||
Example of using the drag-and-drop interaction with an `ol/layer/VectorImage` layer. Drag and drop GPX, GeoJSON, IGC, KML, or TopoJSON files on to the map. Each file is rendered to an image on the client.
|
Example of using the drag-and-drop interaction with an `ol/layer/Vector` with `renderMode: 'image'`. Drag and drop GPX, GeoJSON, IGC, KML, or TopoJSON files on to the map. Each file is rendered to an image on the client.
|
||||||
tags: "drag-and-drop-image-vector, gpx, geojson, igc, kml, topojson, vector, image"
|
tags: "drag-and-drop-image-vector, gpx, geojson, igc, kml, topojson, vector, image"
|
||||||
cloak:
|
cloak:
|
||||||
- key: As1HiMj1PvLPlqc_gtM7AqZfBL8ZL3VrjaS3zIb22Uvb9WKhuJObROC-qUpa81U5
|
- key: As1HiMj1PvLPlqc_gtM7AqZfBL8ZL3VrjaS3zIb22Uvb9WKhuJObROC-qUpa81U5
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ import Map from '../src/ol/Map.js';
|
|||||||
import View from '../src/ol/View.js';
|
import View from '../src/ol/View.js';
|
||||||
import {GPX, GeoJSON, IGC, KML, TopoJSON} from '../src/ol/format.js';
|
import {GPX, GeoJSON, IGC, KML, TopoJSON} from '../src/ol/format.js';
|
||||||
import {defaults as defaultInteractions, DragAndDrop} from '../src/ol/interaction.js';
|
import {defaults as defaultInteractions, DragAndDrop} from '../src/ol/interaction.js';
|
||||||
import {VectorImage as VectorImageLayer, Tile as TileLayer} from '../src/ol/layer.js';
|
import {Vector as VectorLayer, Tile as TileLayer} from '../src/ol/layer.js';
|
||||||
import {BingMaps, Vector as VectorSource} from '../src/ol/source.js';
|
import {BingMaps, Vector as VectorSource} from '../src/ol/source.js';
|
||||||
|
|
||||||
const dragAndDropInteraction = new DragAndDrop({
|
const dragAndDropInteraction = new DragAndDrop({
|
||||||
@@ -36,7 +36,8 @@ dragAndDropInteraction.on('addfeatures', function(event) {
|
|||||||
const vectorSource = new VectorSource({
|
const vectorSource = new VectorSource({
|
||||||
features: event.features
|
features: event.features
|
||||||
});
|
});
|
||||||
map.addLayer(new VectorImageLayer({
|
map.addLayer(new VectorLayer({
|
||||||
|
renderMode: 'image',
|
||||||
source: vectorSource
|
source: vectorSource
|
||||||
}));
|
}));
|
||||||
map.getView().fit(vectorSource.getExtent());
|
map.getView().fit(vectorSource.getExtent());
|
||||||
|
|||||||
@@ -4,14 +4,14 @@ import {MultiPoint, Point} from '../src/ol/geom.js';
|
|||||||
import TileLayer from '../src/ol/layer/Tile.js';
|
import TileLayer from '../src/ol/layer/Tile.js';
|
||||||
import OSM from '../src/ol/source/OSM.js';
|
import OSM from '../src/ol/source/OSM.js';
|
||||||
import {Circle as CircleStyle, Fill, Stroke, Style} from '../src/ol/style.js';
|
import {Circle as CircleStyle, Fill, Stroke, Style} from '../src/ol/style.js';
|
||||||
import {getVectorContext} from '../src/ol/render.js';
|
|
||||||
|
|
||||||
const tileLayer = new TileLayer({
|
|
||||||
source: new OSM()
|
|
||||||
});
|
|
||||||
|
|
||||||
const map = new Map({
|
const map = new Map({
|
||||||
layers: [tileLayer],
|
layers: [
|
||||||
|
new TileLayer({
|
||||||
|
source: new OSM()
|
||||||
|
})
|
||||||
|
],
|
||||||
target: 'map',
|
target: 'map',
|
||||||
view: new View({
|
view: new View({
|
||||||
center: [0, 0],
|
center: [0, 0],
|
||||||
@@ -46,8 +46,8 @@ const omegaTheta = 30000; // Rotation period in ms
|
|||||||
const R = 7e6;
|
const R = 7e6;
|
||||||
const r = 2e6;
|
const r = 2e6;
|
||||||
const p = 2e6;
|
const p = 2e6;
|
||||||
tileLayer.on('postrender', function(event) {
|
map.on('postcompose', function(event) {
|
||||||
const vectorContext = getVectorContext(event);
|
const vectorContext = event.vectorContext;
|
||||||
const frameState = event.frameState;
|
const frameState = event.frameState;
|
||||||
const theta = 2 * Math.PI * frameState.time / omegaTheta;
|
const theta = 2 * Math.PI * frameState.time / omegaTheta;
|
||||||
const coordinates = [];
|
const coordinates = [];
|
||||||
|
|||||||
18
examples/earthquake-clusters.css
Normal file
18
examples/earthquake-clusters.css
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
#map {
|
||||||
|
position: relative;
|
||||||
|
}
|
||||||
|
#info {
|
||||||
|
position: absolute;
|
||||||
|
height: 1px;
|
||||||
|
width: 1px;
|
||||||
|
z-index: 100;
|
||||||
|
}
|
||||||
|
.tooltip.in {
|
||||||
|
opacity: 1;
|
||||||
|
}
|
||||||
|
.tooltip.top .tooltip-arrow {
|
||||||
|
border-top-color: white;
|
||||||
|
}
|
||||||
|
.tooltip-inner {
|
||||||
|
border: 2px solid white;
|
||||||
|
}
|
||||||
@@ -26,8 +26,9 @@ const styleFunction = function(feature) {
|
|||||||
scale = size / 10;
|
scale = size / 10;
|
||||||
let style = styleCache[size];
|
let style = styleCache[size];
|
||||||
if (!style) {
|
if (!style) {
|
||||||
const canvas = document.createElement('canvas');
|
const canvas = /** @type {HTMLCanvasElement} */ (document.createElement('canvas'));
|
||||||
const vectorContext = toContext(canvas.getContext('2d'),
|
const vectorContext = toContext(
|
||||||
|
/** @type {CanvasRenderingContext2D} */ (canvas.getContext('2d')),
|
||||||
{size: [size, size], pixelRatio: 1});
|
{size: [size, size], pixelRatio: 1});
|
||||||
vectorContext.setStyle(new Style({
|
vectorContext.setStyle(new Style({
|
||||||
fill: new Fill({color: 'rgba(255, 153, 0, 0.4)'}),
|
fill: new Fill({color: 'rgba(255, 153, 0, 0.4)'}),
|
||||||
|
|||||||
@@ -1,16 +0,0 @@
|
|||||||
---
|
|
||||||
layout: example.html
|
|
||||||
title: Geographic Editing
|
|
||||||
shortdesc: Editing geometries with geographic coordinates.
|
|
||||||
docs: >
|
|
||||||
Calling the <code>useGeographic</code> function in the <code>'ol/proj'</code> module
|
|
||||||
makes it so the map view uses geographic coordinates (even if the view projection is
|
|
||||||
not geographic).
|
|
||||||
tags: "geographic"
|
|
||||||
experimental: true
|
|
||||||
---
|
|
||||||
<div id="map" class="map"></div>
|
|
||||||
<select id="mode">
|
|
||||||
<option value="modify">select a feature to modify</option>
|
|
||||||
<option value="draw">draw new features</option>
|
|
||||||
</select>
|
|
||||||
@@ -1,63 +0,0 @@
|
|||||||
import {Map, View} from '../src/ol/index.js';
|
|
||||||
import GeoJSON from '../src/ol/format/GeoJSON.js';
|
|
||||||
import {Modify, Select, Draw} from '../src/ol/interaction.js';
|
|
||||||
import {Tile as TileLayer, Vector as VectorLayer} from '../src/ol/layer.js';
|
|
||||||
import {OSM, Vector as VectorSource} from '../src/ol/source.js';
|
|
||||||
import {useGeographic} from '../src/ol/proj.js';
|
|
||||||
|
|
||||||
useGeographic();
|
|
||||||
|
|
||||||
const source = new VectorSource({
|
|
||||||
url: 'data/geojson/countries.geojson',
|
|
||||||
format: new GeoJSON()
|
|
||||||
});
|
|
||||||
|
|
||||||
const map = new Map({
|
|
||||||
target: 'map',
|
|
||||||
layers: [
|
|
||||||
new TileLayer({
|
|
||||||
source: new OSM()
|
|
||||||
}),
|
|
||||||
new VectorLayer({
|
|
||||||
source: source
|
|
||||||
})
|
|
||||||
],
|
|
||||||
view: new View({
|
|
||||||
center: [0, 0],
|
|
||||||
zoom: 2
|
|
||||||
})
|
|
||||||
});
|
|
||||||
|
|
||||||
const select = new Select();
|
|
||||||
|
|
||||||
const modify = new Modify({
|
|
||||||
features: select.getFeatures()
|
|
||||||
});
|
|
||||||
|
|
||||||
const draw = new Draw({
|
|
||||||
type: 'Polygon',
|
|
||||||
source: source
|
|
||||||
});
|
|
||||||
|
|
||||||
const mode = document.getElementById('mode');
|
|
||||||
function onChange() {
|
|
||||||
switch (mode.value) {
|
|
||||||
case 'draw': {
|
|
||||||
map.removeInteraction(modify);
|
|
||||||
map.removeInteraction(select);
|
|
||||||
map.addInteraction(draw);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 'modify': {
|
|
||||||
map.removeInteraction(draw);
|
|
||||||
map.addInteraction(select);
|
|
||||||
map.addInteraction(modify);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
default: {
|
|
||||||
// pass
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
mode.addEventListener('change', onChange);
|
|
||||||
onChange();
|
|
||||||
@@ -1,6 +0,0 @@
|
|||||||
.overlay {
|
|
||||||
background-color: yellow;
|
|
||||||
border-radius: 6px;
|
|
||||||
padding: 4px;
|
|
||||||
white-space: nowrap;
|
|
||||||
}
|
|
||||||
@@ -3,13 +3,12 @@ layout: example.html
|
|||||||
title: Map Export
|
title: Map Export
|
||||||
shortdesc: Example of exporting a map as a PNG image.
|
shortdesc: Example of exporting a map as a PNG image.
|
||||||
docs: >
|
docs: >
|
||||||
Example of exporting a map as a PNG image. This example use the <a href="https://www.npmjs.com/package/html-to-image">html-to-image</a>
|
Example of exporting a map as a PNG image. This example requires a browser
|
||||||
library.
|
that supports <a href="https://developer.mozilla.org/de/docs/Web/API/HTMLCanvasElement/toBlob#Browser_compatibility">
|
||||||
|
<code>canvas.toBlob()</code></a>.
|
||||||
tags: "export, png, openstreetmap"
|
tags: "export, png, openstreetmap"
|
||||||
|
resources:
|
||||||
|
- https://cdnjs.cloudflare.com/ajax/libs/FileSaver.js/1.3.3/FileSaver.min.js
|
||||||
---
|
---
|
||||||
<div id="map" class="map"></div>
|
<div id="map" class="map"></div>
|
||||||
<div style="display: none;">
|
|
||||||
<div class="overlay" id="null">Null Island</div>
|
|
||||||
</div>
|
|
||||||
<a id="export-png" class="btn btn-default"><i class="fa fa-download"></i> Download PNG</a>
|
<a id="export-png" class="btn btn-default"><i class="fa fa-download"></i> Download PNG</a>
|
||||||
<a id="image-download" download="map.png"></a>
|
|
||||||
|
|||||||
@@ -1,12 +1,9 @@
|
|||||||
import Map from '../src/ol/Map.js';
|
import Map from '../src/ol/Map.js';
|
||||||
import View from '../src/ol/View.js';
|
import View from '../src/ol/View.js';
|
||||||
import Overlay from '../src/ol/Overlay.js';
|
|
||||||
import GeoJSON from '../src/ol/format/GeoJSON.js';
|
import GeoJSON from '../src/ol/format/GeoJSON.js';
|
||||||
import {Tile as TileLayer, Vector as VectorLayer} from '../src/ol/layer.js';
|
import {Tile as TileLayer, Vector as VectorLayer} from '../src/ol/layer.js';
|
||||||
import {OSM, Vector as VectorSource} from '../src/ol/source.js';
|
import {OSM, Vector as VectorSource} from '../src/ol/source.js';
|
||||||
|
|
||||||
import {toPng} from 'html-to-image';
|
|
||||||
|
|
||||||
const map = new Map({
|
const map = new Map({
|
||||||
layers: [
|
layers: [
|
||||||
new TileLayer({
|
new TileLayer({
|
||||||
@@ -26,28 +23,16 @@ const map = new Map({
|
|||||||
})
|
})
|
||||||
});
|
});
|
||||||
|
|
||||||
map.addOverlay(new Overlay({
|
|
||||||
position: [0, 0],
|
|
||||||
element: document.getElementById('null')
|
|
||||||
}));
|
|
||||||
|
|
||||||
|
|
||||||
// export options for html-to-image.
|
|
||||||
// See: https://github.com/bubkoo/html-to-image#options
|
|
||||||
const exportOptions = {
|
|
||||||
filter: function(element) {
|
|
||||||
return element.className ? element.className.indexOf('ol-control') === -1 : true;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
document.getElementById('export-png').addEventListener('click', function() {
|
document.getElementById('export-png').addEventListener('click', function() {
|
||||||
map.once('rendercomplete', function() {
|
map.once('rendercomplete', function(event) {
|
||||||
toPng(map.getTargetElement(), exportOptions)
|
const canvas = event.context.canvas;
|
||||||
.then(function(dataURL) {
|
if (navigator.msSaveBlob) {
|
||||||
const link = document.getElementById('image-download');
|
navigator.msSaveBlob(canvas.msToBlob(), 'map.png');
|
||||||
link.href = dataURL;
|
} else {
|
||||||
link.click();
|
canvas.toBlob(function(blob) {
|
||||||
|
saveAs(blob, 'map.png');
|
||||||
});
|
});
|
||||||
|
}
|
||||||
});
|
});
|
||||||
map.renderSync();
|
map.renderSync();
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -4,8 +4,6 @@ import WKT from '../src/ol/format/WKT.js';
|
|||||||
import {Tile as TileLayer, Vector as VectorLayer} from '../src/ol/layer.js';
|
import {Tile as TileLayer, Vector as VectorLayer} from '../src/ol/layer.js';
|
||||||
import {OSM, Vector as VectorSource} from '../src/ol/source.js';
|
import {OSM, Vector as VectorSource} from '../src/ol/source.js';
|
||||||
|
|
||||||
import {toJpeg} from 'html-to-image';
|
|
||||||
|
|
||||||
const raster = new TileLayer({
|
const raster = new TileLayer({
|
||||||
source: new OSM()
|
source: new OSM()
|
||||||
});
|
});
|
||||||
@@ -43,15 +41,6 @@ const dims = {
|
|||||||
a5: [210, 148]
|
a5: [210, 148]
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
// export options for html-to-image.
|
|
||||||
// See: https://github.com/bubkoo/html-to-image#options
|
|
||||||
const exportOptions = {
|
|
||||||
filter: function(element) {
|
|
||||||
return element.className.indexOf('ol-control') === -1;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
const exportButton = document.getElementById('export-pdf');
|
const exportButton = document.getElementById('export-pdf');
|
||||||
|
|
||||||
exportButton.addEventListener('click', function() {
|
exportButton.addEventListener('click', function() {
|
||||||
@@ -64,28 +53,25 @@ exportButton.addEventListener('click', function() {
|
|||||||
const dim = dims[format];
|
const dim = dims[format];
|
||||||
const width = Math.round(dim[0] * resolution / 25.4);
|
const width = Math.round(dim[0] * resolution / 25.4);
|
||||||
const height = Math.round(dim[1] * resolution / 25.4);
|
const height = Math.round(dim[1] * resolution / 25.4);
|
||||||
const size = map.getSize();
|
const size = /** @type {module:ol/size~Size} */ (map.getSize());
|
||||||
const viewResolution = map.getView().getResolution();
|
const extent = map.getView().calculateExtent(size);
|
||||||
|
|
||||||
map.once('rendercomplete', function() {
|
map.once('rendercomplete', function(event) {
|
||||||
exportOptions.width = width;
|
const canvas = event.context.canvas;
|
||||||
exportOptions.height = height;
|
const data = canvas.toDataURL('image/jpeg');
|
||||||
toJpeg(map.getViewport(), exportOptions).then(function(dataUrl) {
|
const pdf = new jsPDF('landscape', undefined, format);
|
||||||
const pdf = new jsPDF('landscape', undefined, format);
|
pdf.addImage(data, 'JPEG', 0, 0, dim[0], dim[1]);
|
||||||
pdf.addImage(dataUrl, 'JPEG', 0, 0, dim[0], dim[1]);
|
pdf.save('map.pdf');
|
||||||
pdf.save('map.pdf');
|
// Reset original map size
|
||||||
// Reset original map size
|
map.setSize(size);
|
||||||
map.setSize(size);
|
map.getView().fit(extent, {size});
|
||||||
map.getView().setResolution(viewResolution);
|
exportButton.disabled = false;
|
||||||
exportButton.disabled = false;
|
document.body.style.cursor = 'auto';
|
||||||
document.body.style.cursor = 'auto';
|
|
||||||
});
|
|
||||||
});
|
});
|
||||||
|
|
||||||
// Set print size
|
// Set print size
|
||||||
const printSize = [width, height];
|
const printSize = [width, height];
|
||||||
map.setSize(printSize);
|
map.setSize(printSize);
|
||||||
const scaling = Math.min(width / size[0], height / size[1]);
|
map.getView().fit(extent, {size: printSize});
|
||||||
map.getView().setResolution(viewResolution / scaling);
|
|
||||||
|
|
||||||
}, false);
|
}, false);
|
||||||
|
|||||||
@@ -1,9 +0,0 @@
|
|||||||
---
|
|
||||||
layout: example.html
|
|
||||||
title: Constrained Extent
|
|
||||||
shortdesc: Example of a view with a constrained extent.
|
|
||||||
docs: >
|
|
||||||
This map has a view that is constrained in an extent. This is done using the `extent` view option. Please note that specifying `constrainOnlyCenter: true` would only apply the extent restriction to the view center.
|
|
||||||
tags: "view, extent, constrain, restrict"
|
|
||||||
---
|
|
||||||
<div id="map" class="map"></div>
|
|
||||||
@@ -1,25 +0,0 @@
|
|||||||
import Map from '../src/ol/Map.js';
|
|
||||||
import View from '../src/ol/View.js';
|
|
||||||
import TileLayer from '../src/ol/layer/Tile.js';
|
|
||||||
import OSM from '../src/ol/source/OSM.js';
|
|
||||||
import {defaults as defaultControls} from '../src/ol/control.js';
|
|
||||||
import ZoomSlider from '../src/ol/control/ZoomSlider.js';
|
|
||||||
|
|
||||||
const view = new View({
|
|
||||||
center: [328627.563458, 5921296.662223],
|
|
||||||
zoom: 8,
|
|
||||||
extent: [-572513.341856, 5211017.966314,
|
|
||||||
916327.095083, 6636950.728974]
|
|
||||||
});
|
|
||||||
|
|
||||||
new Map({
|
|
||||||
layers: [
|
|
||||||
new TileLayer({
|
|
||||||
source: new OSM()
|
|
||||||
})
|
|
||||||
],
|
|
||||||
keyboardEventTarget: document,
|
|
||||||
target: 'map',
|
|
||||||
view: view,
|
|
||||||
controls: defaultControls().extend([new ZoomSlider()])
|
|
||||||
});
|
|
||||||
@@ -1,5 +1,6 @@
|
|||||||
import Map from '../src/ol/Map.js';
|
import Map from '../src/ol/Map.js';
|
||||||
import View from '../src/ol/View.js';
|
import View from '../src/ol/View.js';
|
||||||
|
import {platformModifierKeyOnly} from '../src/ol/events/condition.js';
|
||||||
import GeoJSON from '../src/ol/format/GeoJSON.js';
|
import GeoJSON from '../src/ol/format/GeoJSON.js';
|
||||||
import ExtentInteraction from '../src/ol/interaction/Extent.js';
|
import ExtentInteraction from '../src/ol/interaction/Extent.js';
|
||||||
import {Tile as TileLayer, Vector as VectorLayer} from '../src/ol/layer.js';
|
import {Tile as TileLayer, Vector as VectorLayer} from '../src/ol/layer.js';
|
||||||
@@ -26,7 +27,9 @@ const map = new Map({
|
|||||||
})
|
})
|
||||||
});
|
});
|
||||||
|
|
||||||
const extent = new ExtentInteraction();
|
const extent = new ExtentInteraction({
|
||||||
|
condition: platformModifierKeyOnly
|
||||||
|
});
|
||||||
map.addInteraction(extent);
|
map.addInteraction(extent);
|
||||||
extent.setActive(false);
|
extent.setActive(false);
|
||||||
|
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ layout: example.html
|
|||||||
title: Custom Animation
|
title: Custom Animation
|
||||||
shortdesc: Demonstrates how to animate features.
|
shortdesc: Demonstrates how to animate features.
|
||||||
docs: >
|
docs: >
|
||||||
This example shows how to use <b>postrender</b> and <b>vectorContext</b> to
|
This example shows how to use <b>postcompose</b> and <b>vectorContext</b> to
|
||||||
animate features. Here we choose to do a flash animation each time a feature
|
animate features. Here we choose to do a flash animation each time a feature
|
||||||
is added to the layer.
|
is added to the layer.
|
||||||
tags: "animation, vector, feature, flash"
|
tags: "animation, vector, feature, flash"
|
||||||
|
|||||||
@@ -8,21 +8,20 @@ import {Tile as TileLayer, Vector as VectorLayer} from '../src/ol/layer.js';
|
|||||||
import {fromLonLat} from '../src/ol/proj.js';
|
import {fromLonLat} from '../src/ol/proj.js';
|
||||||
import {OSM, Vector as VectorSource} from '../src/ol/source.js';
|
import {OSM, Vector as VectorSource} from '../src/ol/source.js';
|
||||||
import {Circle as CircleStyle, Stroke, Style} from '../src/ol/style.js';
|
import {Circle as CircleStyle, Stroke, Style} from '../src/ol/style.js';
|
||||||
import {getVectorContext} from '../src/ol/render.js';
|
|
||||||
|
|
||||||
const tileLayer = new TileLayer({
|
|
||||||
source: new OSM({
|
|
||||||
wrapX: false
|
|
||||||
})
|
|
||||||
});
|
|
||||||
|
|
||||||
const map = new Map({
|
const map = new Map({
|
||||||
layers: [tileLayer],
|
layers: [
|
||||||
|
new TileLayer({
|
||||||
|
source: new OSM({
|
||||||
|
wrapX: false
|
||||||
|
})
|
||||||
|
})
|
||||||
|
],
|
||||||
target: 'map',
|
target: 'map',
|
||||||
view: new View({
|
view: new View({
|
||||||
center: [0, 0],
|
center: [0, 0],
|
||||||
zoom: 1,
|
zoom: 1
|
||||||
multiWorld: true
|
|
||||||
})
|
})
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -45,10 +44,10 @@ function addRandomFeature() {
|
|||||||
const duration = 3000;
|
const duration = 3000;
|
||||||
function flash(feature) {
|
function flash(feature) {
|
||||||
const start = new Date().getTime();
|
const start = new Date().getTime();
|
||||||
const listenerKey = tileLayer.on('postrender', animate);
|
const listenerKey = map.on('postcompose', animate);
|
||||||
|
|
||||||
function animate(event) {
|
function animate(event) {
|
||||||
const vectorContext = getVectorContext(event);
|
const vectorContext = event.vectorContext;
|
||||||
const frameState = event.frameState;
|
const frameState = event.frameState;
|
||||||
const flashGeom = feature.getGeometry().clone();
|
const flashGeom = feature.getGeometry().clone();
|
||||||
const elapsed = frameState.time - start;
|
const elapsed = frameState.time - start;
|
||||||
@@ -73,7 +72,7 @@ function flash(feature) {
|
|||||||
unByKey(listenerKey);
|
unByKey(listenerKey);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
// tell OpenLayers to continue postrender animation
|
// tell OpenLayers to continue postcompose animation
|
||||||
map.render();
|
map.render();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,10 +3,10 @@ layout: example.html
|
|||||||
title: Marker Animation
|
title: Marker Animation
|
||||||
shortdesc: Demonstrates how to move a feature along a line.
|
shortdesc: Demonstrates how to move a feature along a line.
|
||||||
docs: >
|
docs: >
|
||||||
This example shows how to use <b>postrender</b> events and a <b>vector context</b> to
|
This example shows how to use <b>postcompose</b> and <b>vectorContext</b> to
|
||||||
animate a marker feature along a line. In this example an encoded polyline
|
animate a (marker) feature along a line. In this example an encoded polyline
|
||||||
is being used.
|
is being used.
|
||||||
tags: "animation, feature, postrender, polyline"
|
tags: "animation, feature, postcompose, polyline"
|
||||||
cloak:
|
cloak:
|
||||||
- key: As1HiMj1PvLPlqc_gtM7AqZfBL8ZL3VrjaS3zIb22Uvb9WKhuJObROC-qUpa81U5
|
- key: As1HiMj1PvLPlqc_gtM7AqZfBL8ZL3VrjaS3zIb22Uvb9WKhuJObROC-qUpa81U5
|
||||||
value: Your Bing Maps Key from http://www.bingmapsportal.com/ here
|
value: Your Bing Maps Key from http://www.bingmapsportal.com/ here
|
||||||
|
|||||||
@@ -7,7 +7,6 @@ import {Tile as TileLayer, Vector as VectorLayer} from '../src/ol/layer.js';
|
|||||||
import BingMaps from '../src/ol/source/BingMaps.js';
|
import BingMaps from '../src/ol/source/BingMaps.js';
|
||||||
import VectorSource from '../src/ol/source/Vector.js';
|
import VectorSource from '../src/ol/source/Vector.js';
|
||||||
import {Circle as CircleStyle, Fill, Icon, Stroke, Style} from '../src/ol/style.js';
|
import {Circle as CircleStyle, Fill, Icon, Stroke, Style} from '../src/ol/style.js';
|
||||||
import {getVectorContext} from '../src/ol/render.js';
|
|
||||||
|
|
||||||
// This long string is placed here due to jsFiddle limitations.
|
// This long string is placed here due to jsFiddle limitations.
|
||||||
// It is usually loaded with AJAX.
|
// It is usually loaded with AJAX.
|
||||||
@@ -53,7 +52,7 @@ const polyline = [
|
|||||||
'~@ym@yjA??a@cFd@kBrCgDbAUnAcBhAyAdk@et@??kF}D??OL'
|
'~@ym@yjA??a@cFd@kBrCgDbAUnAcBhAyAdk@et@??kF}D??OL'
|
||||||
].join('');
|
].join('');
|
||||||
|
|
||||||
const route = /** @type {import("../src/ol/geom/LineString.js").default} */ (new Polyline({
|
const route = /** @type {module:ol/geom/LineString~LineString} */ (new Polyline({
|
||||||
factor: 1e6
|
factor: 1e6
|
||||||
}).readGeometry(polyline, {
|
}).readGeometry(polyline, {
|
||||||
dataProjection: 'EPSG:4326',
|
dataProjection: 'EPSG:4326',
|
||||||
@@ -67,10 +66,10 @@ const routeFeature = new Feature({
|
|||||||
type: 'route',
|
type: 'route',
|
||||||
geometry: route
|
geometry: route
|
||||||
});
|
});
|
||||||
const geoMarker = /** @type Feature<import("../src/ol/geom/Point").default> */(new Feature({
|
const geoMarker = new Feature({
|
||||||
type: 'geoMarker',
|
type: 'geoMarker',
|
||||||
geometry: new Point(routeCoords[0])
|
geometry: new Point(routeCoords[0])
|
||||||
}));
|
});
|
||||||
const startMarker = new Feature({
|
const startMarker = new Feature({
|
||||||
type: 'icon',
|
type: 'icon',
|
||||||
geometry: new Point(routeCoords[0])
|
geometry: new Point(routeCoords[0])
|
||||||
@@ -124,6 +123,7 @@ const vectorLayer = new VectorLayer({
|
|||||||
const center = [-5639523.95, -3501274.52];
|
const center = [-5639523.95, -3501274.52];
|
||||||
const map = new Map({
|
const map = new Map({
|
||||||
target: document.getElementById('map'),
|
target: document.getElementById('map'),
|
||||||
|
loadTilesWhileAnimating: true,
|
||||||
view: new View({
|
view: new View({
|
||||||
center: center,
|
center: center,
|
||||||
zoom: 10,
|
zoom: 10,
|
||||||
@@ -133,7 +133,7 @@ const map = new Map({
|
|||||||
layers: [
|
layers: [
|
||||||
new TileLayer({
|
new TileLayer({
|
||||||
source: new BingMaps({
|
source: new BingMaps({
|
||||||
imagerySet: 'AerialWithLabelsOnDemand',
|
imagerySet: 'AerialWithLabels',
|
||||||
key: 'As1HiMj1PvLPlqc_gtM7AqZfBL8ZL3VrjaS3zIb22Uvb9WKhuJObROC-qUpa81U5'
|
key: 'As1HiMj1PvLPlqc_gtM7AqZfBL8ZL3VrjaS3zIb22Uvb9WKhuJObROC-qUpa81U5'
|
||||||
})
|
})
|
||||||
}),
|
}),
|
||||||
@@ -142,7 +142,7 @@ const map = new Map({
|
|||||||
});
|
});
|
||||||
|
|
||||||
const moveFeature = function(event) {
|
const moveFeature = function(event) {
|
||||||
const vectorContext = getVectorContext(event);
|
const vectorContext = event.vectorContext;
|
||||||
const frameState = event.frameState;
|
const frameState = event.frameState;
|
||||||
|
|
||||||
if (animating) {
|
if (animating) {
|
||||||
@@ -160,7 +160,7 @@ const moveFeature = function(event) {
|
|||||||
const feature = new Feature(currentPoint);
|
const feature = new Feature(currentPoint);
|
||||||
vectorContext.drawFeature(feature, styles.geoMarker);
|
vectorContext.drawFeature(feature, styles.geoMarker);
|
||||||
}
|
}
|
||||||
// tell OpenLayers to continue the postrender animation
|
// tell OpenLayers to continue the postcompose animation
|
||||||
map.render();
|
map.render();
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -176,7 +176,7 @@ function startAnimation() {
|
|||||||
geoMarker.setStyle(null);
|
geoMarker.setStyle(null);
|
||||||
// just in case you pan somewhere else
|
// just in case you pan somewhere else
|
||||||
map.getView().setCenter(center);
|
map.getView().setCenter(center);
|
||||||
vectorLayer.on('postrender', moveFeature);
|
map.on('postcompose', moveFeature);
|
||||||
map.render();
|
map.render();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -191,10 +191,10 @@ function stopAnimation(ended) {
|
|||||||
|
|
||||||
// if animation cancelled set the marker at the beginning
|
// if animation cancelled set the marker at the beginning
|
||||||
const coord = ended ? routeCoords[routeLength - 1] : routeCoords[0];
|
const coord = ended ? routeCoords[routeLength - 1] : routeCoords[0];
|
||||||
const geometry = geoMarker.getGeometry();
|
/** @type {module:ol/geom/Point~Point} */ (geoMarker.getGeometry())
|
||||||
geometry.setCoordinates(coord);
|
.setCoordinates(coord);
|
||||||
//remove listener
|
//remove listener
|
||||||
vectorLayer.un('postrender', moveFeature);
|
map.un('postcompose', moveFeature);
|
||||||
}
|
}
|
||||||
|
|
||||||
startButton.addEventListener('click', startAnimation, false);
|
startButton.addEventListener('click', startAnimation, false);
|
||||||
|
|||||||
@@ -1,26 +0,0 @@
|
|||||||
---
|
|
||||||
layout: example.html
|
|
||||||
title: Filtering features with WebGL
|
|
||||||
shortdesc: Using WebGL to filter large quantities of features
|
|
||||||
docs: >
|
|
||||||
This example shows how to use `ol/renderer/webgl/PointsLayer` to dynamically filter a large amount
|
|
||||||
of point geometries. The above map is based on a dataset from the NASA containing 45k recorded meteorite
|
|
||||||
landing sites. Each meteorite is marked by a circle on the map (the bigger the circle, the heavier
|
|
||||||
the object). A pulse effect has been added, which is slightly offset by the year of the impact.
|
|
||||||
|
|
||||||
Adjusting the sliders causes the objects outside of the date range to be filtered out of the map. This is done using
|
|
||||||
a custom fragment shader on the layer renderer, and by using the `v_opacity` attribute of the rendered objects
|
|
||||||
to store the year of impact.
|
|
||||||
|
|
||||||
tags: "webgl, icon, sprite, filter, feature"
|
|
||||||
experimental: true
|
|
||||||
---
|
|
||||||
<div id="map" class="map"></div>
|
|
||||||
<form>
|
|
||||||
<div id="status">Show impacts between <span class="min-year"></span> and <span class="max-year"></span></div>
|
|
||||||
|
|
||||||
<label>Minimum year:</label>
|
|
||||||
<input id="min-year" type="range" min="1850" max="2015" step="1" value="1850"/>
|
|
||||||
<label>Maximum year:</label>
|
|
||||||
<input id="max-year" type="range" min="1850" max="2015" step="1" value="2015"/>
|
|
||||||
</form>
|
|
||||||
@@ -1,186 +0,0 @@
|
|||||||
import Map from '../src/ol/Map.js';
|
|
||||||
import View from '../src/ol/View.js';
|
|
||||||
import TileLayer from '../src/ol/layer/Tile.js';
|
|
||||||
import Feature from '../src/ol/Feature.js';
|
|
||||||
import Point from '../src/ol/geom/Point.js';
|
|
||||||
import VectorLayer from '../src/ol/layer/Vector.js';
|
|
||||||
import {Vector} from '../src/ol/source.js';
|
|
||||||
import {fromLonLat} from '../src/ol/proj.js';
|
|
||||||
import WebGLPointsLayerRenderer from '../src/ol/renderer/webgl/PointsLayer.js';
|
|
||||||
import {clamp} from '../src/ol/math.js';
|
|
||||||
import Stamen from '../src/ol/source/Stamen.js';
|
|
||||||
import {formatColor} from '../src/ol/webgl/ShaderBuilder.js';
|
|
||||||
|
|
||||||
const vectorSource = new Vector({
|
|
||||||
attributions: 'NASA'
|
|
||||||
});
|
|
||||||
|
|
||||||
const oldColor = [180, 140, 140];
|
|
||||||
const newColor = [255, 80, 80];
|
|
||||||
|
|
||||||
const startTime = Date.now() * 0.001;
|
|
||||||
|
|
||||||
// hanle input values & events
|
|
||||||
const minYearInput = document.getElementById('min-year');
|
|
||||||
const maxYearInput = document.getElementById('max-year');
|
|
||||||
function updateStatusText() {
|
|
||||||
const div = document.getElementById('status');
|
|
||||||
div.querySelector('span.min-year').textContent = minYearInput.value;
|
|
||||||
div.querySelector('span.max-year').textContent = maxYearInput.value;
|
|
||||||
}
|
|
||||||
minYearInput.addEventListener('input', updateStatusText);
|
|
||||||
minYearInput.addEventListener('change', updateStatusText);
|
|
||||||
maxYearInput.addEventListener('input', updateStatusText);
|
|
||||||
maxYearInput.addEventListener('change', updateStatusText);
|
|
||||||
updateStatusText();
|
|
||||||
|
|
||||||
class WebglPointsLayer extends VectorLayer {
|
|
||||||
createRenderer() {
|
|
||||||
return new WebGLPointsLayerRenderer(this, {
|
|
||||||
attributes: [
|
|
||||||
{
|
|
||||||
name: 'size',
|
|
||||||
callback: function(feature) {
|
|
||||||
return 18 * clamp(feature.get('mass') / 200000, 0, 1) + 8;
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'year',
|
|
||||||
callback: function(feature) {
|
|
||||||
return feature.get('year');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
],
|
|
||||||
vertexShader: [
|
|
||||||
'precision mediump float;',
|
|
||||||
|
|
||||||
'uniform mat4 u_projectionMatrix;',
|
|
||||||
'uniform mat4 u_offsetScaleMatrix;',
|
|
||||||
'uniform mat4 u_offsetRotateMatrix;',
|
|
||||||
'attribute vec2 a_position;',
|
|
||||||
'attribute float a_index;',
|
|
||||||
'attribute float a_size;',
|
|
||||||
'attribute float a_year;',
|
|
||||||
'varying vec2 v_texCoord;',
|
|
||||||
'varying float v_year;',
|
|
||||||
|
|
||||||
'void main(void) {',
|
|
||||||
' mat4 offsetMatrix = u_offsetScaleMatrix;',
|
|
||||||
' float offsetX = a_index == 0.0 || a_index == 3.0 ? -a_size / 2.0 : a_size / 2.0;',
|
|
||||||
' float offsetY = a_index == 0.0 || a_index == 1.0 ? -a_size / 2.0 : a_size / 2.0;',
|
|
||||||
' vec4 offsets = offsetMatrix * vec4(offsetX, offsetY, 0.0, 0.0);',
|
|
||||||
' gl_Position = u_projectionMatrix * vec4(a_position, 0.0, 1.0) + offsets;',
|
|
||||||
' float u = a_index == 0.0 || a_index == 3.0 ? 0.0 : 1.0;',
|
|
||||||
' float v = a_index == 0.0 || a_index == 1.0 ? 0.0 : 1.0;',
|
|
||||||
' v_texCoord = vec2(u, v);',
|
|
||||||
' v_year = a_year;',
|
|
||||||
'}'
|
|
||||||
].join(' '),
|
|
||||||
fragmentShader: [
|
|
||||||
'precision mediump float;',
|
|
||||||
|
|
||||||
'uniform float u_time;',
|
|
||||||
'uniform float u_minYear;',
|
|
||||||
'uniform float u_maxYear;',
|
|
||||||
'varying vec2 v_texCoord;',
|
|
||||||
'varying float v_year;',
|
|
||||||
|
|
||||||
'void main(void) {',
|
|
||||||
|
|
||||||
// filter out pixels if the year is outside of the given range
|
|
||||||
' if (v_year < u_minYear || v_year > u_maxYear) {',
|
|
||||||
' discard;',
|
|
||||||
' }',
|
|
||||||
|
|
||||||
' vec2 texCoord = v_texCoord * 2.0 - vec2(1.0, 1.0);',
|
|
||||||
' float sqRadius = texCoord.x * texCoord.x + texCoord.y * texCoord.y;',
|
|
||||||
' float value = 2.0 * (1.0 - sqRadius);',
|
|
||||||
' float alpha = smoothstep(0.0, 1.0, value);',
|
|
||||||
|
|
||||||
// color is interpolated based on year
|
|
||||||
' float ratio = clamp((v_year - 1800.0) / (2013.0 - 1800.0), 0.0, 1.1);',
|
|
||||||
' vec3 color = mix(vec3(' + formatColor(oldColor) + '),',
|
|
||||||
' vec3(' + formatColor(newColor) + '), ratio);',
|
|
||||||
|
|
||||||
' float period = 8.0;',
|
|
||||||
' color.g *= 2.0 * (1.0 - sqrt(mod(u_time + v_year * 0.025, period) / period));',
|
|
||||||
|
|
||||||
' gl_FragColor = vec4(color, 1.0);',
|
|
||||||
' gl_FragColor.a *= alpha;',
|
|
||||||
' gl_FragColor.rgb *= gl_FragColor.a;',
|
|
||||||
'}'
|
|
||||||
].join(' '),
|
|
||||||
uniforms: {
|
|
||||||
u_time: function() {
|
|
||||||
return Date.now() * 0.001 - startTime;
|
|
||||||
},
|
|
||||||
u_minYear: function() {
|
|
||||||
return parseInt(minYearInput.value);
|
|
||||||
},
|
|
||||||
u_maxYear: function() {
|
|
||||||
return parseInt(maxYearInput.value);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
function loadData() {
|
|
||||||
const client = new XMLHttpRequest();
|
|
||||||
client.open('GET', 'data/csv/meteorite_landings.csv');
|
|
||||||
client.onload = function() {
|
|
||||||
const csv = client.responseText;
|
|
||||||
const features = [];
|
|
||||||
|
|
||||||
let prevIndex = csv.indexOf('\n') + 1; // scan past the header line
|
|
||||||
|
|
||||||
let curIndex;
|
|
||||||
while ((curIndex = csv.indexOf('\n', prevIndex)) != -1) {
|
|
||||||
const line = csv.substr(prevIndex, curIndex - prevIndex).split(',');
|
|
||||||
prevIndex = curIndex + 1;
|
|
||||||
|
|
||||||
const coords = fromLonLat([parseFloat(line[4]), parseFloat(line[3])]);
|
|
||||||
if (isNaN(coords[0]) || isNaN(coords[1])) {
|
|
||||||
// guard against bad data
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
features.push(new Feature({
|
|
||||||
mass: parseFloat(line[1]) || 0,
|
|
||||||
year: parseInt(line[2]) || 0,
|
|
||||||
geometry: new Point(coords)
|
|
||||||
}));
|
|
||||||
}
|
|
||||||
|
|
||||||
vectorSource.addFeatures(features);
|
|
||||||
};
|
|
||||||
client.send();
|
|
||||||
}
|
|
||||||
|
|
||||||
loadData();
|
|
||||||
|
|
||||||
const map = new Map({
|
|
||||||
layers: [
|
|
||||||
new TileLayer({
|
|
||||||
source: new Stamen({
|
|
||||||
layer: 'toner'
|
|
||||||
})
|
|
||||||
}),
|
|
||||||
new WebglPointsLayer({
|
|
||||||
source: vectorSource
|
|
||||||
})
|
|
||||||
],
|
|
||||||
target: document.getElementById('map'),
|
|
||||||
view: new View({
|
|
||||||
center: [0, 0],
|
|
||||||
zoom: 2
|
|
||||||
})
|
|
||||||
});
|
|
||||||
|
|
||||||
// animate the map
|
|
||||||
function animate() {
|
|
||||||
map.render();
|
|
||||||
window.requestAnimationFrame(animate);
|
|
||||||
}
|
|
||||||
animate();
|
|
||||||
@@ -1,12 +1,12 @@
|
|||||||
---
|
---
|
||||||
layout: example.html
|
layout: example.html
|
||||||
title: Flight Animation
|
title: Flight Animation
|
||||||
shortdesc: Demonstrates how to animate flights with ´postrender´.
|
shortdesc: Demonstrates how to animate flights with ´postcompose´.
|
||||||
docs: >
|
docs: >
|
||||||
This example shows how to use <b>postrender</b> and <b>vectorContext</b> to
|
This example shows how to use <b>postcompose</b> and <b>vectorContext</b> to
|
||||||
animate flights. A great circle arc between two airports is calculated using
|
animate flights. A great circle arc between two airports is calculated using
|
||||||
<a href="https://github.com/springmeyer/arc.js">arc.js</a> and then the flight
|
<a href="https://github.com/springmeyer/arc.js">arc.js</a> and then the flight
|
||||||
paths are animated with <b>postrender</b>. The flight data is provided by
|
paths are animated with <b>postcompose</b>. The flight data is provided by
|
||||||
<a href="http://openflights.org/data.html">OpenFlights</a> (a simplified data
|
<a href="http://openflights.org/data.html">OpenFlights</a> (a simplified data
|
||||||
set from the <a href="https://www.mapbox.com/mapbox.js/example/v1.0.0/animating-flight-paths/">
|
set from the <a href="https://www.mapbox.com/mapbox.js/example/v1.0.0/animating-flight-paths/">
|
||||||
Mapbox.js documentation</a> is used).
|
Mapbox.js documentation</a> is used).
|
||||||
|
|||||||
@@ -6,17 +6,14 @@ import {Tile as TileLayer, Vector as VectorLayer} from '../src/ol/layer.js';
|
|||||||
import Stamen from '../src/ol/source/Stamen.js';
|
import Stamen from '../src/ol/source/Stamen.js';
|
||||||
import VectorSource from '../src/ol/source/Vector.js';
|
import VectorSource from '../src/ol/source/Vector.js';
|
||||||
import {Stroke, Style} from '../src/ol/style.js';
|
import {Stroke, Style} from '../src/ol/style.js';
|
||||||
import {getVectorContext} from '../src/ol/render.js';
|
|
||||||
|
|
||||||
const tileLayer = new TileLayer({
|
|
||||||
source: new Stamen({
|
|
||||||
layer: 'toner'
|
|
||||||
})
|
|
||||||
});
|
|
||||||
|
|
||||||
const map = new Map({
|
const map = new Map({
|
||||||
layers: [
|
layers: [
|
||||||
tileLayer
|
new TileLayer({
|
||||||
|
source: new Stamen({
|
||||||
|
layer: 'toner'
|
||||||
|
})
|
||||||
|
})
|
||||||
],
|
],
|
||||||
target: 'map',
|
target: 'map',
|
||||||
view: new View({
|
view: new View({
|
||||||
@@ -66,7 +63,7 @@ const flightsSource = new VectorSource({
|
|||||||
addLater(feature, i * 50);
|
addLater(feature, i * 50);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
tileLayer.on('postrender', animateFlights);
|
map.on('postcompose', animateFlights);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@@ -88,7 +85,7 @@ map.addLayer(flightsLayer);
|
|||||||
|
|
||||||
const pointsPerMs = 0.1;
|
const pointsPerMs = 0.1;
|
||||||
function animateFlights(event) {
|
function animateFlights(event) {
|
||||||
const vectorContext = getVectorContext(event);
|
const vectorContext = event.vectorContext;
|
||||||
const frameState = event.frameState;
|
const frameState = event.frameState;
|
||||||
vectorContext.setStyle(style);
|
vectorContext.setStyle(style);
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,8 @@
|
|||||||
|
.map:-moz-full-screen {
|
||||||
|
height: 100%;
|
||||||
|
}
|
||||||
.map:-webkit-full-screen {
|
.map:-webkit-full-screen {
|
||||||
height: 100%;
|
height: 100%;
|
||||||
margin: 0;
|
|
||||||
}
|
}
|
||||||
.map:-ms-fullscreen {
|
.map:-ms-fullscreen {
|
||||||
height: 100%;
|
height: 100%;
|
||||||
|
|||||||
@@ -1,6 +1,8 @@
|
|||||||
|
.fullscreen:-moz-full-screen {
|
||||||
|
height: 100%;
|
||||||
|
}
|
||||||
.fullscreen:-webkit-full-screen {
|
.fullscreen:-webkit-full-screen {
|
||||||
height: 100%;
|
height: 100%;
|
||||||
margin: 0;
|
|
||||||
}
|
}
|
||||||
.fullscreen:-ms-fullscreen {
|
.fullscreen:-ms-fullscreen {
|
||||||
height: 100%;
|
height: 100%;
|
||||||
|
|||||||
@@ -1,6 +1,8 @@
|
|||||||
|
.map:-moz-full-screen {
|
||||||
|
height: 100%;
|
||||||
|
}
|
||||||
.map:-webkit-full-screen {
|
.map:-webkit-full-screen {
|
||||||
height: 100%;
|
height: 100%;
|
||||||
margin: 0;
|
|
||||||
}
|
}
|
||||||
.map:-ms-fullscreen {
|
.map:-ms-fullscreen {
|
||||||
height: 100%;
|
height: 100%;
|
||||||
|
|||||||
@@ -1,4 +0,0 @@
|
|||||||
td {
|
|
||||||
padding: 0 0.5em;
|
|
||||||
text-align: right;
|
|
||||||
}
|
|
||||||
@@ -1,18 +0,0 @@
|
|||||||
---
|
|
||||||
layout: example.html
|
|
||||||
title: Geographic Coordinates
|
|
||||||
shortdesc: Using geographic coordinates for the map view.
|
|
||||||
docs: >
|
|
||||||
Calling the <code>useGeographic</code> function in the <code>'ol/proj'</code> module
|
|
||||||
makes it so the map view uses geographic coordinates (even if the view projection is
|
|
||||||
not geographic).
|
|
||||||
tags: "geographic"
|
|
||||||
experimental: true
|
|
||||||
resources:
|
|
||||||
- https://code.jquery.com/jquery-2.2.3.min.js
|
|
||||||
- https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css
|
|
||||||
- https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js
|
|
||||||
---
|
|
||||||
<div id="map" class="map"><div id="popup"></div></div>
|
|
||||||
<div id="info"></div>
|
|
||||||
|
|
||||||
@@ -1,89 +0,0 @@
|
|||||||
import {useGeographic} from '../src/ol/proj.js';
|
|
||||||
import {Map, View, Feature, Overlay} from '../src/ol/index.js';
|
|
||||||
import {Point} from '../src/ol/geom.js';
|
|
||||||
import {Vector as VectorLayer, Tile as TileLayer} from '../src/ol/layer.js';
|
|
||||||
import {OSM, Vector as VectorSource} from '../src/ol/source.js';
|
|
||||||
import {Style, Circle, Fill} from '../src/ol/style.js';
|
|
||||||
|
|
||||||
useGeographic();
|
|
||||||
|
|
||||||
const place = [-110, 45];
|
|
||||||
|
|
||||||
const point = new Point(place);
|
|
||||||
|
|
||||||
const map = new Map({
|
|
||||||
target: 'map',
|
|
||||||
view: new View({
|
|
||||||
center: place,
|
|
||||||
zoom: 8
|
|
||||||
}),
|
|
||||||
layers: [
|
|
||||||
new TileLayer({
|
|
||||||
source: new OSM()
|
|
||||||
}),
|
|
||||||
new VectorLayer({
|
|
||||||
source: new VectorSource({
|
|
||||||
features: [
|
|
||||||
new Feature(point)
|
|
||||||
]
|
|
||||||
}),
|
|
||||||
style: new Style({
|
|
||||||
image: new Circle({
|
|
||||||
radius: 9,
|
|
||||||
fill: new Fill({color: 'red'})
|
|
||||||
})
|
|
||||||
})
|
|
||||||
})
|
|
||||||
]
|
|
||||||
});
|
|
||||||
|
|
||||||
const element = document.getElementById('popup');
|
|
||||||
|
|
||||||
const popup = new Overlay({
|
|
||||||
element: element,
|
|
||||||
positioning: 'bottom-center',
|
|
||||||
stopEvent: false,
|
|
||||||
offset: [0, -10]
|
|
||||||
});
|
|
||||||
map.addOverlay(popup);
|
|
||||||
|
|
||||||
function formatCoordinate(coordinate) {
|
|
||||||
return `
|
|
||||||
<table>
|
|
||||||
<tbody>
|
|
||||||
<tr><th>lon</th><td>${coordinate[0].toFixed(2)}</td></tr>
|
|
||||||
<tr><th>lat</th><td>${coordinate[1].toFixed(2)}</td></tr>
|
|
||||||
</tbody>
|
|
||||||
</table>`;
|
|
||||||
}
|
|
||||||
|
|
||||||
const info = document.getElementById('info');
|
|
||||||
map.on('moveend', function() {
|
|
||||||
const view = map.getView();
|
|
||||||
const center = view.getCenter();
|
|
||||||
info.innerHTML = formatCoordinate(center);
|
|
||||||
});
|
|
||||||
|
|
||||||
map.on('click', function(event) {
|
|
||||||
const feature = map.getFeaturesAtPixel(event.pixel)[0];
|
|
||||||
if (feature) {
|
|
||||||
const coordinate = feature.getGeometry().getCoordinates();
|
|
||||||
popup.setPosition(coordinate);
|
|
||||||
$(element).popover({
|
|
||||||
placement: 'top',
|
|
||||||
html: true,
|
|
||||||
content: formatCoordinate(coordinate)
|
|
||||||
});
|
|
||||||
$(element).popover('show');
|
|
||||||
} else {
|
|
||||||
$(element).popover('destroy');
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
map.on('pointermove', function(event) {
|
|
||||||
if (map.hasFeatureAtPixel(event.pixel)) {
|
|
||||||
map.getViewport().style.cursor = 'pointer';
|
|
||||||
} else {
|
|
||||||
map.getViewport().style.cursor = 'inherit';
|
|
||||||
}
|
|
||||||
});
|
|
||||||
@@ -6,7 +6,7 @@ import VectorTileSource from '../src/ol/source/VectorTile.js';
|
|||||||
import {Tile as TileLayer, VectorTile as VectorTileLayer} from '../src/ol/layer.js';
|
import {Tile as TileLayer, VectorTile as VectorTileLayer} from '../src/ol/layer.js';
|
||||||
import Projection from '../src/ol/proj/Projection.js';
|
import Projection from '../src/ol/proj/Projection.js';
|
||||||
|
|
||||||
// Converts geojson-vt data to GeoJSON
|
|
||||||
const replacer = function(key, value) {
|
const replacer = function(key, value) {
|
||||||
if (value.geometry) {
|
if (value.geometry) {
|
||||||
let type;
|
let type;
|
||||||
@@ -46,6 +46,11 @@ const replacer = function(key, value) {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const tilePixels = new Projection({
|
||||||
|
code: 'TILE_PIXELS',
|
||||||
|
units: 'tile-pixels'
|
||||||
|
});
|
||||||
|
|
||||||
const map = new Map({
|
const map = new Map({
|
||||||
layers: [
|
layers: [
|
||||||
new TileLayer({
|
new TileLayer({
|
||||||
@@ -68,22 +73,23 @@ fetch(url).then(function(response) {
|
|||||||
debug: 1
|
debug: 1
|
||||||
});
|
});
|
||||||
const vectorSource = new VectorTileSource({
|
const vectorSource = new VectorTileSource({
|
||||||
format: new GeoJSON({
|
format: new GeoJSON(),
|
||||||
// Data returned from geojson-vt is in tile pixel units
|
tileLoadFunction: function(tile) {
|
||||||
dataProjection: new Projection({
|
const format = tile.getFormat();
|
||||||
code: 'TILE_PIXELS',
|
const tileCoord = tile.getTileCoord();
|
||||||
units: 'tile-pixels',
|
const data = tileIndex.getTile(tileCoord[0], tileCoord[1], -tileCoord[2] - 1);
|
||||||
extent: [0, 0, 4096, 4096]
|
|
||||||
})
|
const features = format.readFeatures(
|
||||||
}),
|
JSON.stringify({
|
||||||
tileUrlFunction: function(tileCoord) {
|
type: 'FeatureCollection',
|
||||||
const data = tileIndex.getTile(tileCoord[0], tileCoord[1], tileCoord[2]);
|
features: data ? data.features : []
|
||||||
const geojson = JSON.stringify({
|
}, replacer));
|
||||||
type: 'FeatureCollection',
|
tile.setLoader(function() {
|
||||||
features: data ? data.features : []
|
tile.setFeatures(features);
|
||||||
}, replacer);
|
tile.setProjection(tilePixels);
|
||||||
return 'data:application/json;charset=UTF-8,' + geojson;
|
});
|
||||||
}
|
},
|
||||||
|
url: 'data:' // arbitrary url, we don't use it in the tileLoadFunction
|
||||||
});
|
});
|
||||||
const vectorLayer = new VectorTileLayer({
|
const vectorLayer = new VectorTileLayer({
|
||||||
source: vectorSource
|
source: vectorSource
|
||||||
|
|||||||
@@ -13,13 +13,13 @@ const view = new View({
|
|||||||
zoom: 19
|
zoom: 19
|
||||||
});
|
});
|
||||||
|
|
||||||
const tileLayer = new TileLayer({
|
|
||||||
source: new OSM()
|
|
||||||
});
|
|
||||||
|
|
||||||
// creating the map
|
// creating the map
|
||||||
const map = new Map({
|
const map = new Map({
|
||||||
layers: [tileLayer],
|
layers: [
|
||||||
|
new TileLayer({
|
||||||
|
source: new OSM()
|
||||||
|
})
|
||||||
|
],
|
||||||
target: 'map',
|
target: 'map',
|
||||||
view: view
|
view: view
|
||||||
});
|
});
|
||||||
@@ -36,7 +36,7 @@ map.addOverlay(marker);
|
|||||||
// LineString to store the different geolocation positions. This LineString
|
// LineString to store the different geolocation positions. This LineString
|
||||||
// is time aware.
|
// is time aware.
|
||||||
// The Z dimension is actually used to store the rotation (heading).
|
// The Z dimension is actually used to store the rotation (heading).
|
||||||
const positions = new LineString([], 'XYZM');
|
const positions = new LineString([], /** @type {module:ol/geom/GeometryLayout} */ ('XYZM'));
|
||||||
|
|
||||||
// Geolocation Control
|
// Geolocation Control
|
||||||
const geolocation = new Geolocation({
|
const geolocation = new Geolocation({
|
||||||
@@ -155,7 +155,7 @@ const geolocateBtn = document.getElementById('geolocate');
|
|||||||
geolocateBtn.addEventListener('click', function() {
|
geolocateBtn.addEventListener('click', function() {
|
||||||
geolocation.setTracking(true); // Start position tracking
|
geolocation.setTracking(true); // Start position tracking
|
||||||
|
|
||||||
tileLayer.on('postrender', updateView);
|
map.on('postcompose', updateView);
|
||||||
map.render();
|
map.render();
|
||||||
|
|
||||||
disableButtons();
|
disableButtons();
|
||||||
@@ -197,7 +197,7 @@ simulateBtn.addEventListener('click', function() {
|
|||||||
}
|
}
|
||||||
geolocate();
|
geolocate();
|
||||||
|
|
||||||
tileLayer.on('postrender', updateView);
|
map.on('postcompose', updateView);
|
||||||
map.render();
|
map.render();
|
||||||
|
|
||||||
disableButtons();
|
disableButtons();
|
||||||
|
|||||||
@@ -29,15 +29,12 @@ const map = new Map({
|
|||||||
map.on('singleclick', function(evt) {
|
map.on('singleclick', function(evt) {
|
||||||
document.getElementById('info').innerHTML = '';
|
document.getElementById('info').innerHTML = '';
|
||||||
const viewResolution = /** @type {number} */ (view.getResolution());
|
const viewResolution = /** @type {number} */ (view.getResolution());
|
||||||
const url = wmsSource.getFeatureInfoUrl(
|
const url = wmsSource.getGetFeatureInfoUrl(
|
||||||
evt.coordinate, viewResolution, 'EPSG:3857',
|
evt.coordinate, viewResolution, 'EPSG:3857',
|
||||||
{'INFO_FORMAT': 'text/html'});
|
{'INFO_FORMAT': 'text/html'});
|
||||||
if (url) {
|
if (url) {
|
||||||
fetch(url)
|
document.getElementById('info').innerHTML =
|
||||||
.then((response) => response.text())
|
'<iframe seamless src="' + url + '"></iframe>';
|
||||||
.then((html) => {
|
|
||||||
document.getElementById('info').innerHTML = html;
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@@ -29,15 +29,12 @@ const map = new Map({
|
|||||||
map.on('singleclick', function(evt) {
|
map.on('singleclick', function(evt) {
|
||||||
document.getElementById('info').innerHTML = '';
|
document.getElementById('info').innerHTML = '';
|
||||||
const viewResolution = /** @type {number} */ (view.getResolution());
|
const viewResolution = /** @type {number} */ (view.getResolution());
|
||||||
const url = wmsSource.getFeatureInfoUrl(
|
const url = wmsSource.getGetFeatureInfoUrl(
|
||||||
evt.coordinate, viewResolution, 'EPSG:3857',
|
evt.coordinate, viewResolution, 'EPSG:3857',
|
||||||
{'INFO_FORMAT': 'text/html'});
|
{'INFO_FORMAT': 'text/html'});
|
||||||
if (url) {
|
if (url) {
|
||||||
fetch(url)
|
document.getElementById('info').innerHTML =
|
||||||
.then((response) => response.text())
|
'<iframe seamless src="' + url + '"></iframe>';
|
||||||
.then((html) => {
|
|
||||||
document.getElementById('info').innerHTML = html;
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
---
|
---
|
||||||
layout: example.html
|
layout: example.html
|
||||||
title: Map Graticule
|
title: Map Graticule
|
||||||
shortdesc: This example shows how to add a graticule layer to a map.
|
shortdesc: This example shows how to add a graticule overlay to a map.
|
||||||
docs: >
|
docs: >
|
||||||
This example shows how to add a graticule layer to a map.
|
This example shows how to add a graticule overlay to a map.
|
||||||
tags: "graticule"
|
tags: "graticule"
|
||||||
---
|
---
|
||||||
<div id="map" class="map"></div>
|
<div id="map" class="map"></div>
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import Graticule from '../src/ol/layer/Graticule.js';
|
import Graticule from '../src/ol/Graticule.js';
|
||||||
import Map from '../src/ol/Map.js';
|
import Map from '../src/ol/Map.js';
|
||||||
import View from '../src/ol/View.js';
|
import View from '../src/ol/View.js';
|
||||||
import TileLayer from '../src/ol/layer/Tile.js';
|
import TileLayer from '../src/ol/layer/Tile.js';
|
||||||
@@ -13,16 +13,6 @@ const map = new Map({
|
|||||||
source: new OSM({
|
source: new OSM({
|
||||||
wrapX: false
|
wrapX: false
|
||||||
})
|
})
|
||||||
}),
|
|
||||||
new Graticule({
|
|
||||||
// the style to use for the lines, optional.
|
|
||||||
strokeStyle: new Stroke({
|
|
||||||
color: 'rgba(255,120,0,0.9)',
|
|
||||||
width: 2,
|
|
||||||
lineDash: [0.5, 4]
|
|
||||||
}),
|
|
||||||
showLabels: true,
|
|
||||||
wrapX: false
|
|
||||||
})
|
})
|
||||||
],
|
],
|
||||||
target: 'map',
|
target: 'map',
|
||||||
@@ -31,3 +21,16 @@ const map = new Map({
|
|||||||
zoom: 5
|
zoom: 5
|
||||||
})
|
})
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// Create the graticule component
|
||||||
|
const graticule = new Graticule({
|
||||||
|
// the style to use for the lines, optional.
|
||||||
|
strokeStyle: new Stroke({
|
||||||
|
color: 'rgba(255,120,0,0.9)',
|
||||||
|
width: 2,
|
||||||
|
lineDash: [0.5, 4]
|
||||||
|
}),
|
||||||
|
showLabels: true
|
||||||
|
});
|
||||||
|
|
||||||
|
graticule.setMap(map);
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ title: Earthquakes Heatmap
|
|||||||
shortdesc: Demonstrates the use of a heatmap layer.
|
shortdesc: Demonstrates the use of a heatmap layer.
|
||||||
docs: >
|
docs: >
|
||||||
This example parses a KML file and renders the features as a <code>ol/layer/Heatmap</code> layer.
|
This example parses a KML file and renders the features as a <code>ol/layer/Heatmap</code> layer.
|
||||||
tags: "heatmap, kml, vector, style, webgl"
|
tags: "heatmap, kml, vector, style"
|
||||||
---
|
---
|
||||||
<div id="map" class="map"></div>
|
<div id="map" class="map"></div>
|
||||||
<form>
|
<form>
|
||||||
|
|||||||
@@ -43,14 +43,11 @@ const map = new Map({
|
|||||||
})
|
})
|
||||||
});
|
});
|
||||||
|
|
||||||
const blurHandler = function() {
|
|
||||||
vector.setBlur(parseInt(blur.value, 10));
|
|
||||||
};
|
|
||||||
blur.addEventListener('input', blurHandler);
|
|
||||||
blur.addEventListener('change', blurHandler);
|
|
||||||
|
|
||||||
const radiusHandler = function() {
|
blur.addEventListener('input', function() {
|
||||||
|
vector.setBlur(parseInt(blur.value, 10));
|
||||||
|
});
|
||||||
|
|
||||||
|
radius.addEventListener('input', function() {
|
||||||
vector.setRadius(parseInt(radius.value, 10));
|
vector.setRadius(parseInt(radius.value, 10));
|
||||||
};
|
});
|
||||||
radius.addEventListener('input', radiusHandler);
|
|
||||||
radius.addEventListener('change', radiusHandler);
|
|
||||||
|
|||||||
@@ -69,6 +69,9 @@ for (i = 0, ii = hereLayers.length; i < ii; ++i) {
|
|||||||
|
|
||||||
const map = new Map({
|
const map = new Map({
|
||||||
layers: layers,
|
layers: layers,
|
||||||
|
// Improve user experience by loading tiles while dragging/zooming. Will make
|
||||||
|
// zooming choppy on mobile or slow devices.
|
||||||
|
loadTilesWhileInteracting: true,
|
||||||
target: 'map',
|
target: 'map',
|
||||||
view: new View({
|
view: new View({
|
||||||
center: [921371.9389, 6358337.7609],
|
center: [921371.9389, 6358337.7609],
|
||||||
|
|||||||
3
examples/icon-color.css
Normal file
3
examples/icon-color.css
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
#map {
|
||||||
|
position: relative;
|
||||||
|
}
|
||||||
@@ -22,27 +22,27 @@ const madrid = new Feature({
|
|||||||
});
|
});
|
||||||
|
|
||||||
rome.setStyle(new Style({
|
rome.setStyle(new Style({
|
||||||
image: new Icon({
|
image: new Icon(/** @type {module:ol/style/Icon~Options} */ ({
|
||||||
color: '#8959A8',
|
color: '#8959A8',
|
||||||
crossOrigin: 'anonymous',
|
crossOrigin: 'anonymous',
|
||||||
src: 'data/square.svg'
|
src: 'data/dot.png'
|
||||||
})
|
}))
|
||||||
}));
|
}));
|
||||||
|
|
||||||
london.setStyle(new Style({
|
london.setStyle(new Style({
|
||||||
image: new Icon({
|
image: new Icon(/** @type {module:ol/style/Icon~Options} */ ({
|
||||||
color: '#4271AE',
|
color: '#4271AE',
|
||||||
crossOrigin: 'anonymous',
|
crossOrigin: 'anonymous',
|
||||||
src: 'data/dot.png'
|
src: 'data/dot.png'
|
||||||
})
|
}))
|
||||||
}));
|
}));
|
||||||
|
|
||||||
madrid.setStyle(new Style({
|
madrid.setStyle(new Style({
|
||||||
image: new Icon({
|
image: new Icon(/** @type {module:ol/style/Icon~Options} */ ({
|
||||||
color: [113, 140, 0],
|
color: [113, 140, 0],
|
||||||
crossOrigin: 'anonymous',
|
crossOrigin: 'anonymous',
|
||||||
src: 'data/dot.png'
|
src: 'data/dot.png'
|
||||||
})
|
}))
|
||||||
}));
|
}));
|
||||||
|
|
||||||
|
|
||||||
@@ -56,7 +56,7 @@ const vectorLayer = new VectorLayer({
|
|||||||
|
|
||||||
const rasterLayer = new TileLayer({
|
const rasterLayer = new TileLayer({
|
||||||
source: new TileJSON({
|
source: new TileJSON({
|
||||||
url: 'https://a.tiles.mapbox.com/v3/aj.1x1-degrees.json',
|
url: 'https://api.tiles.mapbox.com/v3/mapbox.geography-class.json?secure',
|
||||||
crossOrigin: ''
|
crossOrigin: ''
|
||||||
})
|
})
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -11,13 +11,13 @@ import {Icon, Style} from '../src/ol/style.js';
|
|||||||
|
|
||||||
function createStyle(src, img) {
|
function createStyle(src, img) {
|
||||||
return new Style({
|
return new Style({
|
||||||
image: new Icon({
|
image: new Icon(/** @type {module:ol/style/Icon~Options} */ ({
|
||||||
anchor: [0.5, 0.96],
|
anchor: [0.5, 0.96],
|
||||||
crossOrigin: 'anonymous',
|
crossOrigin: 'anonymous',
|
||||||
src: src,
|
src: src,
|
||||||
img: img,
|
img: img,
|
||||||
imgSize: img ? [img.width, img.height] : undefined
|
imgSize: img ? [img.width, img.height] : undefined
|
||||||
})
|
}))
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,22 +1,10 @@
|
|||||||
---
|
---
|
||||||
layout: example.html
|
layout: example.html
|
||||||
title: Icon Sprites with WebGL
|
title: Icon Sprites with WebGL
|
||||||
shortdesc: Rendering many icons with WebGL
|
shortdesc: Icon sprite with WebGL
|
||||||
docs: >
|
docs: >
|
||||||
This example shows how to use `ol/renderer/webgl/PointsLayer` to render
|
<p>In this example a sprite image is used for the icon styles. Using a sprite is required to get good performance with WebGL.</p>
|
||||||
a very large amount of sprites. The above map is based on a dataset from the National UFO Reporting Center: each
|
tags: "webgl, icon, sprite, vector, point"
|
||||||
icon marks a UFO sighting according to its reported shape (disk, light, fireball...). The older the sighting, the redder
|
|
||||||
the icon.
|
|
||||||
|
|
||||||
A very simple sprite atlas is used in the form of a PNG file containing all icons on a grid. Then, the `texCoordCallback`
|
|
||||||
option of the `ol/renderer/webgl/PointsLayer` constructor is used to specify which sprite to use according to the sighting shape.
|
|
||||||
|
|
||||||
The dataset contains around 80k points and can be found here: https://www.kaggle.com/NUFORC/ufo-sightings
|
|
||||||
tags: "webgl, icon, sprite, point, ufo"
|
|
||||||
experimental: true
|
|
||||||
cloak:
|
|
||||||
- key: pk.eyJ1IjoidHNjaGF1YiIsImEiOiJjaW5zYW5lNHkxMTNmdWttM3JyOHZtMmNtIn0.CDIBD8H-G2Gf-cPkIuWtRg
|
|
||||||
value: Your Mapbox access token from https://mapbox.com/ here
|
|
||||||
---
|
---
|
||||||
<div id="map" class="map"></div>
|
<div id="map" class="map"></div>
|
||||||
<div>Current sighting: <span id="info"></span></div>
|
<div id="info"> </div>
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user