Compare commits

..

16 Commits
v5.1.1 ... site

Author SHA1 Message Date
Tim Schaub
d77ff64ec2 Doc components 2018-06-12 08:00:27 -06:00
Tim Schaub
ee27cf1e01 Move new examples to site/src/examples 2018-06-12 08:00:27 -06:00
ahocevar
54c438997f Render constructor params 2018-06-12 08:00:27 -06:00
ahocevar
a7d180047a Render class import with constructor conditionally 2018-06-12 08:00:27 -06:00
ahocevar
a224e51c3f Render name of classes without API constructor
FIXED: No import should be listed for these.
2018-06-12 08:00:27 -06:00
ahocevar
0482b7ced4 List classes without API constructor
TODO: No import should be listed for these.
2018-06-12 08:00:27 -06:00
ahocevar
ff729d1357 Render non-member constants 2018-06-12 08:00:27 -06:00
ahocevar
9a08666f1f Add list of static functions 2018-06-12 08:00:27 -06:00
ahocevar
2fa6af0636 Remove logic for no longer existent externs 2018-06-12 08:00:27 -06:00
ahocevar
5a4a98fbe4 Map all symbols to modules 2018-06-12 08:00:27 -06:00
Tim Schaub
c008dd1f2c Starting point for docs 2018-06-12 08:00:27 -06:00
Tim Schaub
fb7d8b7839 Generate module info 2018-06-12 07:59:20 -06:00
Tim Schaub
c5f2787284 Script to build site 2018-06-12 07:59:20 -06:00
Tim Schaub
97a862f8e6 Styled components 2018-06-12 07:53:54 -06:00
Tim Schaub
ac9b0c7c9f Example list on each example page 2018-06-12 07:53:53 -06:00
Tim Schaub
d33026d12c New site setup 2018-06-12 07:53:53 -06:00
377 changed files with 64557 additions and 43751 deletions

View File

@@ -1,9 +1,8 @@
<!--
Thank you for your interest in making OpenLayers better! 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. To keep this project manageable for maintainers, we ask you to please check all boxes below before submitting an issue.
If you have a usage question, you might want to try Stack Overflow first: https://stackoverflow.com/questions/tagged/openlayers - [ ] I am submitting a bug or feature request, not a usage question. Go to https://stackoverflow.com/questions/tagged/openlayers for questions.
- [ ] I have searched GitHub to see if a similar bug or feature request has already been reported.
Thanks - [ ] I have verified that the issue is present in the latest version of OpenLayers (see 'LATEST' on https://openlayers.org/).
--> - [ ] If reporting a bug, I have created a [CodePen](https://codepen.io) or prepared a stack trace (using the latest version and unminified code, so e.g. `ol-debug.js`, not `ol.js`) that shows the issue.

View File

@@ -1,13 +1,8 @@
<!--
Thank you for your interest in making OpenLayers better! Thank you for your interest in making OpenLayers better!
Before submitting a pull request, it is best to open an issue describing the bug you are fixing or the feature you are proposing to add. In order to get your proposed changes merged into the master branch, we ask you to please make sure the following boxes are checked *before* submitting your pull request.
Here are some other tips that make pull requests easier to review: - [ ] This pull request addresses an issue that has been marked with the 'Pull request accepted' label & I have added the link to that issue.
- [ ] It contains one or more small, incremental, logically separate commits, with no merge commits.
* Commits in the branch are small and logically separated (with no unnecessary merge commits). - [ ] I have used clear commit messages.
* Commit messages are clear. - [ ] Existing tests pass for me locally & I have added or updated tests for new or changed functionality.
* Existing tests pass, new functionality is covered by new tests, and fixes have regression tests.
Thanks
-->

3
.gitignore vendored
View File

@@ -1,4 +1,5 @@
/build/ /build/
/coverage/ /coverage/
/dist/ /dist/
node_modules/ /node_modules/
src/index.js

View File

@@ -1,44 +1,23 @@
# OpenLayers # OpenLayers
[![Travis CI Status](https://secure.travis-ci.org/openlayers/openlayers.svg)](http://travis-ci.org/#!/openlayers/openlayers)
[![Greenkeeper badge](https://badges.greenkeeper.io/openlayers/openlayers.svg)](https://greenkeeper.io/)
[![Coverage Status](https://coveralls.io/repos/github/openlayers/openlayers/badge.svg?branch=master)](https://coveralls.io/github/openlayers/openlayers?branch=master)
[![OSGeo Project](https://img.shields.io/badge/OSGeo-Project-brightgreen.svg)](http://osgeo.org/)
[![jsDelivr Hits](https://data.jsdelivr.com/v1/package/npm/openlayers/badge?style=rounded)](https://www.jsdelivr.com/package/npm/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 2-clause BSD License (also known as the FreeBSD). [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
Install the [`ol` package](https://www.npmjs.com/package/ol): Use one of the following methods to use OpenLayers in your project:
* For use with webpack, Rollup, Browserify, or other module bundlers, install the [`ol` package](https://www.npmjs.com/package/ol):
``` ```
npm install ol npm install ol
``` ```
Import just what you need for your application: * If you just want to add a `<script>` tag to test things out, you can link directly to one of the full builds from [cdnjs](https://cdnjs.com/libraries/openlayers) (not recommended for production)
```js
import Map from 'ol/Map';
import View from 'ol/View';
import TileLayer from 'ol/layer/Tile';
import XYZ from 'ol/source/XYZ';
new Map({
target: 'map',
layers: [
new TileLayer({
source: new XYZ({
url: 'https://{a-c}.tile.openstreetmap.org/{z}/{x}/{y}.png'
})
})
],
view: new View({
center: [0, 0],
zoom: 2
})
});
```
See the following examples for more detail on bundling OpenLayers with your application:
* Using [Rollup](https://github.com/openlayers/ol-rollup)
* Using [Webpack](https://github.com/openlayers/ol-webpack)
* Using [Parcel](https://github.com/openlayers/ol-parcel)
## Supported Browsers ## Supported Browsers
@@ -60,5 +39,3 @@ 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
[![Build Status](https://travis-ci.org/openlayers/openlayers.svg?branch=master)](https://travis-ci.org/openlayers/openlayers)

View File

@@ -1,20 +1,6 @@
## Upgrade notes ## Upgrade notes
### v5.1.0 ### Next release
#### Geometry constructor and `setCoordinates` no longer accept `null` coordinates
Geometries (`ol/geom/*`) now need to be constructed with valid coordinates (center for `ol/geom/Circle`) as first constructor argument. The same applies to the `setCoordinates()` (`setCenter() for `ol/geom/Circle`) method.
### v5.0.0
#### Renamed `ol/source/TileUTFGrid` to `ol/source/UTFGrid`
The module name is now `ol/source/UTFGrid` (`ol.source.UTFGrid` in the full build).
#### Renaming of the `defaultDataProjection` in the options and property of the `ol/format/Feature` class and its subclasses
The `defaultDataProjection` option is now named `dataProjection`. The protected property available on the class is also renamed.
#### `transition` option of `ol/source/VectorTile` is ignored #### `transition` option of `ol/source/VectorTile` is ignored
@@ -165,37 +151,14 @@ var poly = circularPolygon(center, radius);
#### Removal of optional this arguments. #### 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). The following methods did get the optional this (i.e. opt_this) arguments removed. 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).
* Collection#forEach * Collection#forEach
* geom/LineString#forEachSegment * geom/LineString#forEachSegment
* Observable#on, #once, #un * Observable#on, #once, #un
* Map#forEachLayerAtPixel
* source/TileUTFGrid#forDataAtCoordinateAndResolution * source/TileUTFGrid#forDataAtCoordinateAndResolution
* source/Vector#forEachFeature, #forEachFeatureInExtent, #forEachFeatureIntersectingExtent * source/Vector#forEachFeature, #forEachFeatureInExtent, #forEachFeatureIntersectingExtent
#### `Map#forEachLayerAtPixel` parameters have changed
If you are using the layer filter, please note that you now have to pass in the layer filter via an `AtPixelOptions` object. If you are not using the layer filter the usage has not changed.
Old syntax:
```
map.forEachLayerAtPixel(pixel, callback, callbackThis, layerFilterFn, layerFilterThis);
```
New syntax:
```
map.forEachLayerAtPixel(pixel, callback, {
layerFilter: layerFilterFn
});
```
To bind a function to a this, please use the bind method of the function (See: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/bind).
This change is due to the introduction of the `hitTolerance` parameter which can be passed in via this `AtPixelOptions` object, too.
### v4.6.0 ### v4.6.0
#### Renamed `exceedLength` option of `ol.style.Text` to `overflow` #### Renamed `exceedLength` option of `ol.style.Text` to `overflow`

View File

@@ -1,667 +0,0 @@
# v5.0.0
The main theme of the v5.0.0 release is an improved developer/user experience with OpenLayers. Toward this end, we have reworked the library as a set of ES Modules, completely removing any dependency on the Closure Compiler, and improving compatibility with mainstream module bundlers.
See the [hosted examples](https://openlayers.org/en/latest/examples/), [API docs](https://openlayers.org/en/latest/apidoc/), and [bundle tutorial](https://openlayers.org/en/latest/doc/tutorials/bundle.html) for the new syntax, but basic usage looks like this:
```js
import 'ol/ol.css';
import {Map, View} from 'ol';
import TileLayer from 'ol/layer/Tile';
import OSM from 'ol/source/OSM';
const map = new Map({
target: 'map',
layers: [
new TileLayer({
source: new OSM()
})
],
view: new View({
center: [0, 0],
zoom: 0
})
});
```
See below for specific notes on upgrading from 4.x releases. We'll be working on updating the website with improved documentation and examples. Take a look at the issue tracker if you're interested in contributing.
### Upgrade Notes
#### Renamed `ol/source/TileUTFGrid` to `ol/source/UTFGrid`
The module name is now `ol/source/UTFGrid` (`ol.source.UTFGrid` in the full build).
#### Renaming of the `defaultDataProjection` in the options and property of the `ol/format/Feature` class and its subclasses
The `defaultDataProjection` option is now named `dataProjection`. The protected property available on the class is also renamed.
#### `transition` option of `ol/source/VectorTile` is ignored
The `transition` option to get an opacity transition to fade in tiles has been disabled for `ol/source/VectorTile`. Vector tiles are now always rendered without an opacity transition.
#### `ol/style/Fill` with `CanvasGradient` or `CanvasPattern`
The origin for gradients and patterns has changed from the top-left corner of the extent of the geometry being filled to 512 css pixel increments from map coordinate `[0, 0]`. This allows repeat patterns to be aligned properly with vector tiles. For seamless repeat patterns, width and height of the pattern image must be a factor of two (2, 4, 8, ..., 512).
#### Removal of the renderer option for maps
The `renderer` option has been removed from the `Map` constructor. The purpose of this change is to avoid bundling code in your application that you do not need. Previously, code for both the Canvas and WebGL renderers was included in all applications - even though most people only use one renderer. The `Map` constructor now gives you a Canvas (2D) based renderer. If you want to try the WebGL renderer, you can import the constructor from `ol/WebGLMap`.
Old code:
```js
import Map from 'ol/Map';
const canvasMap = new Map({
renderer: ['canvas']
// other options...
});
const webglMap = new Map({
renderer: ['webgl']
// other options...
});
```
New code:
```js
import Map from 'ol/Map';
import WebGLMap from 'ol/WebGLMap';
const canvasMap = new Map({
// options...
});
const webglMap = new WebGLMap({
// options...
});
```
#### Removal of ol.FeatureStyleFunction
The signature of the vector style function passed to the feature has changed. The function now always takes the `feature` and the `resolution` as arguments, the `feature` is no longer bound to `this`.
Old code:
```js
feature.setStyle(function(resolution) {
var text = this.get('name');
...
});
```
New code:
```js
feature.setStyle(function(feature, resolution) {
var text = feature.get('name');
...
});
```
#### Changed behavior of the `Draw` interaction
For better drawing experience, two changes were made to the behavior of the Draw interaction:
1. On long press, the current vertex can be dragged to its desired position.
2. On touch move (e.g. when panning the map on a mobile device), no draw cursor is shown, and the geometry being drawn is not updated. But because of 1., the draw cursor will appear on long press. Mouse moves are not affected by this change.
#### Changes in proj4 integration
Because relying on a globally available proj4 is not practical with ES modules, we have made a change to the way we integrate proj4:
* The `setProj4()` function from the `ol/proj` module was removed.
* A new `ol/proj/proj4` module with a `register()` function was added. Regardless of whether the application imports `proj4` or uses a global `proj4`, this function needs to be called with the proj4 instance as argument whenever projection definitions were added to proj4's registry with (`proj4.defs`).
It is also recommended to no longer use a global `proj4`. Instead,
npm install proj4
and import it:
```js
import proj4 from 'proj4';
```
Applications can be updated by importing the `register` function from the `ol/proj/proj4` module
```js
import {register} from 'ol/proj/proj4'
```
and calling it before using projections, and any time the proj4 registry was changed by `proj4.defs()` calls:
```js
register(proj4);
```
#### Removal of logos
The map and sources no longer accept a `logo` option. Instead, if you wish to append a logo to your map, add the desired markup directly in your HTML. In addition, you can use the `attributions` property of a source to display arbitrary markup per-source with the attribution control.
#### Replacement of `ol/Sphere` constructor with `ol/sphere` functions
The `ol/Sphere` constructor has been removed. If you were using the `getGeodesicArea` method, use the `getArea` function instead. If you were using the `haversineDistance` method, use the `getDistance` function instead.
Examples before:
```js
// using ol@4
import Sphere from 'ol/sphere';
var sphere = new Sphere(Sphere.DEFAULT_RADIUS);
var area = sphere.getGeodesicArea(polygon);
var distance = sphere.haversineDistance(g1, g2);
```
Examples after:
```js
// using ol@5
import {circular as circularPolygon} from 'ol/geom/Polygon';
import {getArea, getDistance} from 'ol/sphere';
var area = getArea(polygon);
var distance = getDistance(g1, g2);
var circle = circularPolygon(center, radius);
```
#### New signature for the `circular` function for creating polygons
The `circular` function exported from `ol/geom/Polygon` no longer requires a `Sphere` as the first argument.
Example before:
```js
// using ol@4
import Polygon from 'ol/geom/polygon';
import Sphere from 'ol/sphere';
var poly = Polygon.circular(new Sphere(Sphere.DEFAULT_RADIUS), center, radius);
```
Example after:
```js
// using ol@5
import {circular as circularPolygon} from 'ol/geom/Polygon';
var poly = circularPolygon(center, radius);
```
#### 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).
* Collection#forEach
* geom/LineString#forEachSegment
* Observable#on, #once, #un
* Map#forEachLayerAtPixel
* source/TileUTFGrid#forDataAtCoordinateAndResolution
* source/Vector#forEachFeature, #forEachFeatureInExtent, #forEachFeatureIntersectingExtent
#### `Map#forEachLayerAtPixel` parameters have changed
If you are using the layer filter, please note that you now have to pass in the layer filter via an `AtPixelOptions` object. If you are not using the layer filter the usage has not changed.
Old syntax:
```
map.forEachLayerAtPixel(pixel, callback, callbackThis, layerFilterFn, layerFilterThis);
```
New syntax:
```
map.forEachLayerAtPixel(pixel, callback, {
layerFilter: layerFilterFn
});
```
To bind a function to a this, please use the bind method of the function (See: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/bind).
This change is due to the introduction of the `hitTolerance` parameter which can be passed in via this `AtPixelOptions` object, too.
### New Features and Fixes
* [#8314](https://github.com/openlayers/openlayers/pull/8314) - Accept hitTolerance in map.forEachLayerAtPixel() ([@simonseyock](https://github.com/simonseyock))
* [#7750](https://github.com/openlayers/openlayers/pull/7750) - Don't assume fill for canvas polygon hit detection. ([@schmidtk](https://github.com/schmidtk))
* [#8305](https://github.com/openlayers/openlayers/pull/8305) - Update quickstart and tutorials for v5 ([@ahocevar](https://github.com/ahocevar))
* [#8301](https://github.com/openlayers/openlayers/pull/8301) - Do not render vectors in image mode ([@ahocevar](https://github.com/ahocevar))
* [#8302](https://github.com/openlayers/openlayers/pull/8302) - Ignore node_modules everywhere ([@ahocevar](https://github.com/ahocevar))
* [#8299](https://github.com/openlayers/openlayers/pull/8299) - Make classes in ol/ available as named exports from ol ([@ahocevar](https://github.com/ahocevar))
* [#8298](https://github.com/openlayers/openlayers/pull/8298) - Add README for ol package ([@ahocevar](https://github.com/ahocevar))
* [#8295](https://github.com/openlayers/openlayers/pull/8295) - Prepare for building/publishing v5 ([@ahocevar](https://github.com/ahocevar))
* [#8296](https://github.com/openlayers/openlayers/pull/8296) - Fix style documentation ([@fredj](https://github.com/fredj))
* [#8294](https://github.com/openlayers/openlayers/pull/8294) - Remove non-functional type checks from testing ([@ahocevar](https://github.com/ahocevar))
* [#8292](https://github.com/openlayers/openlayers/pull/8292) - Remove now unneeded single quotes in examples ([@fredj](https://github.com/fredj))
* [#8291](https://github.com/openlayers/openlayers/pull/8291) - Graticule code cleanup ([@fredj](https://github.com/fredj))
* [#8287](https://github.com/openlayers/openlayers/pull/8287) - Rename ol/source/TileUTFGrid to ol/source/UTFGrid ([@fredj](https://github.com/fredj))
* [#8286](https://github.com/openlayers/openlayers/pull/8286) - Fix class name property in Overlay documentation ([@fredj](https://github.com/fredj))
* [#8281](https://github.com/openlayers/openlayers/pull/8281) - Rename default data projection ([@gberaudo](https://github.com/gberaudo))
* [#8283](https://github.com/openlayers/openlayers/pull/8283) - Remove references to tutorials/custom-builds.html ([@fredj](https://github.com/fredj))
* [#8280](https://github.com/openlayers/openlayers/pull/8280) - Add missing property in VectorTile options, remove params from createRenderer ([@fredj](https://github.com/fredj))
* [#8277](https://github.com/openlayers/openlayers/pull/8277) - Fix code block in comment ([@ahocevar](https://github.com/ahocevar))
* [#8273](https://github.com/openlayers/openlayers/pull/8273) - Remove the externs/ directory ([@ahocevar](https://github.com/ahocevar))
* [#8246](https://github.com/openlayers/openlayers/pull/8246) - Don't go back to not moving when dragging ([@ahocevar](https://github.com/ahocevar))
* [#8258](https://github.com/openlayers/openlayers/pull/8258) - Use Webpack 4 for tests (and examples) ([@ahocevar](https://github.com/ahocevar))
* [#8250](https://github.com/openlayers/openlayers/pull/8250) - Fix various jsdoc types ([@fredj](https://github.com/fredj))
* [#8245](https://github.com/openlayers/openlayers/pull/8245) - Fix vector tile docs and types ([@ahocevar](https://github.com/ahocevar))
* [#8233](https://github.com/openlayers/openlayers/pull/8233) - Use rollup instead of webpack for the full build ([@ahocevar](https://github.com/ahocevar))
* [#8231](https://github.com/openlayers/openlayers/pull/8231) - Fix JSTS usage with OL classes injected ([@bjornharrtell](https://github.com/bjornharrtell))
* [#8229](https://github.com/openlayers/openlayers/pull/8229) - Support layers instead of renderers for ol/source/Raster ([@ahocevar](https://github.com/ahocevar))
* [#8227](https://github.com/openlayers/openlayers/pull/8227) - Better vectortile experience ([@ahocevar](https://github.com/ahocevar))
* [#8225](https://github.com/openlayers/openlayers/pull/8225) - renderMode: 'image' fixes for ol/layer/Vector ([@ahocevar](https://github.com/ahocevar))
* [#8226](https://github.com/openlayers/openlayers/pull/8226) - Accept renderers as sources for the Raster source ([@ahocevar](https://github.com/ahocevar))
* [#8210](https://github.com/openlayers/openlayers/pull/8210) - Align patterns and gradients to a grid ([@ahocevar](https://github.com/ahocevar))
* [#8201](https://github.com/openlayers/openlayers/pull/8201) - Remove babelrc, transform using babel-core ([@ahocevar](https://github.com/ahocevar))
* [#8203](https://github.com/openlayers/openlayers/pull/8203) - Type checking complete ([@ahocevar](https://github.com/ahocevar))
* [#8204](https://github.com/openlayers/openlayers/pull/8204) - Document ol/control~defaults in the right place ([@ahocevar](https://github.com/ahocevar))
* [#8200](https://github.com/openlayers/openlayers/pull/8200) - Set textAlign to the canvas context ([@fredj](https://github.com/fredj))
* [#8194](https://github.com/openlayers/openlayers/pull/8194) - miscellaneous code cleanup ([@fredj](https://github.com/fredj))
* [#8189](https://github.com/openlayers/openlayers/pull/8189) - More apidoc fixes ([@ahocevar](https://github.com/ahocevar))
* [#8191](https://github.com/openlayers/openlayers/pull/8191) - Do not scale text outline width ([@ahocevar](https://github.com/ahocevar))
* [#8187](https://github.com/openlayers/openlayers/pull/8187) - Hide attribution control if there are no attributions ([@tschaub](https://github.com/tschaub))
* [#8186](https://github.com/openlayers/openlayers/pull/8186) - Updates to get the examples building ([@tschaub](https://github.com/tschaub))
* [#8180](https://github.com/openlayers/openlayers/pull/8180) - Fix some JSDoc issues ([@ahocevar](https://github.com/ahocevar))
* [#8175](https://github.com/openlayers/openlayers/pull/8175) - More typing fixes ([@fredj](https://github.com/fredj))
* [#8177](https://github.com/openlayers/openlayers/pull/8177) - Remove documentation related to the closure compiler ([@gberaudo](https://github.com/gberaudo))
* [#8174](https://github.com/openlayers/openlayers/pull/8174) - Fix typo in ol/style/Image~Options typedef ([@fredj](https://github.com/fredj))
* [#8172](https://github.com/openlayers/openlayers/pull/8172) - Ignore 'this' type in function typedef ([@fredj](https://github.com/fredj))
* [#8173](https://github.com/openlayers/openlayers/pull/8173) - Fix typing in ol/xml module ([@fredj](https://github.com/fredj))
* [#8169](https://github.com/openlayers/openlayers/pull/8169) - Shorter module paths for default exports ([@fredj](https://github.com/fredj))
* [#8171](https://github.com/openlayers/openlayers/pull/8171) - Remove wrong override tags ([@fredj](https://github.com/fredj))
* [#8170](https://github.com/openlayers/openlayers/pull/8170) - Basic apidocs ([@ahocevar](https://github.com/ahocevar))
* [#8167](https://github.com/openlayers/openlayers/pull/8167) - Remove externs/oli.js ([@tschaub](https://github.com/tschaub))
* [#8166](https://github.com/openlayers/openlayers/pull/8166) - Updated type annotations ([@tschaub](https://github.com/tschaub))
* [#8165](https://github.com/openlayers/openlayers/pull/8165) - Update linter config ([@tschaub](https://github.com/tschaub))
* [#8163](https://github.com/openlayers/openlayers/pull/8163) - Fix type syntax ([@ahocevar](https://github.com/ahocevar))
* [#8161](https://github.com/openlayers/openlayers/pull/8161) - Fix skipping of texts with background ([@ahocevar](https://github.com/ahocevar))
* [#8156](https://github.com/openlayers/openlayers/pull/8156) - fix assert 36 on error documentation #8147 ([@mainakae](https://github.com/mainakae))
* [#8143](https://github.com/openlayers/openlayers/pull/8143) - Shorter module paths for default exports ([@openlayers](https://github.com/openlayers))
* [#8137](https://github.com/openlayers/openlayers/pull/8137) - Avoid `this` at top level of modules ([@tschaub](https://github.com/tschaub))
* [#8138](https://github.com/openlayers/openlayers/pull/8138) - Update tasks to use native async/await ([@tschaub](https://github.com/tschaub))
* [#8139](https://github.com/openlayers/openlayers/pull/8139) - Add @module annotation for ol/control/util ([@tschaub](https://github.com/tschaub))
* [#8135](https://github.com/openlayers/openlayers/pull/8135) - Break the circular dependency: overview map, map, controls, overview map ([@tschaub](https://github.com/tschaub))
* [#8132](https://github.com/openlayers/openlayers/pull/8132) - Add minZoom to the createResolutionConstraint function return type ([@fredj](https://github.com/fredj))
* [#8129](https://github.com/openlayers/openlayers/pull/8129) - Fix some types ([@ahocevar](https://github.com/ahocevar))
* [#8127](https://github.com/openlayers/openlayers/pull/8127) - Move RasterOperationType into ol/source/Raster ([@fredj](https://github.com/fredj))
* [#8123](https://github.com/openlayers/openlayers/pull/8123) - More Jsdoc module fixes ([@fredj](https://github.com/fredj))
* [#8125](https://github.com/openlayers/openlayers/pull/8125) - Shorter module paths for default exports ([@ahocevar](https://github.com/ahocevar))
* [#8122](https://github.com/openlayers/openlayers/pull/8122) - Remove unused 'format' options from Cluster source constructor ([@fredj](https://github.com/fredj))
* [#8121](https://github.com/openlayers/openlayers/pull/8121) - More Jsdoc module fixes ([@fredj](https://github.com/fredj))
* [#8117](https://github.com/openlayers/openlayers/pull/8117) - Re-export style constructors from ol/style ([@tschaub](https://github.com/tschaub))
* [#8115](https://github.com/openlayers/openlayers/pull/8115) - Re-export layer constructors from ol/layer ([@tschaub](https://github.com/tschaub))
* [#8114](https://github.com/openlayers/openlayers/pull/8114) - Re-export interaction constructors from ol/interaction ([@tschaub](https://github.com/tschaub))
* [#8116](https://github.com/openlayers/openlayers/pull/8116) - Re-export source constructors from ol/source ([@tschaub](https://github.com/tschaub))
* [#8113](https://github.com/openlayers/openlayers/pull/8113) - Re-export geometry constructors from ol/geom ([@tschaub](https://github.com/tschaub))
* [#8112](https://github.com/openlayers/openlayers/pull/8112) - Re-export format constructors from ol/format ([@tschaub](https://github.com/tschaub))
* [#8111](https://github.com/openlayers/openlayers/pull/8111) - Re-export control constructors ([@tschaub](https://github.com/tschaub))
* [#8118](https://github.com/openlayers/openlayers/pull/8118) - Use list for cloak entries ([@tschaub](https://github.com/tschaub))
* [#8109](https://github.com/openlayers/openlayers/pull/8109) - Make any falsey undefinedHTML retain the mouse position ([@tschaub](https://github.com/tschaub))
* [#8103](https://github.com/openlayers/openlayers/pull/8103) - Fix some jsdoc path types ([@ahocevar](https://github.com/ahocevar))
* [#7784](https://github.com/openlayers/openlayers/pull/7784) - Adds option to retain MousePosition when pointer leaves viewport ([@pedros007](https://github.com/pedros007))
* [#8101](https://github.com/openlayers/openlayers/pull/8101) - More Jsdoc module fixes ([@fredj](https://github.com/fredj))
* [#7908](https://github.com/openlayers/openlayers/pull/7908) - ScaleLine fix for non-degree based units ([@hyperknot](https://github.com/hyperknot))
* [#8099](https://github.com/openlayers/openlayers/pull/8099) - More Jsdoc module fixes ([@openlayers](https://github.com/openlayers))
* [#8098](https://github.com/openlayers/openlayers/pull/8098) - Remove externs/olx.js and src/ol/typedefs.js ([@tschaub](https://github.com/tschaub))
* [#8096](https://github.com/openlayers/openlayers/pull/8096) - Fix rotation default ([@ahocevar](https://github.com/ahocevar))
* [#8081](https://github.com/openlayers/openlayers/pull/8081) - Move olx.render.* and related typedefs to ol/render/* ([@pfirpfel](https://github.com/pfirpfel))
* [#8087](https://github.com/openlayers/openlayers/pull/8087) - Move various typedefs out of typdefs.js ([@pfirpfel](https://github.com/pfirpfel))
* [#8052](https://github.com/openlayers/openlayers/pull/8052) - More Jsdoc module fixes ([@fredj](https://github.com/fredj))
* [#8048](https://github.com/openlayers/openlayers/pull/8048) - Remove all comments from shaders ([@fredj](https://github.com/fredj))
* [#8089](https://github.com/openlayers/openlayers/pull/8089) - Allow unprefixed WMTS tileMatrix identifiers ([@fredj](https://github.com/fredj))
* [#8088](https://github.com/openlayers/openlayers/pull/8088) - Correct type for TextPlacement (jsdoc) ([@camptocamp](https://github.com/camptocamp))
* [#8083](https://github.com/openlayers/openlayers/pull/8083) - Move structs typedefs to ol/structs/* ([@pfirpfel](https://github.com/pfirpfel))
* [#8077](https://github.com/openlayers/openlayers/pull/8077) - Add hasFeature method to ol.source.Vector ([@icholy](https://github.com/icholy))
* [#8080](https://github.com/openlayers/openlayers/pull/8080) - #8079 Mark functions setRotateWithView and setSnapToPixel of ol/style/Image with @api ([@iagafonov](https://github.com/iagafonov))
* [#8084](https://github.com/openlayers/openlayers/pull/8084) - Move ol.Reproj* typedefs to ol/reproj ([@pfirpfel](https://github.com/pfirpfel))
* [#8082](https://github.com/openlayers/openlayers/pull/8082) - Remove unused typedefs ([@pfirpfel](https://github.com/pfirpfel))
* [#8076](https://github.com/openlayers/openlayers/pull/8076) - Move olx.style.* and ol.Style* to ol/style/* ([@pfirpfel](https://github.com/pfirpfel))
* [#8075](https://github.com/openlayers/openlayers/pull/8075) - Move olx.tilegrid.* to ol/tilegrid/* ([@pfirpfel](https://github.com/pfirpfel))
* [#8073](https://github.com/openlayers/openlayers/pull/8073) - Remove dependency on deprecated sinon@5 ([@tschaub](https://github.com/tschaub))
* [#7994](https://github.com/openlayers/openlayers/pull/7994) - Explicit renderer dependencies ([@tschaub](https://github.com/tschaub))
* [#7863](https://github.com/openlayers/openlayers/pull/7863) - Add note about null geom in VectorSource.forEachFeature ([@fredj](https://github.com/fredj))
* [#8055](https://github.com/openlayers/openlayers/pull/8055) - Mark optional property with square brackets ([@fredj](https://github.com/fredj))
* [#8054](https://github.com/openlayers/openlayers/pull/8054) - Generate correct includes list for `build-index` script on windows hosts. ([@lilliputten](https://github.com/lilliputten))
* [#8053](https://github.com/openlayers/openlayers/pull/8053) - Don't import from 'functions' multiple times ([@fredj](https://github.com/fredj))
* [#8041](https://github.com/openlayers/openlayers/pull/8041) - Remove olx typedefs ol/source ([@fgravin](https://github.com/fgravin))
* [#8026](https://github.com/openlayers/openlayers/pull/8026) - [doc] dispatchChangeEvent -> changed ([@nyurik](https://github.com/nyurik))
* [#8003](https://github.com/openlayers/openlayers/pull/8003) - Add an example showing Chaikins smoothing algorithm ([@marcjansen](https://github.com/marcjansen))
* [#8044](https://github.com/openlayers/openlayers/pull/8044) - Rename constructor options typedef to 'Options' ([@fredj](https://github.com/fredj))
* [#8042](https://github.com/openlayers/openlayers/pull/8042) - Only process loaded tiles ([@ahocevar](https://github.com/ahocevar))
* [#8036](https://github.com/openlayers/openlayers/pull/8036) - Move the temporary arrays to the module level ([@fredj](https://github.com/fredj))
* [#8032](https://github.com/openlayers/openlayers/pull/8032) - Start removing externs for `ol/source` ([@romanzoller](https://github.com/romanzoller))
* [#8038](https://github.com/openlayers/openlayers/pull/8038) - Fix ZoomToExtent default tipLabel value ([@fredj](https://github.com/fredj))
* [#8034](https://github.com/openlayers/openlayers/pull/8034) - More Jsdoc module fixes ([@fredj](https://github.com/fredj))
* [#8029](https://github.com/openlayers/openlayers/pull/8029) - More Jsdoc module fixes ([@fredj](https://github.com/fredj))
* [#8030](https://github.com/openlayers/openlayers/pull/8030) - Set `user-select: text` for .ol-selectable ([@walkermatt](https://github.com/walkermatt))
* [#8025](https://github.com/openlayers/openlayers/pull/8025) - Move olx.layer.* to ol/layer/* ([@romanzoller](https://github.com/romanzoller))
* [#8023](https://github.com/openlayers/openlayers/pull/8023) - Module type changes for ol.webgl ([@fredj](https://github.com/fredj))
* [#8021](https://github.com/openlayers/openlayers/pull/8021) - Move olx.ViewState to ol/View ([@fredj](https://github.com/fredj))
* [#8012](https://github.com/openlayers/openlayers/pull/8012) - More Jsdoc module fixes ([@fredj](https://github.com/fredj))
* [#8015](https://github.com/openlayers/openlayers/pull/8015) - Remove some typedefs from src/ol/typedefs.js ([@fredj](https://github.com/fredj))
* [#8016](https://github.com/openlayers/openlayers/pull/8016) - Move olx.layer.BaseOptions to ol/layer/Base ([@romanzoller](https://github.com/romanzoller))
* [#8005](https://github.com/openlayers/openlayers/pull/8005) - Add vector tile selection example ([@chrismayer](https://github.com/chrismayer))
* [#7999](https://github.com/openlayers/openlayers/pull/7999) - More Jsdoc module fixes ([@fredj](https://github.com/fredj))
* [#7998](https://github.com/openlayers/openlayers/pull/7998) - More Jsdoc module fixes ([@fredj](https://github.com/fredj))
* [#7992](https://github.com/openlayers/openlayers/pull/7992) - Fix freeze on export PDF example ([@trenneman](https://github.com/trenneman))
* [#7997](https://github.com/openlayers/openlayers/pull/7997) - Jsdoc module ([@fredj](https://github.com/fredj))
* [#7986](https://github.com/openlayers/openlayers/pull/7986) - Use module syntax for type annotations ([@fredj](https://github.com/fredj))
* [#7996](https://github.com/openlayers/openlayers/pull/7996) - 4.6.5 ([@openlayers](https://github.com/openlayers))
* [#7993](https://github.com/openlayers/openlayers/pull/7993) - Module types ([@tschaub](https://github.com/tschaub))
* [#7989](https://github.com/openlayers/openlayers/pull/7989) - Redistribute olx types for ol/interaction ([@ahocevar](https://github.com/ahocevar))
* [#7991](https://github.com/openlayers/openlayers/pull/7991) - Fix some type paths ([@ahocevar](https://github.com/ahocevar))
* [#7985](https://github.com/openlayers/openlayers/pull/7985) - Use path type instead of ol.tilegrid ([@fredj](https://github.com/fredj))
* [#7983](https://github.com/openlayers/openlayers/pull/7983) - Use path type instead of ol.Extent ([@ahocevar](https://github.com/ahocevar))
* [#7980](https://github.com/openlayers/openlayers/pull/7980) - Use module syntax for type annotations ([@fredj](https://github.com/fredj))
* [#7979](https://github.com/openlayers/openlayers/pull/7979) - Mark optional property with square brackets ([@fredj](https://github.com/fredj))
* [#7975](https://github.com/openlayers/openlayers/pull/7975) - Mark optional property with square brackets ([@fredj](https://github.com/fredj))
* [#7960](https://github.com/openlayers/openlayers/pull/7960) - Fix memory leak in CanvasImageRenderer ([@PetroDE](https://github.com/PetroDE))
* [#7974](https://github.com/openlayers/openlayers/pull/7974) - Fix spelling ([@fredj](https://github.com/fredj))
* [#7973](https://github.com/openlayers/openlayers/pull/7973) - Remove setAttributeNS function from ol/xml ([@fredj](https://github.com/fredj))
* [#7971](https://github.com/openlayers/openlayers/pull/7971) - Use module syntax for type annotations ([@tschaub](https://github.com/tschaub))
* [#7968](https://github.com/openlayers/openlayers/pull/7968) - More types in the right places ([@tschaub](https://github.com/tschaub))
* [#7966](https://github.com/openlayers/openlayers/pull/7966) - Remove namespaces from olx.js ([@tschaub](https://github.com/tschaub))
* [#7965](https://github.com/openlayers/openlayers/pull/7965) - Redistribute types from externs/olx.js ([@tschaub](https://github.com/tschaub))
* [#7608](https://github.com/openlayers/openlayers/pull/7608) - Facilitate the removal of externs/olx.js ([@tschaub](https://github.com/tschaub))
* [#7964](https://github.com/openlayers/openlayers/pull/7964) - Coordinate type typo ([@tschaub](https://github.com/tschaub))
* [#7961](https://github.com/openlayers/openlayers/pull/7961) - Correct type for style ([@tschaub](https://github.com/tschaub))
* [#7958](https://github.com/openlayers/openlayers/pull/7958) - miscellaneous fixes to the types annotation ([@fredj](https://github.com/fredj))
* [#7953](https://github.com/openlayers/openlayers/pull/7953) - Get rid of externs/olx.js and src/ol/typedefs.js typedefs for ol/ and ol/events/ ([@ahocevar](https://github.com/ahocevar))
* [#7956](https://github.com/openlayers/openlayers/pull/7956) - Make sure namespaces are populated after they were created ([@ahocevar](https://github.com/ahocevar))
* [#7952](https://github.com/openlayers/openlayers/pull/7952) - Fix typo in jsdoc type ([@fredj](https://github.com/fredj))
* [#7948](https://github.com/openlayers/openlayers/pull/7948) - Better type definition ([@fredj](https://github.com/fredj))
* [#7946](https://github.com/openlayers/openlayers/pull/7946) - New typedef syntax and module path types for some modules ([@ahocevar](https://github.com/ahocevar))
* [#7944](https://github.com/openlayers/openlayers/pull/7944) - Make wrap work with points in the vector-labels example ([@ahocevar](https://github.com/ahocevar))
* [#7933](https://github.com/openlayers/openlayers/pull/7933) - Better code indentation ([@fredj](https://github.com/fredj))
* [#7930](https://github.com/openlayers/openlayers/pull/7930) - Use listen function instead of on ([@openlayers](https://github.com/openlayers))
* [#7929](https://github.com/openlayers/openlayers/pull/7929) - Remove unused devDependencies ([@openlayers](https://github.com/openlayers))
* [#7927](https://github.com/openlayers/openlayers/pull/7927) - Remove unused deps, unused tasks, and outdated info ([@tschaub](https://github.com/tschaub))
* [#7923](https://github.com/openlayers/openlayers/pull/7923) - Fix exports and use of constants ([@ahocevar](https://github.com/ahocevar))
* [#7914](https://github.com/openlayers/openlayers/pull/7914) - Some easy window cleanups ([@gberaudo](https://github.com/gberaudo))
* [#7915](https://github.com/openlayers/openlayers/pull/7915) - Untie feature loader and XML code ([@gberaudo](https://github.com/gberaudo))
* [#7918](https://github.com/openlayers/openlayers/pull/7918) - Move the nullFunction to ol/functions ([@fredj](https://github.com/fredj))
* [#7910](https://github.com/openlayers/openlayers/pull/7910) - Better code indentation ([@fredj](https://github.com/fredj))
* [#7904](https://github.com/openlayers/openlayers/pull/7904) - Add focus condition, e.g. for wheel zoom ([@ahocevar](https://github.com/ahocevar))
* [#7902](https://github.com/openlayers/openlayers/pull/7902) - Add a unicode symbol for symbol font detection ([@ahocevar](https://github.com/ahocevar))
* [#7899](https://github.com/openlayers/openlayers/pull/7899) - Use nomnom@1.8.1 ([@tschaub](https://github.com/tschaub))
* [#7897](https://github.com/openlayers/openlayers/pull/7897) - Better variables scoping ([@fredj](https://github.com/fredj))
* [#7894](https://github.com/openlayers/openlayers/pull/7894) - More named exports, fewer static members ([@tschaub](https://github.com/tschaub))
* [#7881](https://github.com/openlayers/openlayers/pull/7881) - Better variables scoping ([@fredj](https://github.com/fredj))
* [#7888](https://github.com/openlayers/openlayers/pull/7888) - Rework away static members from pointer related classes ([@bjornharrtell](https://github.com/bjornharrtell))
* [#7880](https://github.com/openlayers/openlayers/pull/7880) - Named exports from ol/style/Style ([@tschaub](https://github.com/tschaub))
* [#7872](https://github.com/openlayers/openlayers/pull/7872) - More named export ([@fredj](https://github.com/fredj))
* [#7874](https://github.com/openlayers/openlayers/pull/7874) - Cleaning up exports ([@tschaub](https://github.com/tschaub))
* [#7871](https://github.com/openlayers/openlayers/pull/7871) - Memory optimization ([@fredj](https://github.com/fredj))
* [#7870](https://github.com/openlayers/openlayers/pull/7870) - Use exported function from ol/webgl ([@fredj](https://github.com/fredj))
* [#7868](https://github.com/openlayers/openlayers/pull/7868) - Named export ([@fredj](https://github.com/fredj))
* [#7861](https://github.com/openlayers/openlayers/pull/7861) - Named exports from ol/structs/PriorityQueue ([@fredj](https://github.com/fredj))
* [#7860](https://github.com/openlayers/openlayers/pull/7860) - Don't export private constant from ol/webgl ([@openlayers](https://github.com/openlayers))
* [#7855](https://github.com/openlayers/openlayers/pull/7855) - More named exports ([@tschaub](https://github.com/tschaub))
* [#7851](https://github.com/openlayers/openlayers/pull/7851) - Replacing static functions with named exports ([@tschaub](https://github.com/tschaub))
* [#7852](https://github.com/openlayers/openlayers/pull/7852) - Rename extent ([@nicholas-l](https://github.com/nicholas-l))
* [#7840](https://github.com/openlayers/openlayers/pull/7840) - More export renaming ([@raiyni](https://github.com/raiyni))
* [#7843](https://github.com/openlayers/openlayers/pull/7843) - Better code indentation ([@fredj](https://github.com/fredj))
* [#7842](https://github.com/openlayers/openlayers/pull/7842) - Allow setting the label cache size ([@ahocevar](https://github.com/ahocevar))
* [#7791](https://github.com/openlayers/openlayers/pull/7791) - Named exports from ol/tilecoord ([@marcjansen](https://github.com/marcjansen))
* [#7835](https://github.com/openlayers/openlayers/pull/7835) - Add and use a constant for the collapsed CSS class ([@marcjansen](https://github.com/marcjansen))
* [#7834](https://github.com/openlayers/openlayers/pull/7834) - Named exports from ol/transform ([@marcjansen](https://github.com/marcjansen))
* [#7831](https://github.com/openlayers/openlayers/pull/7831) - Add new maxTilesLoading option to ol/PluggableMap ([@fredj](https://github.com/fredj))
* [#7833](https://github.com/openlayers/openlayers/pull/7833) - Fix createEmptyTexture function call in ol/webgl/Context ([@fredj](https://github.com/fredj))
* [#7832](https://github.com/openlayers/openlayers/pull/7832) - Webgl Layer and Context named exports ([@fgravin](https://github.com/fgravin))
* [#7826](https://github.com/openlayers/openlayers/pull/7826) - Better code indentation and modules renaming ([@fredj](https://github.com/fredj))
* [#7828](https://github.com/openlayers/openlayers/pull/7828) - Refactor constraints static methods to module functions ([@bjornharrtell](https://github.com/bjornharrtell))
* [#7827](https://github.com/openlayers/openlayers/pull/7827) - Named exports from ol/render/canvas ([@tschaub](https://github.com/tschaub))
* [#7823](https://github.com/openlayers/openlayers/pull/7823) - Replace static members with named exports ([@fredj](https://github.com/fredj))
* [#7820](https://github.com/openlayers/openlayers/pull/7820) - ol/geom/flat/* exports ([@raiyni](https://github.com/raiyni))
* [#7824](https://github.com/openlayers/openlayers/pull/7824) - Fix code indentation ([@fredj](https://github.com/fredj))
* [#7821](https://github.com/openlayers/openlayers/pull/7821) - Add new canvas instruction array in ol/render/canvas/Instruction ([@fredj](https://github.com/fredj))
* [#7817](https://github.com/openlayers/openlayers/pull/7817) - Remove more private static members ([@tschaub](https://github.com/tschaub))
* [#7814](https://github.com/openlayers/openlayers/pull/7814) - Remove more private static members ([@tschaub](https://github.com/tschaub))
* [#7816](https://github.com/openlayers/openlayers/pull/7816) - Use toString instead of asString in asColorLike ([@openlayers](https://github.com/openlayers))
* [#7811](https://github.com/openlayers/openlayers/pull/7811) - Remove ol.FeatureStyleFunction support ([@fredj](https://github.com/fredj))
* [#7815](https://github.com/openlayers/openlayers/pull/7815) - Remove private statics from webgl related modules ([@bjornharrtell](https://github.com/bjornharrtell))
* [#7803](https://github.com/openlayers/openlayers/pull/7803) - Remove private static members from constructors ([@tschaub](https://github.com/tschaub))
* [#7808](https://github.com/openlayers/openlayers/pull/7808) - Make sure the requested image size matches the desired ratio ([@ahocevar](https://github.com/ahocevar))
* [#7807](https://github.com/openlayers/openlayers/pull/7807) - Run typecheck after tests, because of its current verbosity ([@ahocevar](https://github.com/ahocevar))
* [#7805](https://github.com/openlayers/openlayers/pull/7805) - Remove private static members from constructors ([@fredj](https://github.com/fredj))
* [#7806](https://github.com/openlayers/openlayers/pull/7806) - Fix rotate import ([@ahocevar](https://github.com/ahocevar))
* [#7800](https://github.com/openlayers/openlayers/pull/7800) - More named exports ([@tschaub](https://github.com/tschaub))
* [#7741](https://github.com/openlayers/openlayers/pull/7741) - Type checking and full build creation ([@ahocevar](https://github.com/ahocevar))
* [#7797](https://github.com/openlayers/openlayers/pull/7797) - Better default export names for WebGL modules ([@tschaub](https://github.com/tschaub))
* [#7794](https://github.com/openlayers/openlayers/pull/7794) - Call animation callback in a timeout ([@tschaub](https://github.com/tschaub))
* [#7793](https://github.com/openlayers/openlayers/pull/7793) - More renaming of default exports ([@tschaub](https://github.com/tschaub))
* [#7799](https://github.com/openlayers/openlayers/pull/7799) - Use tmpSize to reduce garbage generation ([@fredj](https://github.com/fredj))
* [#7788](https://github.com/openlayers/openlayers/pull/7788) - Fix shaders generation ([@fredj](https://github.com/fredj))
* [#7789](https://github.com/openlayers/openlayers/pull/7789) - Use STATIC_DRAW as default WebGL buffer usage ([@fredj](https://github.com/fredj))
* [#7787](https://github.com/openlayers/openlayers/pull/7787) - More renaming ([@fredj](https://github.com/fredj))
* [#7782](https://github.com/openlayers/openlayers/pull/7782) - Named exports from specific proj modules ([@tschaub](https://github.com/tschaub))
* [#7780](https://github.com/openlayers/openlayers/pull/7780) - More named exports ([@tschaub](https://github.com/tschaub))
* [#7783](https://github.com/openlayers/openlayers/pull/7783) - Named exports from ol/xml ([@raiyni](https://github.com/raiyni))
* [#7774](https://github.com/openlayers/openlayers/pull/7774) - Pass destination extent to avoid garbage generation ([@fredj](https://github.com/fredj))
* [#7771](https://github.com/openlayers/openlayers/pull/7771) - Named exports from loadingstrategy ([@marcjansen](https://github.com/marcjansen))
* [#7772](https://github.com/openlayers/openlayers/pull/7772) - Named exports from filter module ([@marcjansen](https://github.com/marcjansen))
* [#7770](https://github.com/openlayers/openlayers/pull/7770) - Rename _ol_render_Box_ to RenderBox ([@marcjansen](https://github.com/marcjansen))
* [#7763](https://github.com/openlayers/openlayers/pull/7763) - Use the temporary extent in VectorTileLayer ([@fredj](https://github.com/fredj))
* [#7765](https://github.com/openlayers/openlayers/pull/7765) - Named exports from events condition ([@marcjansen](https://github.com/marcjansen))
* [#7767](https://github.com/openlayers/openlayers/pull/7767) - Transformation functions: Fix spelling and use the symbol × ([@marcjansen](https://github.com/marcjansen))
* [#7764](https://github.com/openlayers/openlayers/pull/7764) - Named exports from ol/has ([@tschaub](https://github.com/tschaub))
* [#7761](https://github.com/openlayers/openlayers/pull/7761) - Rename _ol_render_canvas_Instruction_ to CanvasInstruction ([@fredj](https://github.com/fredj))
* [#7749](https://github.com/openlayers/openlayers/pull/7749) - Check if the sketch feature is defined in finishDrawing ([@fredj](https://github.com/fredj))
* [#7745](https://github.com/openlayers/openlayers/pull/7745) - More named exports ([@fredj](https://github.com/fredj))
* [#7743](https://github.com/openlayers/openlayers/pull/7743) - Set enableHighAccuracy in geolocation example ([@fredj](https://github.com/fredj))
* [#7738](https://github.com/openlayers/openlayers/pull/7738) - Named exports from ol/events ([@tschaub](https://github.com/tschaub))
* [#7724](https://github.com/openlayers/openlayers/pull/7724) - Update prism library ([@fredj](https://github.com/fredj))
* [#7727](https://github.com/openlayers/openlayers/pull/7727) - Deactivate transition effect for semi transparent layer example ([@fredj](https://github.com/fredj))
* [#7726](https://github.com/openlayers/openlayers/pull/7726) - Named exports from ol/string ([@fredj](https://github.com/fredj))
* [#7725](https://github.com/openlayers/openlayers/pull/7725) - Remove extra comment ([@fredj](https://github.com/fredj))
* [#7721](https://github.com/openlayers/openlayers/pull/7721) - More renaming ([@fredj](https://github.com/fredj))
* [#7716](https://github.com/openlayers/openlayers/pull/7716) - Better variables scoping ([@fredj](https://github.com/fredj))
* [#7698](https://github.com/openlayers/openlayers/pull/7698) - Fix for loop in color test ([@fredj](https://github.com/fredj))
* [#7703](https://github.com/openlayers/openlayers/pull/7703) - Improved drawing experience on touch devices ([@ahocevar](https://github.com/ahocevar))
* [#7713](https://github.com/openlayers/openlayers/pull/7713) - Better variables scoping ([@fredj](https://github.com/fredj))
* [#7711](https://github.com/openlayers/openlayers/pull/7711) - Do not use (I)CLA anymore ([@bartvde](https://github.com/bartvde))
* [#7709](https://github.com/openlayers/openlayers/pull/7709) - More named export ([@fredj](https://github.com/fredj))
* [#7705](https://github.com/openlayers/openlayers/pull/7705) - More renaming ([@fredj](https://github.com/fredj))
* [#7700](https://github.com/openlayers/openlayers/pull/7700) - Fix ScaleLine control for Projections in degrees ([@pedros007](https://github.com/pedros007))
* [#7697](https://github.com/openlayers/openlayers/pull/7697) - Use const and let ([@tschaub](https://github.com/tschaub))
* [#7695](https://github.com/openlayers/openlayers/pull/7695) - More renaming ([@tschaub](https://github.com/tschaub))
* [#7693](https://github.com/openlayers/openlayers/pull/7693) - More import renaming ([@fredj](https://github.com/fredj))
* [#7678](https://github.com/openlayers/openlayers/pull/7678) - Add jsDelivr hits badge ([@LukasDrgon](https://github.com/LukasDrgon))
* [#7686](https://github.com/openlayers/openlayers/pull/7686) - More import renaming ([@tschaub](https://github.com/tschaub))
* [#7669](https://github.com/openlayers/openlayers/pull/7669) - Use declutter tree only for text and image replays ([@ahocevar](https://github.com/ahocevar))
* [#7683](https://github.com/openlayers/openlayers/pull/7683) - Move IGCZ enum to src/ol/format/IGC.js ([@fredj](https://github.com/fredj))
* [#7682](https://github.com/openlayers/openlayers/pull/7682) - Add new condition to MouseWheelZoom interaction ([@fredj](https://github.com/fredj))
* [#7676](https://github.com/openlayers/openlayers/pull/7676) - Check fonts against two reference fonts ([@ahocevar](https://github.com/ahocevar))
* [#7668](https://github.com/openlayers/openlayers/pull/7668) - Hit detect text background ([@ahocevar](https://github.com/ahocevar))
* [#7661](https://github.com/openlayers/openlayers/pull/7661) - Background fill stroke ([@ahocevar](https://github.com/ahocevar))
* [#7654](https://github.com/openlayers/openlayers/pull/7654) - Add named export for transformWithOptions function ([@fredj](https://github.com/fredj))
* [#7652](https://github.com/openlayers/openlayers/pull/7652) - More renaming ([@fredj](https://github.com/fredj))
* [#7649](https://github.com/openlayers/openlayers/pull/7649) - Named Map export for ol/Map ([@raiyni](https://github.com/raiyni))
* [#7646](https://github.com/openlayers/openlayers/pull/7646) - Named export for Polyline format and SimpleGeometry ([@openlayers](https://github.com/openlayers))
* [#7650](https://github.com/openlayers/openlayers/pull/7650) - Rename _ol_PluggableMap_ to PluggableMap ([@fredj](https://github.com/fredj))
* [#7642](https://github.com/openlayers/openlayers/pull/7642) - Don't store private function into GPX ([@fredj](https://github.com/fredj))
* [#7643](https://github.com/openlayers/openlayers/pull/7643) - Replace ol/Sphere with ol/sphere ([@tschaub](https://github.com/tschaub))
* [#7644](https://github.com/openlayers/openlayers/pull/7644) - Named exports from ol/math module ([@raiyni](https://github.com/raiyni))
* [#7636](https://github.com/openlayers/openlayers/pull/7636) - Named exports from the ol/array module ([@marcjansen](https://github.com/marcjansen))
* [#7614](https://github.com/openlayers/openlayers/pull/7614) - Remove opt_this from the API ([@KlausBenndorf](https://github.com/KlausBenndorf))
* [#7640](https://github.com/openlayers/openlayers/pull/7640) - Remove unneeded and already skipped test ([@openlayers](https://github.com/openlayers))
* [#7637](https://github.com/openlayers/openlayers/pull/7637) - Named exports from the ol/color module ([@marcjansen](https://github.com/marcjansen))
* [#7639](https://github.com/openlayers/openlayers/pull/7639) - Don't store private function into GeoJSON ([@fredj](https://github.com/fredj))
* [#7635](https://github.com/openlayers/openlayers/pull/7635) - More module renaming ([@fredj](https://github.com/fredj))
* [#7632](https://github.com/openlayers/openlayers/pull/7632) - Named exports from ol/css module ([@marcjansen](https://github.com/marcjansen))
* [#7634](https://github.com/openlayers/openlayers/pull/7634) - Rename _ol_layer_Tile_ to TileLayer ([@marcjansen](https://github.com/marcjansen))
* [#7633](https://github.com/openlayers/openlayers/pull/7633) - Import assert function directly ([@marcjansen](https://github.com/marcjansen))
* [#7631](https://github.com/openlayers/openlayers/pull/7631) - More named export and rename ([@fredj](https://github.com/fredj))
* [#7627](https://github.com/openlayers/openlayers/pull/7627) - Nicer import name ([@fredj](https://github.com/fredj))
* [#7622](https://github.com/openlayers/openlayers/pull/7622) - Named export ([@fredj](https://github.com/fredj))
* [#7624](https://github.com/openlayers/openlayers/pull/7624) - Remove eslint-plugin-openlayers-internal rules ([@fredj](https://github.com/fredj))
* [#7625](https://github.com/openlayers/openlayers/pull/7625) - Named export for ol/control and ol/interaction ([@fredj](https://github.com/fredj))
* [#7623](https://github.com/openlayers/openlayers/pull/7623) - Named export for ol/tileurlfunction ([@fredj](https://github.com/fredj))
* [#7621](https://github.com/openlayers/openlayers/pull/7621) - Replace ZeroClipboard with Clipboard.js ([@fredj](https://github.com/fredj))
* [#7620](https://github.com/openlayers/openlayers/pull/7620) - Rename variables in format modules ([@tschaub](https://github.com/tschaub))
* [#7619](https://github.com/openlayers/openlayers/pull/7619) - More variable renaming ([@fredj](https://github.com/fredj))
* [#7612](https://github.com/openlayers/openlayers/pull/7612) - Better import name for _ol_ext_* import ([@fredj](https://github.com/fredj))
* [#7611](https://github.com/openlayers/openlayers/pull/7611) - Change olx.SphereMetricOptions to SphereMetricOptions ([@fredj](https://github.com/fredj))
* [#7615](https://github.com/openlayers/openlayers/pull/7615) - Remove logos ([@tschaub](https://github.com/tschaub))
* [#7610](https://github.com/openlayers/openlayers/pull/7610) - More variable renaming ([@fredj](https://github.com/fredj))
* [#7609](https://github.com/openlayers/openlayers/pull/7609) - Redistribute a few types and docs ([@tschaub](https://github.com/tschaub))
* [#7598](https://github.com/openlayers/openlayers/pull/7598) - Modular proj4 integration ([@ahocevar](https://github.com/ahocevar))
* [#7607](https://github.com/openlayers/openlayers/pull/7607) - Rename interaction variables ([@tschaub](https://github.com/tschaub))
* [#7599](https://github.com/openlayers/openlayers/pull/7599) - Rename event variables ([@marcjansen](https://github.com/marcjansen))
* [#7605](https://github.com/openlayers/openlayers/pull/7605) - Better import and class name in ol/format/filter/ ([@fredj](https://github.com/fredj))
* [#7604](https://github.com/openlayers/openlayers/pull/7604) - Named exports from ol/functions ([@fredj](https://github.com/fredj))
* [#7603](https://github.com/openlayers/openlayers/pull/7603) - Simplify default export ([@fredj](https://github.com/fredj))
* [#7602](https://github.com/openlayers/openlayers/pull/7602) - Remove now unused DEVICE_ORIENTATION ([@fredj](https://github.com/fredj))
* [#7597](https://github.com/openlayers/openlayers/pull/7597) - More es6 named export ([@fredj](https://github.com/fredj))
* [#7600](https://github.com/openlayers/openlayers/pull/7600) - Simplify default export of ol/events/KeyCode ([@marcjansen](https://github.com/marcjansen))
* [#7594](https://github.com/openlayers/openlayers/pull/7594) - Rename control variables ([@tschaub](https://github.com/tschaub))
* [#7593](https://github.com/openlayers/openlayers/pull/7593) - Simplify default export ([@tschaub](https://github.com/tschaub))
* [#7591](https://github.com/openlayers/openlayers/pull/7591) - Rename geometry variables ([@tschaub](https://github.com/tschaub))
* [#7586](https://github.com/openlayers/openlayers/pull/7586) - Named exports from ol/dom ([@fredj](https://github.com/fredj))
* [#7581](https://github.com/openlayers/openlayers/pull/7581) - Named exports from ol/proj ([@tschaub](https://github.com/tschaub))
* [#7585](https://github.com/openlayers/openlayers/pull/7585) - Remove leftovers olx.animation typedefs ([@fredj](https://github.com/fredj))
* [#7584](https://github.com/openlayers/openlayers/pull/7584) - Named exports from ol/easing ([@fredj](https://github.com/fredj))
* [#7582](https://github.com/openlayers/openlayers/pull/7582) - Remove default export from ol/extent ([@ahocevar](https://github.com/ahocevar))
* [#7580](https://github.com/openlayers/openlayers/pull/7580) - No default export from lowercase modules ([@tschaub](https://github.com/tschaub))
* [#7575](https://github.com/openlayers/openlayers/pull/7575) - Add named exports for extent ([@ahocevar](https://github.com/ahocevar))
* [#7579](https://github.com/openlayers/openlayers/pull/7579) - VectorImageTile: call changed() before removing listeners on dispose ([@mbleichner](https://github.com/mbleichner))
* [#7578](https://github.com/openlayers/openlayers/pull/7578) - Remove deprecated functionality from 4.x ([@tschaub](https://github.com/tschaub))
* [#7577](https://github.com/openlayers/openlayers/pull/7577) - Redistribute things in ol/index.js ([@tschaub](https://github.com/tschaub))
* [#7576](https://github.com/openlayers/openlayers/pull/7576) - Named exports from ol/index.js ([@tschaub](https://github.com/tschaub))
* [#7570](https://github.com/openlayers/openlayers/pull/7570) - Transform sources to ES modules ([@tschaub](https://github.com/tschaub))
* [#7569](https://github.com/openlayers/openlayers/pull/7569) - Remove unnecessary require ([@tschaub](https://github.com/tschaub))
* [#7568](https://github.com/openlayers/openlayers/pull/7568) - Remove unneeded configs from test ([@ahocevar](https://github.com/ahocevar))
* [#7566](https://github.com/openlayers/openlayers/pull/7566) - Proper projection construction ([@tschaub](https://github.com/tschaub))
* [#7565](https://github.com/openlayers/openlayers/pull/7565) - Release v4.6.4 ([@openlayers](https://github.com/openlayers))
* [#7563](https://github.com/openlayers/openlayers/pull/7563) - Use full precision for the declutter box ([@ahocevar](https://github.com/ahocevar))
* [#7559](https://github.com/openlayers/openlayers/pull/7559) - Handle skipping and unskipping features with renderMode: 'image' ([@ahocevar](https://github.com/ahocevar))
* [#7562](https://github.com/openlayers/openlayers/pull/7562) - Remove unused, confusing projection code ([@ahocevar](https://github.com/ahocevar))
* [#7555](https://github.com/openlayers/openlayers/pull/7555) - Release v4.6.3 ([@openlayers](https://github.com/openlayers))
* [#7554](https://github.com/openlayers/openlayers/pull/7554) - Only compose image vector frame when the replay group has changed ([@ahocevar](https://github.com/ahocevar))
* [#7550](https://github.com/openlayers/openlayers/pull/7550) - Update examples to d3.js v4 ([@fredj](https://github.com/fredj))
* [#7548](https://github.com/openlayers/openlayers/pull/7548) - Fix pull request link ([@openlayers](https://github.com/openlayers))
* [#7547](https://github.com/openlayers/openlayers/pull/7547) - Release v4.6.2 ([@openlayers](https://github.com/openlayers))
* [#7546](https://github.com/openlayers/openlayers/pull/7546) - Do not request features for wrapped extent ([@ahocevar](https://github.com/ahocevar))
* [#7545](https://github.com/openlayers/openlayers/pull/7545) - Release v4.6.1 ([@openlayers](https://github.com/openlayers))
* [#7543](https://github.com/openlayers/openlayers/pull/7543) - Donut polygon labels do not get a chance to get rendered ([@ahocevar](https://github.com/ahocevar))
* [#7542](https://github.com/openlayers/openlayers/pull/7542) - Still respect deprecated exceedLength option ([@ahocevar](https://github.com/ahocevar))
* [#7541](https://github.com/openlayers/openlayers/pull/7541) - Fix case of vectorrendertype.js ([@ahocevar](https://github.com/ahocevar))
<details>
<summary>Dependency Updates</summary>
* [#8315](https://github.com/openlayers/openlayers/pull/8315) - Update eslint to the latest version 🚀 ([@openlayers](https://github.com/openlayers))
* [#8309](https://github.com/openlayers/openlayers/pull/8309) - Update eslint to the latest version 🚀 ([@openlayers](https://github.com/openlayers))
* [#8311](https://github.com/openlayers/openlayers/pull/8311) - Update webpack to the latest version 🚀 ([@openlayers](https://github.com/openlayers))
* [#8310](https://github.com/openlayers/openlayers/pull/8310) - Update rollup to the latest version 🚀 ([@openlayers](https://github.com/openlayers))
* [#8297](https://github.com/openlayers/openlayers/pull/8297) - Update rollup to the latest version 🚀 ([@openlayers](https://github.com/openlayers))
* [#8293](https://github.com/openlayers/openlayers/pull/8293) - Update rollup to the latest version 🚀 ([@openlayers](https://github.com/openlayers))
* [#8285](https://github.com/openlayers/openlayers/pull/8285) - Update google-closure-compiler to the latest version 🚀 ([@openlayers](https://github.com/openlayers))
* [#8275](https://github.com/openlayers/openlayers/pull/8275) - Update serve to the latest version 🚀 ([@openlayers](https://github.com/openlayers))
* [#8271](https://github.com/openlayers/openlayers/pull/8271) - chore(package): update google-closure-compiler to version 20180610.0.1 ([@openlayers](https://github.com/openlayers))
* [#8270](https://github.com/openlayers/openlayers/pull/8270) - chore(package): update rollup to version 0.60.7 ([@openlayers](https://github.com/openlayers))
* [#8266](https://github.com/openlayers/openlayers/pull/8266) - chore(package): update rollup to version 0.60.4 ([@openlayers](https://github.com/openlayers))
* [#8261](https://github.com/openlayers/openlayers/pull/8261) - Update rollup to the latest version 🚀 ([@openlayers](https://github.com/openlayers))
* [#8260](https://github.com/openlayers/openlayers/pull/8260) - Update sinon to the latest version 🚀 ([@openlayers](https://github.com/openlayers))
* [#8252](https://github.com/openlayers/openlayers/pull/8252) - Update rollup to the latest version 🚀 ([@openlayers](https://github.com/openlayers))
* [#8248](https://github.com/openlayers/openlayers/pull/8248) - Update serve to the latest version 🚀 ([@openlayers](https://github.com/openlayers))
* [#8247](https://github.com/openlayers/openlayers/pull/8247) - Update rollup to the latest version 🚀 ([@openlayers](https://github.com/openlayers))
* [#8241](https://github.com/openlayers/openlayers/pull/8241) - Update recast to the latest version 🚀 ([@openlayers](https://github.com/openlayers))
* [#8230](https://github.com/openlayers/openlayers/pull/8230) - Update serve to the latest version 🚀 ([@openlayers](https://github.com/openlayers))
* [#8208](https://github.com/openlayers/openlayers/pull/8208) - Update marked to the latest version 🚀 ([@openlayers](https://github.com/openlayers))
* [#8205](https://github.com/openlayers/openlayers/pull/8205) - Update mocha to the latest version 🚀 ([@openlayers](https://github.com/openlayers))
* [#8179](https://github.com/openlayers/openlayers/pull/8179) - Update google-closure-compiler to the latest version 🚀 ([@openlayers](https://github.com/openlayers))
* [#8146](https://github.com/openlayers/openlayers/pull/8146) - Update coveralls to the latest version 🚀 ([@openlayers](https://github.com/openlayers))
* [#8145](https://github.com/openlayers/openlayers/pull/8145) - Update fs-extra to the latest version 🚀 ([@openlayers](https://github.com/openlayers))
* [#8140](https://github.com/openlayers/openlayers/pull/8140) - Update sinon to the latest version 🚀 ([@openlayers](https://github.com/openlayers))
* [#8131](https://github.com/openlayers/openlayers/pull/8131) - Update babel-plugin-jsdoc-closure to the latest version 🚀 ([@openlayers](https://github.com/openlayers))
* [#8130](https://github.com/openlayers/openlayers/pull/8130) - Update babel-plugin-jsdoc-closure to the latest version 🚀 ([@openlayers](https://github.com/openlayers))
* [#8128](https://github.com/openlayers/openlayers/pull/8128) - Update babel-plugin-jsdoc-closure to the latest version 🚀 ([@openlayers](https://github.com/openlayers))
* [#8124](https://github.com/openlayers/openlayers/pull/8124) - Update babel-plugin-jsdoc-closure to the latest version 🚀 ([@openlayers](https://github.com/openlayers))
* [#8102](https://github.com/openlayers/openlayers/pull/8102) - Update babel-plugin-jsdoc-closure to the latest version 🚀 ([@openlayers](https://github.com/openlayers))
* [#8095](https://github.com/openlayers/openlayers/pull/8095) - Update babel-plugin-jsdoc-closure to the latest version 🚀 ([@openlayers](https://github.com/openlayers))
* [#8094](https://github.com/openlayers/openlayers/pull/8094) - Update babel-plugin-jsdoc-closure to the latest version 🚀 ([@openlayers](https://github.com/openlayers))
* [#8093](https://github.com/openlayers/openlayers/pull/8093) - chore(package): update serve to version 6.5.5 ([@openlayers](https://github.com/openlayers))
* [#8090](https://github.com/openlayers/openlayers/pull/8090) - chore(package): update url-polyfill to version 1.0.13 ([@openlayers](https://github.com/openlayers))
* [#8091](https://github.com/openlayers/openlayers/pull/8091) - chore(package): update karma-firefox-launcher to version 1.1.0 ([@openlayers](https://github.com/openlayers))
* [#8085](https://github.com/openlayers/openlayers/pull/8085) - Update mocha to the latest version 🚀 ([@openlayers](https://github.com/openlayers))
* [#8071](https://github.com/openlayers/openlayers/pull/8071) - Update mocha to the latest version 🚀 ([@openlayers](https://github.com/openlayers))
* [#8060](https://github.com/openlayers/openlayers/pull/8060) - Update google-closure-compiler to the latest version 🚀 ([@openlayers](https://github.com/openlayers))
* [#8039](https://github.com/openlayers/openlayers/pull/8039) - Update google-closure-compiler to the latest version 🚀 ([@openlayers](https://github.com/openlayers))
* [#8028](https://github.com/openlayers/openlayers/pull/8028) - Update marked to the latest version 🚀 ([@openlayers](https://github.com/openlayers))
* [#8019](https://github.com/openlayers/openlayers/pull/8019) - Update mocha to the latest version 🚀 ([@openlayers](https://github.com/openlayers))
* [#8017](https://github.com/openlayers/openlayers/pull/8017) - Update marked to the latest version 🚀 ([@openlayers](https://github.com/openlayers))
* [#8018](https://github.com/openlayers/openlayers/pull/8018) - Update recast to the latest version 🚀 ([@openlayers](https://github.com/openlayers))
* [#8014](https://github.com/openlayers/openlayers/pull/8014) - Update recast to the latest version 🚀 ([@openlayers](https://github.com/openlayers))
* [#8009](https://github.com/openlayers/openlayers/pull/8009) - chore(package): update sinon to version 5.0.0 ([@openlayers](https://github.com/openlayers))
* [#8008](https://github.com/openlayers/openlayers/pull/8008) - Update eslint to the latest version 🚀 ([@openlayers](https://github.com/openlayers))
* [#8000](https://github.com/openlayers/openlayers/pull/8000) - Update karma-webpack to the latest version 🚀 ([@openlayers](https://github.com/openlayers))
* [#7990](https://github.com/openlayers/openlayers/pull/7990) - Update eslint to the latest version 🚀 ([@openlayers](https://github.com/openlayers))
* [#7984](https://github.com/openlayers/openlayers/pull/7984) - Update sinon to the latest version 🚀 ([@openlayers](https://github.com/openlayers))
* [#7981](https://github.com/openlayers/openlayers/pull/7981) - Update sinon to the latest version 🚀 ([@openlayers](https://github.com/openlayers))
* [#7977](https://github.com/openlayers/openlayers/pull/7977) - Update sinon to the latest version 🚀 ([@openlayers](https://github.com/openlayers))
* [#7972](https://github.com/openlayers/openlayers/pull/7972) - Update sinon to the latest version 🚀 ([@openlayers](https://github.com/openlayers))
* [#7963](https://github.com/openlayers/openlayers/pull/7963) - chore(package): update url-polyfill to version 1.0.11 ([@openlayers](https://github.com/openlayers))
* [#7962](https://github.com/openlayers/openlayers/pull/7962) - chore(package): update serve to version 6.5.2 ([@openlayers](https://github.com/openlayers))
* [#7959](https://github.com/openlayers/openlayers/pull/7959) - Update babel-plugin-jsdoc-closure to the latest version 🚀 ([@openlayers](https://github.com/openlayers))
* [#7957](https://github.com/openlayers/openlayers/pull/7957) - Update recast to the latest version 🚀 ([@openlayers](https://github.com/openlayers))
* [#7950](https://github.com/openlayers/openlayers/pull/7950) - Update mocha to the latest version 🚀 ([@openlayers](https://github.com/openlayers))
* [#7945](https://github.com/openlayers/openlayers/pull/7945) - Update babel-plugin-jsdoc-closure to the latest version 🚀 ([@openlayers](https://github.com/openlayers))
* [#7943](https://github.com/openlayers/openlayers/pull/7943) - Update mocha to the latest version 🚀 ([@openlayers](https://github.com/openlayers))
* [#7940](https://github.com/openlayers/openlayers/pull/7940) - Update babel-plugin-jsdoc-closure to the latest version 🚀 ([@openlayers](https://github.com/openlayers))
* [#7938](https://github.com/openlayers/openlayers/pull/7938) - Update mocha to the latest version 🚀 ([@openlayers](https://github.com/openlayers))
* [#7925](https://github.com/openlayers/openlayers/pull/7925) - Update eslint to the latest version 🚀 ([@openlayers](https://github.com/openlayers))
* [#7921](https://github.com/openlayers/openlayers/pull/7921) - Update clean-css-cli to the latest version 🚀 ([@openlayers](https://github.com/openlayers))
* [#7916](https://github.com/openlayers/openlayers/pull/7916) - chore(package): update html-webpack-plugin to version 3.0.1 ([@openlayers](https://github.com/openlayers))
* [#7905](https://github.com/openlayers/openlayers/pull/7905) - Update karma-webpack to the latest version 🚀 ([@openlayers](https://github.com/openlayers))
* [#7903](https://github.com/openlayers/openlayers/pull/7903) - Update marked to the latest version 🚀 ([@openlayers](https://github.com/openlayers))
* [#7901](https://github.com/openlayers/openlayers/pull/7901) - Update karma-webpack to the latest version 🚀 ([@openlayers](https://github.com/openlayers))
* [#7898](https://github.com/openlayers/openlayers/pull/7898) - chore(package): update karma-webpack to version 2.0.11 ([@openlayers](https://github.com/openlayers))
* [#7893](https://github.com/openlayers/openlayers/pull/7893) - Update sinon to the latest version 🚀 ([@openlayers](https://github.com/openlayers))
* [#7891](https://github.com/openlayers/openlayers/pull/7891) - chore(package): update recast to version 0.14.4 ([@openlayers](https://github.com/openlayers))
* [#7886](https://github.com/openlayers/openlayers/pull/7886) - Update sinon to the latest version 🚀 ([@openlayers](https://github.com/openlayers))
* [#7882](https://github.com/openlayers/openlayers/pull/7882) - Update sinon to the latest version 🚀 ([@openlayers](https://github.com/openlayers))
* [#7876](https://github.com/openlayers/openlayers/pull/7876) - Update recast to the latest version 🚀 ([@openlayers](https://github.com/openlayers))
* [#7877](https://github.com/openlayers/openlayers/pull/7877) - Update webpack-merge to the latest version 🚀 ([@openlayers](https://github.com/openlayers))
* [#7865](https://github.com/openlayers/openlayers/pull/7865) - Update marked to the latest version 🚀 ([@openlayers](https://github.com/openlayers))
* [#7866](https://github.com/openlayers/openlayers/pull/7866) - Update eslint to the latest version 🚀 ([@openlayers](https://github.com/openlayers))
* [#7867](https://github.com/openlayers/openlayers/pull/7867) - Update recast to the latest version 🚀 ([@openlayers](https://github.com/openlayers))
* [#7858](https://github.com/openlayers/openlayers/pull/7858) - Update recast to the latest version 🚀 ([@openlayers](https://github.com/openlayers))
* [#7850](https://github.com/openlayers/openlayers/pull/7850) - Update marked to the latest version 🚀 ([@openlayers](https://github.com/openlayers))
* [#7849](https://github.com/openlayers/openlayers/pull/7849) - Update recast to the latest version 🚀 ([@openlayers](https://github.com/openlayers))
* [#7848](https://github.com/openlayers/openlayers/pull/7848) - Update nomnom to the latest version 🚀 ([@openlayers](https://github.com/openlayers))
* [#7847](https://github.com/openlayers/openlayers/pull/7847) - Update eslint to the latest version 🚀 ([@openlayers](https://github.com/openlayers))
* [#7845](https://github.com/openlayers/openlayers/pull/7845) - chore(package): update marked to version 0.3.14 ([@openlayers](https://github.com/openlayers))
* [#7841](https://github.com/openlayers/openlayers/pull/7841) - Greenkeeper/babel plugin jsdoc closure 1.2.0 ([@openlayers](https://github.com/openlayers))
* [#7822](https://github.com/openlayers/openlayers/pull/7822) - Update mocha to the latest version 🚀 ([@openlayers](https://github.com/openlayers))
* [#7813](https://github.com/openlayers/openlayers/pull/7813) - Update recast to the latest version 🚀 ([@openlayers](https://github.com/openlayers))
* [#7809](https://github.com/openlayers/openlayers/pull/7809) - Update webpack to the latest version 🚀 ([@openlayers](https://github.com/openlayers))
* [#7812](https://github.com/openlayers/openlayers/pull/7812) - chore(package): update sinon to version 4.3.0 ([@openlayers](https://github.com/openlayers))
* [#7777](https://github.com/openlayers/openlayers/pull/7777) - Update babel-minify-webpack-plugin to the latest version 🚀 ([@openlayers](https://github.com/openlayers))
* [#7759](https://github.com/openlayers/openlayers/pull/7759) - Update eslint to the latest version 🚀 ([@openlayers](https://github.com/openlayers))
* [#7746](https://github.com/openlayers/openlayers/pull/7746) - Update sinon to the latest version 🚀 ([@openlayers](https://github.com/openlayers))
* [#7735](https://github.com/openlayers/openlayers/pull/7735) - Update sinon to the latest version 🚀 ([@openlayers](https://github.com/openlayers))
* [#7729](https://github.com/openlayers/openlayers/pull/7729) - Update jquery to the latest version 🚀 ([@openlayers](https://github.com/openlayers))
* [#7732](https://github.com/openlayers/openlayers/pull/7732) - Update sinon to the latest version 🚀 ([@openlayers](https://github.com/openlayers))
* [#7731](https://github.com/openlayers/openlayers/pull/7731) - Update webpack-dev-server to the latest version 🚀 ([@openlayers](https://github.com/openlayers))
* [#7728](https://github.com/openlayers/openlayers/pull/7728) - Update eslint to the latest version 🚀 ([@openlayers](https://github.com/openlayers))
* [#7720](https://github.com/openlayers/openlayers/pull/7720) - Update mocha to the latest version 🚀 ([@openlayers](https://github.com/openlayers))
* [#7712](https://github.com/openlayers/openlayers/pull/7712) - Update sinon to the latest version 🚀 ([@openlayers](https://github.com/openlayers))
* [#7702](https://github.com/openlayers/openlayers/pull/7702) - Update webpack-dev-server to the latest version 🚀 ([@openlayers](https://github.com/openlayers))
* [#7701](https://github.com/openlayers/openlayers/pull/7701) - Update sinon to the latest version 🚀 ([@openlayers](https://github.com/openlayers))
* [#7691](https://github.com/openlayers/openlayers/pull/7691) - Update webpack-dev-server to the latest version 🚀 ([@openlayers](https://github.com/openlayers))
* [#7688](https://github.com/openlayers/openlayers/pull/7688) - Update marked to the latest version 🚀 ([@openlayers](https://github.com/openlayers))
* [#7685](https://github.com/openlayers/openlayers/pull/7685) - Update sinon to the latest version 🚀 ([@openlayers](https://github.com/openlayers))
* [#7681](https://github.com/openlayers/openlayers/pull/7681) - Update eslint to the latest version 🚀 ([@openlayers](https://github.com/openlayers))
* [#7680](https://github.com/openlayers/openlayers/pull/7680) - Update webpack-dev-server to the latest version 🚀 ([@openlayers](https://github.com/openlayers))
* [#7667](https://github.com/openlayers/openlayers/pull/7667) - Update mocha to the latest version 🚀 ([@openlayers](https://github.com/openlayers))
* [#7656](https://github.com/openlayers/openlayers/pull/7656) - Update eslint to the latest version 🚀 ([@openlayers](https://github.com/openlayers))
* [#7655](https://github.com/openlayers/openlayers/pull/7655) - Update marked to the latest version 🚀 ([@openlayers](https://github.com/openlayers))
* [#7651](https://github.com/openlayers/openlayers/pull/7651) - Update karma to the latest version 🚀 ([@openlayers](https://github.com/openlayers))
* [#7647](https://github.com/openlayers/openlayers/pull/7647) - Update rbush to the latest version 🚀 ([@openlayers](https://github.com/openlayers))
* [#7596](https://github.com/openlayers/openlayers/pull/7596) - Update karma-webpack to the latest version 🚀 ([@openlayers](https://github.com/openlayers))
* [#7589](https://github.com/openlayers/openlayers/pull/7589) - chore(package): update karma-webpack to version 2.0.8 ([@openlayers](https://github.com/openlayers))
* [#7571](https://github.com/openlayers/openlayers/pull/7571) - Update eslint to the latest version 🚀 ([@openlayers](https://github.com/openlayers))
* [#7567](https://github.com/openlayers/openlayers/pull/7567) - Update fs-extra to the latest version 🚀 ([@openlayers](https://github.com/openlayers))
* [#7558](https://github.com/openlayers/openlayers/pull/7558) - Update eslint to the latest version 🚀 ([@openlayers](https://github.com/openlayers))
* [#7552](https://github.com/openlayers/openlayers/pull/7552) - Update jscodeshift to the latest version 🚀 ([@openlayers](https://github.com/openlayers))
* [#7551](https://github.com/openlayers/openlayers/pull/7551) - Update sinon to the latest version 🚀 ([@openlayers](https://github.com/openlayers))
</details>

View File

@@ -1,8 +0,0 @@
# 5.0.1
The v5.0.1 release helps reduce bundle sizes for bundlers that support the `"sideEffects": "false"`option in `package.json`, and fixes website documentation regarding cdn locations and debug build which has been replaced by source maps.
## Fixes
* [#8341](https://github.com/openlayers/openlayers/pull/8341) - Set sideEffects: false flag ([@ahocevar](https://github.com/ahocevar))
* [#8342](https://github.com/openlayers/openlayers/pull/8342) - Fix links and description in quickstart tutorial ([@ahocevar](https://github.com/ahocevar))

View File

@@ -1,7 +0,0 @@
# 5.0.2
The v5.0.2 release updates the package readme with new example projects.
## Fixes
* [#8332](https://github.com/openlayers/openlayers/pull/8343) - Starter projects ([@tschaub](https://github.com/tschaub))

View File

@@ -1,9 +0,0 @@
# 5.0.3
The v5.0.3 fixes a regression in the vector tile renderer and improves the built examples and release package.
## Fixes
* [#8364](https://github.com/openlayers/openlayers/pull/8364) - Make examples work in IE11 ([@ahocevar](https://github.com/ahocevar))
* [#8363](https://github.com/openlayers/openlayers/pull/8363) - Autogenerate src/ol/package.json ([@ahocevar](https://github.com/ahocevar))
* [#8371](https://github.com/openlayers/openlayers/pull/8371) - Skip rendering when there is no replay group ([@ahocevar](https://github.com/ahocevar))

View File

@@ -1,64 +0,0 @@
# v5.1.0
The 5.1 release adds a few new features a handful of fixes. You should be able to upgrade without any additional work. See the one note below regarding `null` geometry coordinates.
We're working toward type checking with TypeScript. This will complete our move away from using the Closure Compiler for type checking and compilation. We're excited about the improved experience for application developers and will highlight some of the benefit in upcoming releases.
### Upgrade Notes
#### Geometry constructor and `setCoordinates` no longer accept `null` coordinates
Geometries (`ol/geom/*`) now need to be constructed with valid coordinates (center for `ol/geom/Circle`) as first constructor argument. The same applies to the `setCoordinates()` (`setCenter() for `ol/geom/Circle`) method.
### New Features and Fixes
* [#8409](https://github.com/openlayers/openlayers/pull/8409) - Add abstract translate to ol/geom/Geometry ([@pjeweb](https://github.com/pjeweb))
* [#8405](https://github.com/openlayers/openlayers/pull/8405) - Minor type fixes ([@tschaub](https://github.com/tschaub))
* [#8401](https://github.com/openlayers/openlayers/pull/8401) - Make webpack's css loader work ([@ahocevar](https://github.com/ahocevar))
* [#8403](https://github.com/openlayers/openlayers/pull/8403) - Markdown links ([@tschaub](https://github.com/tschaub))
* [#8402](https://github.com/openlayers/openlayers/pull/8402) - Type fixes from the typescript checks ([@fredj](https://github.com/fredj))
* [#8400](https://github.com/openlayers/openlayers/pull/8400) - ESLint config update ([@tschaub](https://github.com/tschaub))
* [#8399](https://github.com/openlayers/openlayers/pull/8399) - Copy ol.css to build dir when building package ([@ahocevar](https://github.com/ahocevar))
* [#8397](https://github.com/openlayers/openlayers/pull/8397) - Update rollup ([@tschaub](https://github.com/tschaub))
* [#8385](https://github.com/openlayers/openlayers/pull/8385) - Use class syntax ([@openlayers](https://github.com/openlayers))
* [#8383](https://github.com/openlayers/openlayers/pull/8383) - style/Icon: Add `setAnchor()` method ([@Turbo87](https://github.com/Turbo87))
* [#8368](https://github.com/openlayers/openlayers/pull/8368) - Make render listeners work with image render mode ([@ahocevar](https://github.com/ahocevar))
* [#8376](https://github.com/openlayers/openlayers/pull/8376) - copy ZM values to polygon in makeRegular ([@virtualcitySYSTEMS](https://github.com/virtualcitySYSTEMS))
* [#8372](https://github.com/openlayers/openlayers/pull/8372) - Release v5.0.3 ([@openlayers](https://github.com/openlayers))
* [#8364](https://github.com/openlayers/openlayers/pull/8364) - Make examples work in IE11 ([@ahocevar](https://github.com/ahocevar))
* [#8363](https://github.com/openlayers/openlayers/pull/8363) - Autogenerate src/ol/package.json ([@ahocevar](https://github.com/ahocevar))
* [#8371](https://github.com/openlayers/openlayers/pull/8371) - Skip rendering when there is no replay group ([@ahocevar](https://github.com/ahocevar))
* [#8362](https://github.com/openlayers/openlayers/pull/8362) - Smart flat coordinates ([@ahocevar](https://github.com/ahocevar))
* [#8352](https://github.com/openlayers/openlayers/pull/8352) - Set `sideEffects` to `false` instead of `"false"` ([@tschaub](https://github.com/tschaub))
* [#8351](https://github.com/openlayers/openlayers/pull/8351) - Fix typo in release notes ([@ahocevar](https://github.com/ahocevar))
* [#8350](https://github.com/openlayers/openlayers/pull/8350) - Updates for v5.0.2 ([@ahocevar](https://github.com/ahocevar))
* [#8349](https://github.com/openlayers/openlayers/pull/8349) - Release v5.0.1 ([@ahocevar](https://github.com/ahocevar))
* [#8343](https://github.com/openlayers/openlayers/pull/8343) - Starter projects ([@tschaub](https://github.com/tschaub))
* [#8347](https://github.com/openlayers/openlayers/pull/8347) - Fix typos in release notes ([@ahocevar](https://github.com/ahocevar))
* [#8346](https://github.com/openlayers/openlayers/pull/8346) - Release v5.0.1 ([@openlayers](https://github.com/openlayers))
* [#8342](https://github.com/openlayers/openlayers/pull/8342) - Fix links and description in quickstart tutorial ([@ahocevar](https://github.com/ahocevar))
* [#8344](https://github.com/openlayers/openlayers/pull/8344) - Updated issue and pr templates ([@tschaub](https://github.com/tschaub))
* [#8341](https://github.com/openlayers/openlayers/pull/8341) - Set sideEffects: false flag ([@ahocevar](https://github.com/ahocevar))
* [#8333](https://github.com/openlayers/openlayers/pull/8333) - Fix wrong return type for readHref function ([@openlayers](https://github.com/openlayers))
* [#8329](https://github.com/openlayers/openlayers/pull/8329) - Better jsdoc typing ([@fredj](https://github.com/fredj))
* [#8319](https://github.com/openlayers/openlayers/pull/8319) - Remove reference to setProj4 function in documentation ([@fredj](https://github.com/fredj))
<details>
<summary>Dependency Updates</summary>
* [#8410](https://github.com/openlayers/openlayers/pull/8410) - Update rollup to the latest version 🚀 ([@openlayers](https://github.com/openlayers))
* [#8408](https://github.com/openlayers/openlayers/pull/8408) - Update rollup to the latest version 🚀 ([@openlayers](https://github.com/openlayers))
* [#8386](https://github.com/openlayers/openlayers/pull/8386) - Update fs-extra to the latest version 🚀 ([@openlayers](https://github.com/openlayers))
* [#8382](https://github.com/openlayers/openlayers/pull/8382) - Update webpack to the latest version 🚀 ([@openlayers](https://github.com/openlayers))
* [#8373](https://github.com/openlayers/openlayers/pull/8373) - Update webpack to the latest version 🚀 ([@openlayers](https://github.com/openlayers))
* [#8355](https://github.com/openlayers/openlayers/pull/8355) - Update recast to the latest version 🚀 ([@openlayers](https://github.com/openlayers))
* [#8354](https://github.com/openlayers/openlayers/pull/8354) - Update webpack to the latest version 🚀 ([@openlayers](https://github.com/openlayers))
* [#8348](https://github.com/openlayers/openlayers/pull/8348) - Update webpack to the latest version 🚀 ([@openlayers](https://github.com/openlayers))
* [#8338](https://github.com/openlayers/openlayers/pull/8338) - Update recast to the latest version 🚀 ([@openlayers](https://github.com/openlayers))
* [#8332](https://github.com/openlayers/openlayers/pull/8332) - Update webpack to the latest version 🚀 ([@openlayers](https://github.com/openlayers))
* [#8326](https://github.com/openlayers/openlayers/pull/8326) - Update webpack to the latest version 🚀 ([@openlayers](https://github.com/openlayers))
* [#8321](https://github.com/openlayers/openlayers/pull/8321) - Update rollup to the latest version 🚀 ([@openlayers](https://github.com/openlayers))
* [#8318](https://github.com/openlayers/openlayers/pull/8318) - Update webpack to the latest version 🚀 ([@openlayers](https://github.com/openlayers))
</details>

View File

@@ -1,3 +0,0 @@
# 5.1.1
The 5.1.1 release is a patch to include the readme in the package. See the [5.1.0 notes](https://github.com/openlayers/openlayers/releases/tag/v5.0.3) for detail on the 5.1 release.

View File

@@ -11,7 +11,6 @@
}, },
"plugins": [ "plugins": [
"config/jsdoc/info/api-plugin", "config/jsdoc/info/api-plugin",
"config/jsdoc/info/define-plugin", "config/jsdoc/info/module-plugin"
"config/jsdoc/info/virtual-plugin"
] ]
} }

View File

@@ -1,35 +0,0 @@
/**
* @fileoverview This plugin extracts info from boolean defines. This only
* handles boolean defines with the default value in the description. Default
* is assumed to be provided with something like "default is `true`" (case
* insensitive, with or without ticks).
*/
const DEFAULT_VALUE = /default\s+is\s+`?(true|false)`?/i;
/**
* Hook to define new tags.
* @param {Object} dictionary The tag dictionary.
*/
exports.defineTags = function(dictionary) {
dictionary.defineTag('define', {
canHaveType: true,
mustHaveValue: true,
onTagged: function(doclet, tag) {
const types = tag.value.type.names;
if (types.length === 1 && types[0] === 'boolean') {
const match = tag.value.description.match(DEFAULT_VALUE);
if (match) {
doclet.define = {
default: match[1] === 'true'
};
doclet.description = tag.value.description;
}
}
}
});
};

View File

@@ -0,0 +1,135 @@
const path = require('path');
const exportLookup = {};
const moduleLookup = {};
const MODULE_PATH = /^module:(.*)~(\w+)$/;
/**
* Add exports to modules.
*/
exports.handlers = {
symbolFound(event) {
const filename = event.filename;
const node = event.astnode;
let local, exported;
switch (node.type) {
case 'ExportDefaultDeclaration': {
exported = 'default';
switch (node.declaration.type) {
case 'Identifier': {
// export default foo;
local = node.declaration.name;
break;
}
case 'FunctionDeclaration': {
if (!node.declaration.id) {
// export default function() {}
local = '';
} else {
// export default function foo() {}
local = node.declaration.id.name;
}
break;
}
default: {
local = '';
}
}
break;
}
case 'ExportNamedDeclaration': {
if (!node.declaration) {
// export {foo}
// export {foo as bar}
// handled below in ExportSpecifier
return;
}
switch (node.declaration.type) {
case 'FunctionDeclaration': {
if (!node.declaration.id) {
throw new Error(`Expected function declaration to have an id in ${filename}`);
}
const name = node.declaration.id.name;
local = name;
exported = name;
break;
}
default: {
return;
}
}
break;
}
case 'ExportSpecifier': {
if (node.exported.type === 'Identifier') {
exported = node.exported.name;
if (node.local.type === 'Identifier') {
local = node.local.name;
if (node.parent.source) {
const resolved = path.resolve(path.dirname(filename), node.parent.source.value);
local = `module:${resolved}~${local}`;
}
} else {
local = '';
}
} else {
return;
}
break;
}
default: {
return;
}
}
if (!(filename in exportLookup)) {
exportLookup[filename] = {};
}
const exports = exportLookup[filename];
if (exports.hasOwnProperty(exported)) {
throw new Error(`Duplicate export {${local} as ${exported}} in ${filename}`);
}
exports[exported] = local;
},
newDoclet(event) {
const doclet = event.doclet;
if (doclet.kind === 'module') {
const filepath = path.join(doclet.meta.path, doclet.meta.filename);
if (filepath in moduleLookup) {
throw new Error(`Duplicate @module annotation in ${filepath}`);
}
moduleLookup[filepath] = doclet;
}
},
parseComplete(event) {
for (const filepath in moduleLookup) {
const doclet = moduleLookup[filepath];
const exports = exportLookup[filepath];
for (const exported in exports) {
const local = exports[exported];
const match = local.match(MODULE_PATH);
if (match) {
const filepath = match[1];
const mod = moduleLookup[filepath];
if (mod) {
exports[exported] = `module:${mod.name}~${match[2]}`;
}
}
}
doclet.exports = exports; // undefined if no exports
}
}
};

View File

@@ -1,6 +1,5 @@
/** /**
* @fileoverview Generates JSON output based on exportable symbols (those with * @fileoverview Generates JSON output based on exportable symbols.
* an api tag) and boolean defines (with a define tag and a default value).
*/ */
const assert = require('assert'); const assert = require('assert');
const path = require('path'); const path = require('path');
@@ -22,7 +21,7 @@ exports.publish = function(data, opts) {
return types; return types;
} }
// get all doclets with the "api" property or define (excluding events) // get all doclets with the "api" property
const classes = {}; const classes = {};
const docs = data( const docs = data(
[ [
@@ -34,7 +33,7 @@ exports.publish = function(data, opts) {
return true; return true;
} }
} }
return (typeof this.api == 'boolean' || return (this.kind === 'module' || typeof this.api == 'boolean' ||
this.meta && (/[\\\/]externs$/).test(this.meta.path)); this.meta && (/[\\\/]externs$/).test(this.meta.path));
} }
], ],
@@ -43,9 +42,9 @@ exports.publish = function(data, opts) {
// get symbols data, filter out those that are members of private classes // get symbols data, filter out those that are members of private classes
const symbols = []; const symbols = [];
const defines = [];
const typedefs = []; const typedefs = [];
const externs = []; const externs = [];
const modules = [];
let base = []; let base = [];
const augments = {}; const augments = {};
const symbolsByName = {}; const symbolsByName = {};
@@ -59,13 +58,11 @@ exports.publish = function(data, opts) {
} }
return include; return include;
}).forEach(function(doc) { }).forEach(function(doc) {
const isExterns = (/[\\\/]externs$/).test(doc.meta.path); if (doc.kind == 'module') {
if (doc.define) { modules.push({
defines.push({
name: doc.longname, name: doc.longname,
description: doc.description, exports: doc.exports || null,
path: path.join(doc.meta.path, doc.meta.filename), path: path.join(doc.meta.path, doc.meta.filename)
default: doc.define.default
}); });
} else if (doc.kind == 'typedef' || doc.isEnum === true) { } else if (doc.kind == 'typedef' || doc.isEnum === true) {
typedefs.push({ typedefs.push({
@@ -82,6 +79,9 @@ exports.publish = function(data, opts) {
if (doc.augments) { if (doc.augments) {
symbol.extends = doc.augments[0]; symbol.extends = doc.augments[0];
} }
if (doc.memberof) {
symbol.memberof = doc.memberof;
}
if (doc.virtual) { if (doc.virtual) {
symbol.virtual = true; symbol.virtual = true;
} }
@@ -92,7 +92,8 @@ exports.publish = function(data, opts) {
const params = []; const params = [];
doc.params.forEach(function(param) { doc.params.forEach(function(param) {
const paramInfo = { const paramInfo = {
name: param.name name: param.name,
description: param.description
}; };
params.push(paramInfo); params.push(paramInfo);
paramInfo.types = getTypes(param.type.names); paramInfo.types = getTypes(param.type.names);
@@ -126,7 +127,7 @@ exports.publish = function(data, opts) {
}); });
} }
const target = isExterns ? externs : (doc.api ? symbols : base); const target = doc.api ? symbols : base;
const existingSymbol = symbolsByName[symbol.name]; const existingSymbol = symbolsByName[symbol.name];
if (existingSymbol) { if (existingSymbol) {
const idx = target.indexOf(existingSymbol); const idx = target.indexOf(existingSymbol);
@@ -155,10 +156,10 @@ exports.publish = function(data, opts) {
process.stdout.write( process.stdout.write(
JSON.stringify({ JSON.stringify({
symbols: symbols, symbols: symbols,
defines: defines,
typedefs: typedefs, typedefs: typedefs,
externs: externs, externs: externs,
base: base base: base,
modules: modules
}, null, 2)); }, null, 2));
}); });

View File

@@ -1,16 +0,0 @@
/**
* Handle the interface and abstract annotations.
* @param {Object} dictionary The tag dictionary.
*/
exports.defineTags = function(dictionary) {
const classTag = dictionary.lookUp('class');
dictionary.defineTag('interface', {
mustHaveValue: false,
onTagged: function(doclet, tag) {
classTag.onTagged.apply(this, arguments);
doclet.virtual = true;
}
});
};

View File

@@ -7,7 +7,7 @@ import buble from 'rollup-plugin-buble';
import sourcemaps from 'rollup-plugin-sourcemaps'; import sourcemaps from 'rollup-plugin-sourcemaps';
export default { export default {
input: 'build/index.js', input: 'src/index.js',
output: [ output: [
{file: 'build/ol.js', format: 'iife', sourcemap: true} {file: 'build/ol.js', format: 'iife', sourcemap: true}
], ],

View File

@@ -5,11 +5,6 @@ layout: doc.hbs
# Quick Start # Quick Start
This primer shows you how to put a simple map on a web page.
**For production, we strongly recommend bundling the application together with its dependencies, as explained in the [Building an OpenLayers Application](./tutorials/bundle.html) tutorial.**
## Put a map on a page ## Put a map on a page
Below you'll find a complete working example. Create a new file, copy in the contents below, and open in a browser: Below you'll find a complete working example. Create a new file, copy in the contents below, and open in a browser:
@@ -18,14 +13,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.rawgit.com/openlayers/openlayers.github.io/master/en/{{ latest }}/css/ol.css" type="text/css"> <link rel="stylesheet" href="https://openlayers.org/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.rawgit.com/openlayers/openlayers.github.io/master/en/{{ latest }}/build/ol.js"></script> <script src="https://openlayers.org/en/{{ latest }}/build/ol.js" type="text/javascript"></script>
<title>OpenLayers example</title> <title>OpenLayers example</title>
</head> </head>
<body> <body>
@@ -60,7 +55,7 @@ To include a map a web page you will need 3 things:
### Include OpenLayers ### Include OpenLayers
```xml ```xml
<script src="https://cdn.rawgit.com/openlayers/openlayers.github.io/master/en/{{ latest }}/build/ol.js"></script> <script src="https://openlayers.org/en/{{ latest }}/build/ol.js" type="text/javascript"></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.

View File

@@ -1,49 +0,0 @@
---
title: Introduction
layout: doc.hbs
---
# Introduction
## Objectives
OpenLayers is a modular, high-performance, feature-packed library for displaying and interacting with maps and geospatial data.
The library comes with built-in support for a wide range of commercial and free image and vector tile sources, and the most popular open and proprietary vector data formats. With OpenLayers's map projection support, data can be in any projection.
## Public API
OpenLayers is available as [`ol` npm package](https://npmjs.com/package/ol), which provides all modules of the officially supported [API](../../apidoc).
## Renderers and Browser Support
By default, OpenLayers uses a performance optimized Canvas renderer. An experimental WebGL renderer (without text rendering support) is also avaialble.
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`.
The library is intended for use on both desktop/laptop and mobile devices, and supports pointer and touch interactions.
## Module and Naming Conventions
OpenLayers modules with CamelCase names provide classes as default exports, and may contain additional constants or functions as named exports:
```js
import Map from 'ol/Map';
import View from 'ol/View';
```
Class hierarchies grouped by their parent are provided in a subfolder of the package, e.g. `layer/`.
For convenience, these are also available as named exports, e.g.
```js
import {Map, View} from 'ol';
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:
```js
import {inherits} from 'ol';
import {fromLonLat} from 'ol/proj';
```

View File

@@ -0,0 +1,87 @@
---
title: Basic project setup using NPM and Browserify
layout: doc.hbs
---
# Introduction
When going beyond modifying existing examples you might be looking for a way to setup your own code with dependency management together with external dependencies like OpenLayers.
This tutorial serves as a suggested project setup using NPM and Browserify for the most basic needs. There are several other options, and in particular you might be interested in a more modern one (ES2015) [using Webpack with OpenLayers](https://gist.github.com/tschaub/79025aef325cd2837364400a105405b8).
## 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 using `npm init` and answer the questions asked.
Add OpenLayers as dependency to your application with `npm install --save ol`.
At this point you can ask NPM to add required development dependencies by running
```
npm install --save-dev cssify browserify cssify http-server uglify-js watchify
npm install --save-dev babelify babel-plugin-transform-es2015-modules-commonjs
```
We will be using `cssify` to include the css definitions required by OpenLayers in our bundle. `watchify`, `http-server` and `uglify-js` are used to monitor for changes and to build into a minified bundle. `babelify` and `babel-plugin-transform-es2015-modules-commonjs` are used to make the `ol` package, which was created using ES2015 modules, work with CommonJS.
## Application code and index.html
Place your application code in `index.js`. Here is a simple starting point:
```js
require('ol/ol.css');
var ol_Map = require('ol/map').default;
var ol_layer_Tile = require('ol/layer/tile').default;
var ol_source_OSM = require('ol/source/osm').default;
var ol_View = require('ol/view').default;
var map = new ol_Map({
target: 'map',
layers: [
new ol_layer_Tile({
source: new ol_source_OSM()
})
],
view: new ol_View({
center: [0, 0],
zoom: 0
})
});
```
You will also need an `ìndex.html` file that will use your bundle. Here is a simple example:
```html
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Using Browserify with OpenLayers</title>
<style>
#map {
width: 400px;
height: 250px;
}
</style>
</head>
<body>
<div id="map"></div>
<script src="bundle.js"></script>
</body>
</html>
```
## Creating a bundle
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
"scripts": {
"start": "watchify index.js -g cssify --outfile bundle.js & http-server",
"build": "browserify -g cssify index.js | uglifyjs --compress --output bundle.js"
}
```
Now to test your application open http://localhost:8080/ in your browser. `watchify` will update `bundle.js` whenever you change something. You simply need to reload the page in your browser to see the changes.
```
$ npm start
```
Note that `bundle.js` will contain your application code and all dependencies used in your application. From OpenLayers, it only contains the required components.

View File

@@ -1,93 +0,0 @@
---
title: Basic project setup using NPM and Parcel
layout: doc.hbs
---
# Introduction
Modern JavaScript works best when using and authoring modules. The recommended way of using OpenLayers is installing the [`ol`](https://npmjs.com/package/ol) package. This tutorial walks you through setting up a simple dev environment, which requires [node](https://nodejs.org) for everything to work.
In this tutorial, we will be using [Parcel](https://parceljs.org) to bundle our application. There are several other options, some of which are linked from the [README](https://npmjs.com/package/ol).
## 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 using `npm init` and answer the questions asked.
Add OpenLayers as dependency to your application with
npm install ol
At this point you can ask NPM to add required development dependencies by running
npm install --save-dev parcel-bundler
## Application code and index.html
Place your application code in `index.js`. Here is a simple starting point:
```js
import 'ol/ol.css';
import {Map, View} from 'ol';
import TileLayer from 'ol/layer/Tile';
import OSM from 'ol/source/OSM';
const map = new Map({
target: 'map',
layers: [
new TileLayer({
source: new OSM()
})
],
view: new View({
center: [0, 0],
zoom: 0
})
});
```
You will also need an `ìndex.html` file that will use your bundle. Here is a simple example:
```html
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Using Parcel with OpenLayers</title>
<style>
#map {
width: 400px;
height: 250px;
}
</style>
</head>
<body>
<div id="map"></div>
<script src="./index.js"></script>
</body>
</html>
```
## Creating a bundle
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
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"start": "parcel index.html",
"build": "parcel build --public-url . index.html"
}
```
That's it. Now to run your application, enter
npm start
in your console. To test your application, open http://localhost:1234/ in your browser. Whenever you change something, the page will reload automatically to show the result of your changes.
Note that a single JavaScript file with all your application code and all dependencies used in your application has been created. From the OpenLayers package, it only contains the required components.
To create a production bundle of your application, simply type
npm run build
and copy the `dist/` folder to your production server.

View File

@@ -6,58 +6,48 @@ layout: doc.hbs
# Basic Concepts # Basic Concepts
## Map ## Map
The core component of OpenLayers is the map (`Map`). It is rendered to a `target` container (e.g. a `div` element on the web page that contains the map). All map properties can either be configured at construction time, or by using setter methods, e.g. `setTarget()`. The core component of OpenLayers is the map (`ol.Map`). It is rendered to a `target` container (e.g. a `div` element on the web page that contains the map). All map properties can either be configured at construction time, or by using setter methods, e.g. `setTarget()`.
```xml ```xml
<div id="map" style="width: 100%, height: 400px"></div> <div id="map" style="width: 100%, height: 400px"></div>
<script> <script>
import Map from 'ol/Map'; var map = new ol.Map({target: 'map'});
var map = new Map({target: 'map'});
</script> </script>
``` ```
## View ## View
`Map` is not responsible for things like center, zoom level and projection of the map. Instead, these are properties of a `View` instance. `ol.Map` is not responsible for things like center, zoom level and projection of the map. Instead, these are properties of an `ol.View` instance.
```js ```js
import View from 'ol/View'; map.setView(new ol.View({
map.setView(new View({
center: [0, 0], center: [0, 0],
zoom: 2 zoom: 2
})); }));
``` ```
A `View` also has a `projection`. The projection determines the coordinate system of the `center` and the units for map resolution calculations. If not specified (like in the above snippet), the default projection is Spherical Mercator (EPSG:3857), with meters as map units. An `ol.View` also has a `projection`. The projection determines the coordinate system of the `center` and the units for map resolution calculations. If not specified (like in the above snippet), the default projection is Spherical Mercator (EPSG:3857), with meters as map units.
The `zoom` option is a convenient way to specify the map resolution. The available zoom levels are determined by `maxZoom` (default: 28), `zoomFactor` (default: 2) and `maxResolution` (default is calculated in such a way that the projection's validity extent fits in a 256x256 pixel tile). Starting at zoom level 0 with a resolution of `maxResolution` units per pixel, subsequent zoom levels are calculated by dividing the previous zoom level's resolution by `zoomFactor`, until zoom level `maxZoom` is reached. The `zoom` option is a convenient way to specify the map resolution. The available zoom levels are determined by `maxZoom` (default: 28), `zoomFactor` (default: 2) and `maxResolution` (default is calculated in such a way that the projection's validity extent fits in a 256x256 pixel tile). Starting at zoom level 0 with a resolution of `maxResolution` units per pixel, subsequent zoom levels are calculated by dividing the previous zoom level's resolution by `zoomFactor`, until zoom level `maxZoom` is reached.
## Source ## Source
To get remote data for a layer, OpenLayers uses `source/Source` subclasses. These are available for free and commercial map tile services like OpenStreetMap or Bing, for OGC sources like WMS or WMTS, and for vector data in formats like GeoJSON or KML. To get remote data for a layer, OpenLayers uses `ol.source.Source` subclasses. These are available for free and commercial map tile services like OpenStreetMap or Bing, for OGC sources like WMS or WMTS, and for vector data in formats like GeoJSON or KML.
```js ```js
import OSM from 'ol/source/OSM'; var osmSource = new ol.source.OSM();
var osmSource = OSM();
``` ```
## Layer ## Layer
A layer is a visual representation of data from a `source`. OpenLayers has four basic types of layers: `layer/Tile`, `layer/Image`, `layer/Vector` and `layer/VectorTile`. A layer is a visual representation of data from a `source`. OpenLayers has three basic types of layers: `ol.layer.Tile`, `ol.layer.Image` and `ol.layer.Vector`.
`layer/Tile` is for layer sources that provide pre-rendered, tiled images in grids that are organized by zoom levels for specific resolutions. `ol.layer.Tile` is for layer sources that provide pre-rendered, tiled images in grids that are organized by zoom levels for specific resolutions.
`layer/Image` is for server rendered images that are available for arbitrary extents and resolutions. `ol.layer.Image` is for server rendered images that are available for arbitrary extents and resolutions.
`layer/Vector` is for vector data that is rendered client-side. `ol.layer.Vector` is for vector data that is rendered client-side.
`layer/VectorTile` is for tiled vector data that is rendered client-side.
```js ```js
import TileLayer from 'ol/layer/Tile'; var osmLayer = new ol.layer.Tile({source: osmSource});
var osmLayer = new TileLayer({source: osmSource});
map.addLayer(osmLayer); map.addLayer(osmLayer);
``` ```
@@ -69,16 +59,11 @@ The above snippets can be conflated to a self contained map configuration with v
```xml ```xml
<div id="map" style="width: 100%, height: 400px"></div> <div id="map" style="width: 100%, height: 400px"></div>
<script> <script>
import Map from 'ol/Map'; new ol.Map({
import View from 'ol/View';
import OSM from 'ol/source/OSM';
import TileLayer from 'ol/source/Tile';
new Map({
layers: [ layers: [
new TileLayer({source: new ol.source.OSM()}) new ol.layer.Tile({source: new ol.source.OSM()})
], ],
view: new View({ view: new ol.View({
center: [0, 0], center: [0, 0],
zoom: 2 zoom: 2
}), }),

View File

@@ -5,7 +5,8 @@ layout: doc.hbs
# Tutorials # Tutorials
* [Building an OpenLayers Application](bundle.html) * [Introduction to OpenLayers](introduction.html)
* [Basic Concepts](concepts.html) * [Basic Concepts](concepts.html)
* [Some Background on OpenLayers](background.html) * [Create Custom Builds](custom-builds.html)
* [Bundle Application and OpenLayers using Browserify](browserify.html)
* [Raster Reprojection](raster-reprojection.html) * [Raster Reprojection](raster-reprojection.html)

View File

@@ -0,0 +1,39 @@
---
title: Introduction
layout: doc.hbs
---
# Introduction
## Objectives
With version 3, the OpenLayers web mapping library was fundamentally redesigned. The widely used version 2 dates from the early days of Javascript development, and was increasingly showing its age. So it has been rewritten from the ground up to use modern design patterns.
The initial release aims to support much of the functionality provided by version 2, with support for a wide range of commercial and free tile sources, and the most popular open-source vector data formats. As with version 2, data can be in any projection. The initial release also adds some additional functionality, such as the ability to easily rotate or animate maps.
It is also designed such that major new features, such as displaying 3D maps, or using WebGL to quickly display large vector data sets, can be added in later releases.
## Public API
Using the advanced optimizations of the Closure Compiler means that properties and methods are renamed &ndash; `longMeaningfulName` might become `xB` &ndash; and so are effectively unusable in applications using the library. To be usable, they have to be explicitly `exported`. This means the exported names, those not renamed, effectively become the public API of the library. These __exportable__ properties and methods are marked in the source, and documented in the [API docs](../../apidoc). This is the officially supported API of the library. A build containing all these exportable names is known as a __full build__. A hosted version of this is available, which can be used by any application.
## Custom Builds
Unlike in, say, Node, where a module's exports are fixed in the source, with Closure Compiler, exports can be defined at compile time. This makes it easy to create builds that are customized to the needs of a particular site or application: a __custom build__ only exports those properties and methods needed by the site or application. As the full build is large, and will probably become larger as new features are added to the API, it's recommended that sites create a custom build for production software.
## Renderers and Browser Support
The library currently includes two renderers: Canvas and WebGL. Both of them support both raster data from tile/image servers, and vector data; WebGL however does not support labels. Clearly only those browsers that [support Canvas](http://caniuse.com/canvas) can use the Canvas renderer. Equally, the WebGL renderer can only be used on those devices and [browsers](http://caniuse.com/webgl) that support WebGL.
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`.
The library is intended for use on both desktop/laptop and mobile devices.
## Objects and Naming Conventions
The top-level namespace is `ol` (basically, `var ol = {};`). Subdivisions of this are:
* further namespaces, such as `ol.layer`; these have a lower-case initial
* simple objects containing static properties and methods, such as `ol.easing`; these also have a lower-case initial
* types, which have an upper-case initial. These are mainly 'classes', which here means a constructor function with prototypal inheritance, such as `ol.Map` or `ol.layer.Vector` (the Vector class within the layer namespace). There are however other, simpler, types, such as `ol.Extent`, which is an array.
Class namespaces, such as `ol.layer` have a base class type with the same name, such as `ol.layer.Layer`. These are mainly abstract classes, from which the other subclasses inherit.
Source files are similarly organised, with a directory for each class namespace. Names are however all lower-case, for example, `ol/layer/vector.js`.
OpenLayers follows the convention that the names of private properties and methods, that is, those that are not part of the API, end in an underscore. In general, instance properties are private and accessed using accessors.

View File

@@ -10,22 +10,18 @@ Transformation of the map projections of the image happens directly in a web bro
The view in any Proj4js supported coordinate reference system is possible and previously incompatible layers can now be combined and overlaid. The view in any Proj4js supported coordinate reference system is possible and previously incompatible layers can now be combined and overlaid.
# Usage # Usage
The API usage is very simple. Just specify proper projection (e.g. using [EPSG](https://epsg.io) code) on `ol/View`: The API usage is very simple. Just specify proper projection (using [EPSG](https://epsg.io) code) on `ol.View`:
```js ``` javascript
import {Map, View} from `ol`; var map = new ol.Map({
import TileLayer from `ol/layer/Tile`;
import TileWMS from `ol/source/TileWMS`;
var map = new Map({
target: 'map', target: 'map',
view: new View({ view: new ol.View({
projection: 'EPSG:3857', //HERE IS THE VIEW PROJECTION projection: 'EPSG:3857', //HERE IS THE VIEW PROJECTION
center: [0, 0], center: [0, 0],
zoom: 2 zoom: 2
}), }),
layers: [ layers: [
new TileLayer({ new ol.layer.Tile({
source: new TileWMS({ source: new ol.source.TileWMS({
projection: 'EPSG:4326', //HERE IS THE DATA SOURCE PROJECTION projection: 'EPSG:4326', //HERE IS THE DATA SOURCE PROJECTION
url: 'http://demo.boundlessgeo.com/geoserver/wms', url: 'http://demo.boundlessgeo.com/geoserver/wms',
params: { params: {
@@ -36,7 +32,7 @@ var map = new Map({
] ]
}); });
``` ```
If a source (based on `ol/source/TileImage` or `ol/source/Image`) has a projection different from the current `ol/View`s projection then the reprojection happens automatically under the hood. If a source (based on `ol.source.TileImage` or `ol.source.Image`) has a projection different from the current `ol.View`s projection then the reprojection happens automatically under the hood.
### Examples ### Examples
- [Raster reprojection demo](https://openlayers.org/en/master/examples/reprojection.html) - [Raster reprojection demo](https://openlayers.org/en/master/examples/reprojection.html)
@@ -45,29 +41,26 @@ If a source (based on `ol/source/TileImage` or `ol/source/Image`) has a projecti
- [Image reprojection](https://openlayers.org/en/master/examples/reprojection-image.html) - [Image reprojection](https://openlayers.org/en/master/examples/reprojection-image.html)
### Custom projection ### Custom projection
The easiest way to use a custom projection is to add the [Proj4js](http://proj4js.org/) library to your project and then define the projection using a proj4 definition string. It can be installed with The easiest way to use a custom projection is to add the [Proj4js](http://proj4js.org/) library to your project and then define the projection using a proj4 definition string.
npm install proj4
Following example shows definition of a [British National Grid](https://epsg.io/27700): Following example shows definition of a [British National Grid](https://epsg.io/27700):
```js ``` html
import proj4 from 'proj4'; <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/proj4js/2.4.4/proj4.js"></script>
import {get as getProjection, register} from 'ol/proj'; ```
``` javascript
proj4.defs('EPSG:27700', '+proj=tmerc +lat_0=49 +lon_0=-2 +k=0.9996012717 ' + proj4.defs('EPSG:27700', '+proj=tmerc +lat_0=49 +lon_0=-2 +k=0.9996012717 ' +
'+x_0=400000 +y_0=-100000 +ellps=airy ' + '+x_0=400000 +y_0=-100000 +ellps=airy ' +
'+towgs84=446.448,-125.157,542.06,0.15,0.247,0.842,-20.489 ' + '+towgs84=446.448,-125.157,542.06,0.15,0.247,0.842,-20.489 ' +
'+units=m +no_defs'); '+units=m +no_defs');
register(proj4); var proj27700 = ol.proj.get('EPSG:27700');
var proj27700 = getProjection('EPSG:27700');
proj27700.setExtent([0, 0, 700000, 1300000]); proj27700.setExtent([0, 0, 700000, 1300000]);
``` ```
### Change of the view projection ### Change of the view projection
To switch the projection used to display the map you have to set a new `ol/View` with selected projection on the `ol/Map`: To switch the projection used to display the map you have to set a new `ol.View` with selected projection on the `ol.Map`:
``` javascript ``` javascript
map.setView(new View({ map.setView(new ol.View({
projection: 'EPSG:27700', projection: 'EPSG:27700',
center: [400000, 650000], center: [400000, 650000],
zoom: 4 zoom: 4
@@ -76,16 +69,16 @@ map.setView(new View({
## TileGrid and Extents ## TileGrid and Extents
When reprojection is needed, new tiles (in the target projection) are under the hood created from the original source tiles. When reprojection is needed, new tiles (in the target projection) are under the hood created from the original source tiles.
The TileGrid of the reprojected tiles is by default internally constructed using `ol/tilegrid~getForProjection(projection)`. The TileGrid of the reprojected tiles is by default internally constructed using `ol.tilegrid.getForProjection(projection)`.
The projection should have extent defined (see above) for this to work properly. The projection should have extent defined (see above) for this to work properly.
Alternatively, a custom target TileGrid can be constructed manually and set on the source instance using `ol/source/TileImage~setTileGridForProjection(projection, tilegrid)`. Alternatively, a custom target TileGrid can be constructed manually and set on the source instance using `ol.source.TileImage#setTileGridForProjection(projection, tilegrid)`.
This TileGrid will then be used when reprojecting to the specified projection instead of creating the default one. This TileGrid will then be used when reprojecting to the specified projection instead of creating the default one.
In certain cases, this can be used to optimize performance (by tweaking tile sizes) or visual quality (by specifying resolutions). In certain cases, this can be used to optimize performance (by tweaking tile sizes) or visual quality (by specifying resolutions).
# How it works # How it works
The reprojection process is based on triangles -- the target raster is divided into a limited number of triangles with vertices transformed using `ol/proj` capabilities ([proj4js](http://proj4js.org/) is usually utilized to define custom transformations). The reprojection process is based on triangles -- the target raster is divided into a limited number of triangles with vertices transformed using `ol.proj` capabilities ([proj4js](http://proj4js.org/) is usually utilized to define custom transformations).
The reprojection of pixels inside the triangle is approximated with an affine transformation (with rendering hardware-accelerated by the canvas 2d context): The reprojection of pixels inside the triangle is approximated with an affine transformation (with rendering hardware-accelerated by the canvas 2d context):
<img src="raster-reprojection-resources/how-it-works.jpg" alt="How it works" width="600" /> <img src="raster-reprojection-resources/how-it-works.jpg" alt="How it works" width="600" />
@@ -109,6 +102,10 @@ For debugging, rendering of the reprojection edges can be enabled by `ol.source.
# Advanced # Advanced
### Disabling reprojection
In case you are creating a custom build of OpenLayers and do not need the reprojection code, you can reduce the build size by setting `ol.ENABLE_RASTER_REPROJECTION` to `false`, which completely disables the reprojection support.
See [Custom builds](custom-builds.html#defines) tutorial on how to do this.
### Triangulation precision threshold ### Triangulation precision threshold
The default [triangulation error threshold](#dynamic-triangulation) in pixels is given by `ERROR_THRESHOLD` (0.5 pixel). The default [triangulation error threshold](#dynamic-triangulation) in pixels is given by `ERROR_THRESHOLD` (0.5 pixel).
In case a different threshold needs to be defined for different sources, the `reprojectionErrorThreshold` option can be passed when constructing the tile image source. In case a different threshold needs to be defined for different sources, the `reprojectionErrorThreshold` option can be passed when constructing the tile image source.
@@ -129,7 +126,7 @@ Setting such a limit is demonstrated in the [reprojection demo example](https://
### Resolution calculation ### Resolution calculation
When determining source tiles to load, the ideal source resolution needs to be calculated. When determining source tiles to load, the ideal source resolution needs to be calculated.
The `ol/reproj~calculateSourceResolution(sourceProj, targetProj, targetCenter, targetResolution)` function calculates the ideal value in order to achieve pixel mapping as close as possible to 1:1 during reprojection, which is then used to select proper zoom level from the source. The `ol.reproj.calculateSourceResolution(sourceProj, targetProj, targetCenter, targetResolution)` function calculates the ideal value in order to achieve pixel mapping as close as possible to 1:1 during reprojection, which is then used to select proper zoom level from the source.
It is, however, generally not practical to use the same source zoom level for the whole target zoom level -- different projections can have significantly different resolutions in different parts of the world (e.g. polar regions in EPSG:3857 vs EPSG:4326) and enforcing a single resolution for the whole zoom level would result in some tiles being scaled up/down, possibly requiring a huge number of source tiles to be loaded. It is, however, generally not practical to use the same source zoom level for the whole target zoom level -- different projections can have significantly different resolutions in different parts of the world (e.g. polar regions in EPSG:3857 vs EPSG:4326) and enforcing a single resolution for the whole zoom level would result in some tiles being scaled up/down, possibly requiring a huge number of source tiles to be loaded.
Therefore, the resolution mapping is calculated separately for each reprojected tile (in the middle of the tile extent). Therefore, the resolution mapping is calculated separately for each reprojected tile (in the middle of the tile extent).

View File

@@ -1,4 +1,4 @@
import {inherits} from '../src/ol/util.js'; import {inherits} from '../src/ol/index.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 {defaults as defaultControls, Control} from '../src/ol/control.js'; import {defaults as defaultControls, Control} from '../src/ol/control.js';

View File

@@ -1,4 +1,4 @@
import {inherits} from '../src/ol/util.js'; import {inherits} from '../src/ol/index.js';
import Feature from '../src/ol/Feature.js'; import Feature from '../src/ol/Feature.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';
@@ -29,7 +29,7 @@ app.Drag = function() {
}); });
/** /**
* @type {module:ol/pixel~Pixel} * @type {module:ol~Pixel}
* @private * @private
*/ */
this.coordinate_ = null; this.coordinate_ = null;

View File

@@ -71,9 +71,9 @@ map.on('click', function(evt) {
const coordinates = feature.getGeometry().getCoordinates(); const coordinates = feature.getGeometry().getCoordinates();
popup.setPosition(coordinates); popup.setPosition(coordinates);
$(element).popover({ $(element).popover({
placement: 'top', 'placement': 'top',
html: true, 'html': true,
content: feature.get('name') 'content': feature.get('name')
}); });
$(element).popover('show'); $(element).popover('show');
} else { } else {

View File

@@ -51,11 +51,12 @@ map.on('click', function(evt) {
$(element).popover('destroy'); $(element).popover('destroy');
popup.setPosition(coordinate); popup.setPosition(coordinate);
// the keys are quoted to prevent renaming in ADVANCED mode.
$(element).popover({ $(element).popover({
placement: 'top', 'placement': 'top',
animation: false, 'animation': false,
html: true, 'html': true,
content: '<p>The location you clicked was:</p><code>' + hdms + '</code>' 'content': '<p>The location you clicked was:</p><code>' + hdms + '</code>'
}); });
$(element).popover('show'); $(element).popover('show');
}); });

View File

@@ -7,7 +7,7 @@
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.4.0/css/font-awesome.min.css" type="text/css"> <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.4.0/css/font-awesome.min.css" type="text/css">
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css" type="text/css"> <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css" type="text/css">
<link rel="stylesheet" href="./resources/prism/prism.css" type="text/css"> <link rel="stylesheet" href="./resources/prism/prism.css" type="text/css">
<link rel="stylesheet" href="./css/ol.css" type="text/css"> <link rel="stylesheet" href="../css/ol.css" type="text/css">
<link rel="stylesheet" href="./resources/layout.css" type="text/css"> <link rel="stylesheet" href="./resources/layout.css" type="text/css">
{{{ extraHead.local }}} {{{ extraHead.local }}}
{{{ css.tag }}} {{{ css.tag }}}

View File

@@ -1,11 +1,11 @@
--- ---
layout: example.html layout: example.html
title: UTFGrid title: Tiled UTFGrid
shortdesc: This example shows how to read data from a UTFGrid source. shortdesc: This example shows how to read data from a TileUTFGrid layer.
docs: > docs: >
<p>Point to a country to see its name and flag.</p> <p>Point to a country to see its name and flag.</p>
Tiles made with [TileMill](http://tilemill.com). Hosting on MapBox.com or with open-source [TileServer](https://github.com/klokantech/tileserver-php/). Tiles made with [TileMill](http://tilemill.com). Hosting on MapBox.com or with open-source [TileServer](https://github.com/klokantech/tileserver-php/).
tags: "utfgrid, tilejson" tags: "utfgrid, tileutfgrid, tilejson"
cloak: cloak:
- key: pk.eyJ1IjoiYWhvY2V2YXIiLCJhIjoiRk1kMWZaSSJ9.E5BkluenyWQMsBLsuByrmg - key: pk.eyJ1IjoiYWhvY2V2YXIiLCJhIjoiRk1kMWZaSSJ9.E5BkluenyWQMsBLsuByrmg
value: Your Mapbox access token from http://mapbox.com/ here value: Your Mapbox access token from http://mapbox.com/ here

View File

@@ -3,7 +3,7 @@ import Overlay from '../src/ol/Overlay.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 TileJSON from '../src/ol/source/TileJSON.js'; import TileJSON from '../src/ol/source/TileJSON.js';
import UTFGrid from '../src/ol/source/UTFGrid.js'; import UTFGrid from '../src/ol/source/TileUTFGrid.js';
const key = 'pk.eyJ1IjoiYWhvY2V2YXIiLCJhIjoiRk1kMWZaSSJ9.E5BkluenyWQMsBLsuByrmg'; const key = 'pk.eyJ1IjoiYWhvY2V2YXIiLCJhIjoiRk1kMWZaSSJ9.E5BkluenyWQMsBLsuByrmg';

View File

@@ -18,18 +18,6 @@ module.exports = {
context: src, context: src,
target: 'web', target: 'web',
entry: entry, entry: entry,
module: {
rules: [{
use: {
loader: 'buble-loader'
},
test: /\.js$/,
include: [
path.join(__dirname, '..', '..', 'src'),
path.join(__dirname, '..')
]
}]
},
optimization: { optimization: {
runtimeChunk: { runtimeChunk: {
name: 'common' name: 'common'
@@ -46,7 +34,7 @@ module.exports = {
common: 'common' common: 'common'
}), }),
new CopyPlugin([ new CopyPlugin([
{from: '../src/ol/ol.css', to: 'css'}, {from: '../css', to: 'css'},
{from: 'data', to: 'data'}, {from: 'data', to: 'data'},
{from: 'resources', to: 'resources'}, {from: 'resources', to: 'resources'},
{from: 'Jugl.js', to: 'Jugl.js'}, {from: 'Jugl.js', to: 'Jugl.js'},

View File

@@ -64,20 +64,20 @@ function createWordIndex(exampleData) {
/** /**
* Gets the source for the chunk that matches the jsPath * Gets the source for the chunk that matches the jsPath
* @param {Object} chunk Chunk. * @param {Object} chunk Chunk.
* @param {string} jsName Name of the file. * @param {string} jsPath Path of the file.
* @return {string} The source. * @return {string} The source.
*/ */
function getJsSource(chunk, jsName) { function getJsSource(chunk, jsPath) {
let jsSource; let jsSource;
for (let i = 0, ii = chunk.modules.length; i < ii; ++i) { for (let i = 0, ii = chunk.modules.length; i < ii; ++i) {
const module = chunk.modules[i]; const module = chunk.modules[i];
if (module.modules) { if (module.modules) {
jsSource = getJsSource(module, jsName); jsSource = getJsSource(module, jsPath);
if (jsSource) { if (jsSource) {
return jsSource; return jsSource;
} }
} }
if (module.identifier.endsWith(jsName)) { if (module.identifier == jsPath) {
return module.source; return module.source;
} }
} }
@@ -151,7 +151,8 @@ ExampleBuilder.prototype.render = async function(dir, chunk) {
// add in script tag // add in script tag
const jsName = `${name}.js`; const jsName = `${name}.js`;
let jsSource = getJsSource(chunk, path.join('.', jsName)); const jsPath = path.join(dir, jsName);
let jsSource = getJsSource(chunk, jsPath);
jsSource = jsSource.replace(/'\.\.\/src\//g, '\''); jsSource = jsSource.replace(/'\.\.\/src\//g, '\'');
if (data.cloak) { if (data.cloak) {
for (const entry of data.cloak) { for (const entry of data.cloak) {

165
externs/bingmaps.js Normal file
View File

@@ -0,0 +1,165 @@
/**
* @externs
*/
/**
* @constructor
*/
var BingMapsCoverageArea = function() {};
/**
* @type {Array.<number>}
*/
BingMapsCoverageArea.prototype.bbox;
/**
* @type {number}
*/
BingMapsCoverageArea.prototype.zoomMax;
/**
* @type {number}
*/
BingMapsCoverageArea.prototype.zoomMin;
/**
* @constructor
*/
var BingMapsImageryProvider = function() {};
/**
* @type {string}
*/
BingMapsImageryProvider.prototype.attribution;
/**
* @type {Array.<BingMapsCoverageArea>}
*/
BingMapsImageryProvider.prototype.coverageAreas;
/**
* @constructor
*/
var BingMapsImageryMetadataResponse = function() {};
/**
* @type {string}
*/
BingMapsImageryMetadataResponse.prototype.authenticationResultCode;
/**
* @type {string}
*/
BingMapsImageryMetadataResponse.prototype.copyright;
/**
* @type {Array.<BingMapsResourceSet>}
*/
BingMapsImageryMetadataResponse.prototype.resourceSets;
/**
* @type {number}
*/
BingMapsImageryMetadataResponse.prototype.statusCode;
/**
* @type {string}
*/
BingMapsImageryMetadataResponse.prototype.statusDescription;
/**
* @type {string}
*/
BingMapsImageryMetadataResponse.prototype.traceId;
/**
* @constructor
*/
var BingMapsResource = function() {};
/**
* @type {number}
*/
BingMapsResource.prototype.imageHeight;
/**
* @type {string}
*/
BingMapsResource.prototype.imageUrl;
/**
* @type {Array.<string>}
*/
BingMapsResource.prototype.imageUrlSubdomains;
/**
* @type {number}
*/
BingMapsResource.prototype.imageWidth;
/**
* @type {Array.<BingMapsImageryProvider>}
*/
BingMapsResource.prototype.imageryProviders;
/**
* @type {Object}
*/
BingMapsResource.prototype.vintageEnd;
/**
* @type {Object}
*/
BingMapsResource.prototype.vintageStart;
/**
* @type {number}
*/
BingMapsResource.prototype.zoomMax;
/**
* @type {number}
*/
BingMapsResource.prototype.zoomMin;
/**
* @constructor
*/
var BingMapsResourceSet = function() {};
/**
* @type {number}
*/
BingMapsResourceSet.prototype.estimatedTotal;
/**
* @type {Array.<BingMapsResource>}
*/
BingMapsResourceSet.prototype.resources;

20
externs/bootstrap.js vendored Normal file
View File

@@ -0,0 +1,20 @@
/**
* @fileoverview Externs for bootstrap.js
*
* @see http://twitter.github.com/bootstrap/javascript.html
* @externs
*/
/**
* @param {string|Object.<string,*>=} opt_option
* @return {!jQuery}
*/
jQuery.prototype.popover = function(opt_option) {};
/**
* @param {string|Object.<string,*>=} opt_option
* @return {!jQuery}
*/
jQuery.prototype.tooltip = function(opt_option) {};

34
externs/cartodb.js Normal file
View File

@@ -0,0 +1,34 @@
/**
* @externs
*/
/**
* @constructor
*/
var CartoDBLayerInfo = function() {};
/**
* @type {string}
*/
CartoDBLayerInfo.prototype.layergroupid;
/**
* @type {string}
*/
CartoDBLayerInfo.prototype.updated_at;
/**
* @type {Object}
*/
CartoDBLayerInfo.prototype.metadata;
/**
* @type {{http: string, https: string}}
*/
CartoDBLayerInfo.prototype.cdn_url;

View File

@@ -0,0 +1,9 @@
/**
* @fileoverview Definitions for externs that are either missing or incorrect
* in the current release version of the closure compiler we use.
*
* The entries must be removed once they are available/correct in the
* version we use.
*
* @externs
*/

198
externs/esrijson.js Normal file
View File

@@ -0,0 +1,198 @@
/**
* @fileoverview Externs for EsriJSON.
* @see http://resources.arcgis.com/en/help/rest/apiref/geometry.html
* @externs
*/
/**
* @constructor
*/
var EsriJSONObject = function() {};
/**
* @type {!EsriJSONCRS}
*/
EsriJSONObject.prototype.spatialReference;
/**
* @constructor
*/
var EsriJSONCRS = function() {};
/**
* CRS well know identifier.
* @type {number}
*/
EsriJSONCRS.prototype.wkid;
/**
* @constructor
* @extends {EsriJSONObject}
*/
var EsriJSONPoint = function() {};
/**
* M value of point.
* @type {number}
*/
EsriJSONPoint.prototype.m;
/**
* X coordinate of point.
* @type {number}
*/
EsriJSONPoint.prototype.x;
/**
* Y coordinate of point.
* @type {number}
*/
EsriJSONPoint.prototype.y;
/**
* Z coordinate of point.
* @type {number|undefined}
*/
EsriJSONPoint.prototype.z;
/**
* @constructor
* @extends {EsriJSONObject}
*/
var EsriJSONMultipoint = function() {};
/**
* Does Multipoint have M values?
* @type {boolean|undefined}
*/
EsriJSONMultipoint.prototype.hasM;
/**
* Does Multipoint have Z values?
* @type {boolean|undefined}
*/
EsriJSONMultipoint.prototype.hasZ;
/**
* @type {!Array.<!Array.<number>>}
*/
EsriJSONMultipoint.prototype.points;
/**
* @constructor
* @extends {EsriJSONObject}
*/
var EsriJSONPolyline = function() {};
/**
* Does Polyline have M values?
* @type {boolean|undefined}
*/
EsriJSONPolyline.prototype.hasM;
/**
* Does Polyline have Z values?
* @type {boolean|undefined}
*/
EsriJSONPolyline.prototype.hasZ;
/**
* @type {!Array.<!Array.<!Array.<number>>>}
*/
EsriJSONPolyline.prototype.paths;
/**
* @constructor
* @extends {EsriJSONObject}
*/
var EsriJSONPolygon = function() {};
/**
* Does Polygon have M values?
* @type {boolean|undefined}
*/
EsriJSONPolygon.prototype.hasM;
/**
* Does Polygon have Z values?
* @type {boolean|undefined}
*/
EsriJSONPolygon.prototype.hasZ;
/**
* @type {!Array.<!Array.<!Array.<number>>>}
*/
EsriJSONPolygon.prototype.rings;
/**
* @typedef {(EsriJSONPoint|EsriJSONMultipoint|EsriJSONPolyline|
EsriJSONPolygon)}
*/
var EsriJSONGeometry;
/**
* @constructor
* @extends {EsriJSONObject}
*/
var EsriJSONFeature = function() {};
/**
* @type {EsriJSONGeometry}
*/
EsriJSONFeature.prototype.geometry;
/**
* @type {Object.<string, *>}
*/
EsriJSONFeature.prototype.attributes;
/**
* @constructor
* @extends {EsriJSONObject}
*/
var EsriJSONFeatureCollection = function() {};
/**
* @type {!Array.<EsriJSONFeature>}
*/
EsriJSONFeatureCollection.prototype.features;
/**
* The name of the attribute that contains ids.
* @type {string}
*/
EsriJSONFeatureCollection.prototype.objectIdFieldName;

23
externs/example.js Normal file
View File

@@ -0,0 +1,23 @@
/**
* @type {Object}
*/
let common;
/**
* @param {string=} opt_default Default renderer.
* @return {string} Renderer type.
*/
common.getRendererFromQueryString = function(opt_default) {};
/**
* @param {function(new:ol.style.Style, module:ol/style/Style~Options=)} Style Style constructor.
* @param {function(new:ol.style.Fill, module:ol/style/Fill~Options=)} Fill Fill constructor.
* @param {function(new:ol.style.Stroke, module:ol/style/Stroke~Options=)} Stroke Stroke constructor.
* @param {function(new:ol.style.Icon, module:ol/style/Icon~Options=)} Icon Icon constructor.
* @param {function(new:ol.style.Text, module:ol/style/Text~Options=)} Text Text constructor.
* @return {function((module:ol/Feature~Feature|ol.render.Feature), number):
* Array.<ol.style.Style>}
*/
const createMapboxStreetsV6Style = function(Style, Fill, Stroke, Icon, Text) {};

155
externs/geojson.js Normal file
View File

@@ -0,0 +1,155 @@
/**
* @fileoverview Externs for GeoJSON.
* @see http://geojson.org/geojson-spec.html
* @externs
*/
/**
* @constructor
*/
var GeoJSONObject = function() {};
/**
* @type {!Array.<number>|undefined}
*/
GeoJSONObject.prototype.bbox;
/**
* @type {string}
*/
GeoJSONObject.prototype.type;
/**
* @type {!GeoJSONCRS|undefined}
*/
GeoJSONObject.prototype.crs;
/**
* @constructor
*/
var GeoJSONCRS = function() {};
/**
* CRS type. One of `link` or `name`.
* @type {string}
*/
GeoJSONCRS.prototype.type;
/**
* @type {!GeoJSONCRSName|!GeoJSONLink}
*/
GeoJSONCRS.prototype.properties;
/**
* @constructor
*/
var GeoJSONCRSName = function() {};
/**
* @type {string}
*/
GeoJSONCRSName.prototype.name;
/**
* @constructor
* @extends {GeoJSONObject}
*/
var GeoJSONGeometry = function() {};
/**
* @type {!Array.<number>|!Array.<!Array.<number>>|
* !Array.<!Array.<!Array.<number>>>}
*/
GeoJSONGeometry.prototype.coordinates;
/**
* @constructor
* @extends {GeoJSONObject}
*/
var GeoJSONGeometryCollection = function() {};
/**
* @type {!Array.<GeoJSONGeometry>}
*/
GeoJSONGeometryCollection.prototype.geometries;
/**
* @constructor
* @extends {GeoJSONObject}
*/
var GeoJSONFeature = function() {};
/**
* @type {GeoJSONGeometry|GeoJSONGeometryCollection}
*/
GeoJSONFeature.prototype.geometry;
/**
* @type {number|string|undefined}
*/
GeoJSONFeature.prototype.id;
/**
* @type {Object.<string, *>}
*/
GeoJSONFeature.prototype.properties;
/**
* @type {string|undefined}
*/
GeoJSONFeature.prototype.geometry_name;
/**
* @constructor
* @extends {GeoJSONObject}
*/
var GeoJSONFeatureCollection = function() {};
/**
* @type {!Array.<GeoJSONFeature>}
*/
GeoJSONFeatureCollection.prototype.features;
/**
* @constructor
*/
var GeoJSONLink = function() {};
/**
* @type {string}
*/
GeoJSONLink.prototype.href;
/**
* @type {string}
*/
GeoJSONLink.prototype.type;

1828
externs/jquery-1.9.js vendored Normal file

File diff suppressed because it is too large Load Diff

37
externs/proj4js.js Normal file
View File

@@ -0,0 +1,37 @@
/**
* @externs
* @see http://proj4js.org/
*/
/**
* @constructor
*/
var Proj4 = function() {};
/**
* @param {ol.Coordinate} coordinates
* @return {ol.Coordinate}
*/
Proj4.prototype.forward = function(coordinates) {};
/**
* @param {ol.Coordinate} coordinates
* @return {ol.Coordinate}
*/
Proj4.prototype.inverse = function(coordinates) {};
/**
* @param {string} name
* @param {(string|Object)=} opt_def
* @return {undefined|Object.<string, Object.<{axis: string, units: string, to_meter: number}>>}
*/
Proj4.prototype.defs = function(name, opt_def) {};
/**
* @type {Proj4}
*/
var proj4;

3
externs/readme.md Normal file
View File

@@ -0,0 +1,3 @@
# Externs
TODO: remove this directory

120
externs/tilejson.js Normal file
View File

@@ -0,0 +1,120 @@
/**
* @externs
* @see https://github.com/mapbox/tilejson-spec
* @see https://github.com/mapbox/utfgrid-spec
*/
/**
* @constructor
*/
var TileJSON = function() {};
/**
* @type {string}
*/
TileJSON.prototype.tilejson;
/**
* @type {string|undefined}
*/
TileJSON.prototype.name;
/**
* @type {string|undefined}
*/
TileJSON.prototype.description;
/**
* @type {string|undefined}
*/
TileJSON.prototype.version;
/**
* @type {string|undefined}
*/
TileJSON.prototype.attribution;
/**
* @type {string|undefined}
*/
TileJSON.prototype.template;
/**
* @type {string|undefined}
*/
TileJSON.prototype.legend;
/**
* @type {string|undefined}
*/
TileJSON.prototype.scheme;
/**
* @type {!Array.<string>}
*/
TileJSON.prototype.tiles;
/**
* @type {!Array.<string>|undefined}
*/
TileJSON.prototype.grids;
/**
* @type {number|undefined}
*/
TileJSON.prototype.minzoom;
/**
* @type {number|undefined}
*/
TileJSON.prototype.maxzoom;
/**
* @type {!Array.<number>|undefined}
*/
TileJSON.prototype.bounds;
/**
* @type {!Array.<number>|undefined}
*/
TileJSON.prototype.center;
/**
* @constructor
*/
var UTFGridJSON = function() {};
/**
* @type {!Array.<string>}
*/
UTFGridJSON.prototype.grid;
/**
* @type {!Array.<string>}
*/
UTFGridJSON.prototype.keys;
/**
* @type {!Object.<string, Object>|undefined}
*/
UTFGridJSON.prototype.data;

177
externs/topojson.js Normal file
View File

@@ -0,0 +1,177 @@
/**
* @fileoverview Externs for TopoJSON.
* @see https://github.com/mbostock/topojson/wiki/Specification
* @externs
*/
/**
* @constructor
*/
var TopoJSONTopology = function() {};
/**
* @type {string}
*/
TopoJSONTopology.prototype.type;
/**
* @type {TopoJSONTransform|undefined}
*/
TopoJSONTopology.prototype.transform;
/**
* @type {Object.<string, (TopoJSONGeometry|TopoJSONGeometryCollection)>}
*/
TopoJSONTopology.prototype.objects;
/**
* @type {!Array.<Array.<Array.<number>>>}
*/
TopoJSONTopology.prototype.arcs;
/**
* @constructor
*/
var TopoJSONTransform = function() {};
/**
* @type {!Array.<number>}
*/
TopoJSONTransform.prototype.scale;
/**
* @type {!Array.<number>}
*/
TopoJSONTransform.prototype.translate;
/**
* @constructor
*/
var TopoJSONGeometry = function() {};
/**
* @type {string}
*/
TopoJSONGeometry.prototype.type;
/**
* @type {string|number|undefined}
*/
TopoJSONGeometry.prototype.id;
/**
* @type {Object.<string, *>|undefined}
*/
TopoJSONGeometry.prototype.properties;
/**
* @constructor
*/
var TopoJSONGeometryCollection = function() {};
/**
* @type {Array.<TopoJSONGeometry>}
*/
TopoJSONGeometryCollection.prototype.geometries;
/**
* @constructor
* @extends {TopoJSONGeometry}
*/
var TopoJSONPoint = function() {};
/**
* @type {!Array.<number>}
*/
TopoJSONPoint.prototype.coordinates;
/**
* @constructor
* @extends {TopoJSONGeometry}
*/
var TopoJSONLineString = function() {};
/**
* @type {!Array.<number>}
*/
TopoJSONLineString.prototype.arcs;
/**
* @constructor
* @extends {TopoJSONGeometry}
*/
var TopoJSONPolygon = function() {};
/**
* @type {!Array.<Array.<number>>}
*/
TopoJSONPolygon.prototype.arcs;
/**
* @constructor
* @extends {TopoJSONGeometry}
*/
var TopoJSONMultiPoint = function() {};
/**
* @type {!Array.<Array.<number>>}
*/
TopoJSONMultiPoint.prototype.coordinates;
/**
* @constructor
* @extends {TopoJSONGeometry}
*/
var TopoJSONMultiLineString = function() {};
/**
* @type {!Array.<Array.<number>>}
*/
TopoJSONMultiLineString.prototype.arcs;
/**
* @constructor
* @extends {TopoJSONGeometry}
*/
var TopoJSONMultiPolygon = function() {};
/**
* @type {!Array.<Array.<Array.<number>>>}
*/
TopoJSONMultiPolygon.prototype.arcs;

View File

@@ -1,29 +1,32 @@
{ {
"name": "ol", "name": "openlayers",
"version": "5.1.1", "version": "5.0.0-beta.12",
"description": "OpenLayers mapping library", "description": "Build tools and sources for developing OpenLayers based mapping applications",
"keywords": [ "keywords": [
"map", "map",
"mapping", "mapping",
"ol" "ol"
], ],
"private": true,
"homepage": "https://openlayers.org/", "homepage": "https://openlayers.org/",
"scripts": { "scripts": {
"lint": "eslint tasks test src/ol examples config", "lint": "eslint tasks test src/ol examples config",
"pretest": "npm run lint", "pretest": "npm run lint",
"posttest": "npm run typecheck",
"test": "npm run karma -- --single-run", "test": "npm run karma -- --single-run",
"karma": "karma start test/karma.config.js", "karma": "karma start test/karma.config.js",
"serve-examples": "webpack-dev-server --config examples/webpack/config.js --mode development --watch", "serve-examples": "mkdir -p build/examples && webpack --config examples/webpack/config.js --mode development --watch & serve build/examples",
"build-examples": "webpack --config examples/webpack/config.js --mode production", "build-examples": "webpack --config examples/webpack/config.js --mode production",
"build-package": "npm run transpile && npm run copy-css && node tasks/prepare-package && cp README.md build/ol", "build-index": "node tasks/generate-index",
"build-index": "npm run build-package && node tasks/generate-index", "build-site": "node tasks/generate-info.js && cd site && npm install && npm run build",
"build-legacy": "rm -rf build && npm run build-index && rollup --config config/rollup.js && cleancss --source-map src/ol/ol.css -o build/ol.css", "prebuild": "npm run build-index",
"copy-css": "cp src/ol/ol.css build/ol/ol.css", "build": "rollup --config config/rollup.js",
"transpile": "rm -rf build/ol && mkdir -p build && buble --input src/ol --output build/ol --no modules --sourcemap", "presrc-closure": "npm run prebuild",
"src-closure": "node tasks/transform-types",
"pretypecheck": "npm run src-closure",
"typecheck": "node tasks/typecheck",
"apidoc": "jsdoc config/jsdoc/api/index.md -c config/jsdoc/api/conf.json -P package.json -d build/apidoc" "apidoc": "jsdoc config/jsdoc/api/index.md -c config/jsdoc/api/conf.json -P package.json -d build/apidoc"
}, },
"main": "index.js", "main": "src/ol/index.js",
"repository": { "repository": {
"type": "git", "type": "git",
"url": "git://github.com/openlayers/openlayers.git" "url": "git://github.com/openlayers/openlayers.git"
@@ -32,24 +35,33 @@
"bugs": { "bugs": {
"url": "https://github.com/openlayers/openlayers/issues" "url": "https://github.com/openlayers/openlayers/issues"
}, },
"browser": "dist/ol.js",
"style": [
"css/ol.css"
],
"dependencies": { "dependencies": {
"babel-eslint": "^8.2.3",
"pbf": "3.1.0", "pbf": "3.1.0",
"pixelworks": "1.1.0", "pixelworks": "1.1.0",
"rbush": "2.0.2" "rbush": "2.0.2"
}, },
"devDependencies": { "devDependencies": {
"buble": "^0.19.3", "babel-core": "^6.26.3",
"buble-loader": "^0.5.1", "babel-plugin-jsdoc-closure": "1.5.1",
"chaikin-smooth": "^1.0.4", "chaikin-smooth": "^1.0.4",
"clean-css-cli": "4.1.11", "clean-css-cli": "4.1.11",
"copy-webpack-plugin": "^4.4.1", "copy-webpack-plugin": "^4.4.1",
"coveralls": "3.0.1", "coveralls": "3.0.1",
"eslint": "5.0.1", "eslint": "4.19.1",
"eslint-config-openlayers": "^11.0.0", "eslint-config-openlayers": "^9.2.0",
"eslint-config-prettier": "^2.9.0",
"eslint-plugin-prettier": "^2.6.0",
"eslint-plugin-react": "^7.7.0",
"expect.js": "0.3.1", "expect.js": "0.3.1",
"front-matter": "^2.1.2", "front-matter": "^2.1.2",
"fs-extra": "^7.0.0", "fs-extra": "^6.0.0",
"glob": "^7.1.2", "glob": "^7.1.2",
"google-closure-compiler": "20180506.0.0",
"handlebars": "4.0.11", "handlebars": "4.0.11",
"istanbul": "0.4.5", "istanbul": "0.4.5",
"jquery": "3.3.1", "jquery": "3.3.1",
@@ -66,25 +78,25 @@
"mocha": "5.2.0", "mocha": "5.2.0",
"mustache": "^2.3.0", "mustache": "^2.3.0",
"pixelmatch": "^4.0.2", "pixelmatch": "^4.0.2",
"prettier": "^1.12.0",
"proj4": "2.4.4", "proj4": "2.4.4",
"rollup": "0.63.4", "recast": "0.15.0",
"rollup": "0.60.2",
"rollup-plugin-buble": "0.19.2", "rollup-plugin-buble": "0.19.2",
"rollup-plugin-commonjs": "9.1.3", "rollup-plugin-commonjs": "9.1.3",
"rollup-plugin-node-resolve": "3.3.0", "rollup-plugin-node-resolve": "3.3.0",
"rollup-plugin-sourcemaps": "0.4.2", "rollup-plugin-sourcemaps": "0.4.2",
"rollup-plugin-uglify": "4.0.0", "rollup-plugin-uglify": "4.0.0",
"serve": "^8.1.1",
"sinon": "^6.0.0", "sinon": "^6.0.0",
"uglifyjs-webpack-plugin": "^1.2.5", "uglifyjs-webpack-plugin": "^1.2.5",
"url-polyfill": "^1.0.13", "url-polyfill": "^1.0.13",
"walk": "^2.3.9", "walk": "^2.3.9",
"webpack": "4.16.1", "webpack": "4.12.0",
"webpack-cli": "^3.0.8", "webpack-cli": "^3.0.3"
"webpack-dev-server": "^3.1.4"
}, },
"eslintConfig": { "eslintConfig": {
"extends": "openlayers" "extends": "openlayers"
}, },
"sideEffects": [ "sideEffects": false
"ol.css"
]
} }

1
site/.babelrc Normal file
View File

@@ -0,0 +1 @@
{}

7
site/.eslintrc Normal file
View File

@@ -0,0 +1,7 @@
{
"extends": "openlayers/react",
"parser": "babel-eslint",
"globals": {
"graphql": false
}
}

4
site/.gitignore vendored Normal file
View File

@@ -0,0 +1,4 @@
/node_modules/
/.cache/
/public/
/build/

30
site/gatsby-config.js Normal file
View File

@@ -0,0 +1,30 @@
const path = require('path');
const typography = require('./src/utils/typography');
module.exports = {
plugins: [
{
resolve: 'gatsby-plugin-typography',
options: {
pathToConfigModule: 'src/utils/typography.js'
}
},
'gatsby-plugin-emotion',
{
resolve: 'gatsby-source-filesystem',
options: {
name: 'examples',
path: path.join(__dirname, 'src', 'examples')
}
},
{
resolve: 'examples',
options: {
sourceInstanceName: 'examples',
baseCss: typography.toString()
}
},
'gatsby-transformer-remark',
'gatsby-plugin-react-next'
]
};

3
site/gatsby-node.js Normal file
View File

@@ -0,0 +1,3 @@
// exports.onPreBuild = () => {
// // TODO: empty public folder
// };

15861
site/package-lock.json generated Normal file

File diff suppressed because it is too large Load Diff

32
site/package.json Normal file
View File

@@ -0,0 +1,32 @@
{
"name": "@ol/site",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"start": "gatsby develop",
"build": "gatsby build"
},
"devDependencies": {
"emotion": "^9.1.3",
"emotion-server": "^9.1.3",
"gatsby": "1.9.250",
"gatsby-link": "1.6.40",
"gatsby-plugin-emotion": "^1.1.16",
"gatsby-plugin-react-helmet": "2.0.10",
"gatsby-plugin-react-next": "^1.0.11",
"gatsby-plugin-typography": "1.7.18",
"gatsby-source-filesystem": "1.5.31",
"gatsby-transformer-remark": "^1.7.40",
"prop-types": "15.6.1",
"react-emotion": "^9.1.3",
"react-helmet": "5.2.0",
"react-markdown": "^3.3.2",
"rollup": "^0.58.1",
"rollup-plugin-commonjs": "^9.1.0",
"rollup-plugin-node-resolve": "^3.3.0",
"string-template": "^1.0.0",
"typography-plugin-code": "^0.16.11",
"typography-theme-noriega": "^0.15.10"
}
}

View File

@@ -0,0 +1,95 @@
import {object} from 'prop-types';
import ExampleList from './ExampleList';
import React, {Component, Fragment} from 'react';
import styled from 'react-emotion';
const Wrapper = styled('div')({
display: 'flex'
});
const Sidebar = styled('div')({
marginRight: '1em'
});
const Content = styled('div')({
minWidth: 300,
flexGrow: 1
});
const Embed = styled('iframe')({
margin: 0,
padding: 0,
height: 350,
width: '100%'
});
const Aside = styled('aside')({
textAlign: 'right',
fontSize: '0.75em'
});
const Block = styled('pre')({
overflow: 'auto'
});
class Example extends Component {
render() {
const example = this.props.data.sitePage.context;
return (
<Wrapper>
<Sidebar>
<ExampleList active={example.slug} />
</Sidebar>
<Content>
<h1>{example.frontmatter.title}</h1>
<Embed src={example.embedUrl} frameBorder="0" />
<Aside>
<p>
<a href={example.embedUrl}>stand-alone version</a>
</p>
</Aside>
<h3>script</h3>
<Block>
<code>{example.js}</code>
</Block>
<h3>markup</h3>
<Block>
<code>{example.html}</code>
</Block>
{example.css && (
<Fragment>
<h3>style</h3>
<Block>
<code>{example.css}</code>
</Block>
</Fragment>
)}
</Content>
</Wrapper>
);
}
}
Example.propTypes = {
data: object.isRequired
};
export const query = graphql`
query ExampleQuery($slug: String!) {
sitePage(context: {slug: {eq: $slug}}) {
context {
slug
frontmatter {
title
}
embedUrl
html
js
css
}
}
}
`;
export default Example;

View File

@@ -0,0 +1,54 @@
import Link from 'gatsby-link';
import React, {Component} from 'react';
import styled from 'react-emotion';
const Wrapper = styled('div')({
minWidth: '10em'
});
const List = styled('ul')({
margin: 0,
listStyle: 'none'
});
class ExampleList extends Component {
constructor(props) {
super(props);
this.state = {
index: null
};
}
componentDidMount() {
fetch('../index.json')
.then(response => response.json())
.then(index => {
this.setState({index});
});
}
renderList() {
const index = this.state.index;
if (!index) {
return '...';
}
const list = [];
for (const id in index) {
const example = index[id];
list.push(
<li key={id}>
<Link to={example.slug}>{example.title}</Link>
</li>
);
}
return <List>{list}</List>;
}
render() {
return <Wrapper>{this.renderList()}</Wrapper>;
}
}
export default ExampleList;

View File

@@ -0,0 +1,27 @@
<!DOCTYPE html>
<html>
<head>
<meta charSet="utf-8">
<title>{title}</title>
<style>{baseCss}</style>
<style>{olCss}</style>
<style>
html, body {
height: 100%;
overflow: hidden;
}
#map {
position: absolute;
top: 0;
left: 0;
height: 100%;
width: 100%;
}
</style>
<style>{exampleCss}</style>
</head>
<body>
{html}
<script type="module" src="{mainBundleUrl}"></script>
</body>
</html>

View File

@@ -0,0 +1,197 @@
const path = require('path');
const {createFilePath} = require('gatsby-source-filesystem');
const rollup = require('rollup');
const resolve = require('rollup-plugin-node-resolve');
const common = require('rollup-plugin-commonjs');
const fse = require('fs-extra');
const compileTemplate = require('string-template/compile');
let rollupCache;
const rollupPlugins = [resolve(), common()];
let olCss;
async function getOLCss() {
if (olCss) {
return olCss;
}
const cssPath = path.join(__dirname, '..', '..', '..', 'css', 'ol.css');
olCss = await fse.readFile(cssPath, {encoding: 'utf8'});
return olCss;
}
let embedTemplate;
async function getEmbedTemplate() {
if (embedTemplate) {
return embedTemplate;
}
const embedPath = path.join(__dirname, 'embed.html');
const src = await fse.readFile(embedPath, {encoding: 'utf8'});
embedTemplate = compileTemplate(src);
return embedTemplate;
}
exports.onCreateNode = ({node, getNode, boundActionCreators}) => {
const {createNodeField} = boundActionCreators;
if (node.internal.type === 'MarkdownRemark') {
const slug = createFilePath({node, getNode});
createNodeField({
node,
name: 'slug',
value: `/examples${slug}` // TODO: get this from options
});
}
};
exports.createPages = async (
{graphql, boundActionCreators},
{sourceInstanceName, baseCss = ''}
) => {
const {createPage, createRedirect} = boundActionCreators;
createRedirect({
fromPath: `/examples/`,
isPermanent: true,
redirectInBrowser: true,
toPath: `/examples/map/`
});
const {data} = await graphql(`
{
allFile(
filter: {sourceInstanceName: {eq: "${sourceInstanceName}"}, extension: {ne: ""}}
) {
edges {
node {
base
name
extension
absolutePath
childMarkdownRemark {
frontmatter {
title
}
fields {
slug
}
html
}
}
}
}
}
`);
const rollupInputs = [];
const examples = {};
data.allFile.edges.forEach(({node}) => {
const name = node.name;
if (!(name in examples)) {
examples[name] = {};
}
examples[name][node.extension] = node;
if (node.extension === 'js') {
rollupInputs.push(node.absolutePath);
}
});
const bundle = await rollup.rollup({
input: rollupInputs,
plugins: rollupPlugins,
experimentalCodeSplitting: true,
cache: rollupCache
});
const embedDirName = 'example-embeds';
const embedDir = path.join(__dirname, '..', '..', 'public', embedDirName);
const exampleDir = path.join(__dirname, '..', '..', 'public', 'examples');
rollupCache = await bundle.write({
format: 'es',
sourcemap: true,
dir: embedDir
});
const writes = [];
const index = {};
for (const name in examples) {
const node = examples[name].md;
if (!node) {
throw new Error(`Missing ${name}.md`);
}
const markdownNode = node.childMarkdownRemark;
if (!markdownNode) {
throw new Error(`Expected a MarkdownRemark node for ${name}`);
}
const mainBundleUrl = `${name}.js`;
const bundleInfo = rollupCache[mainBundleUrl];
if (!bundleInfo) {
throw new Error(`Expected a js bundle for ${name}`);
}
const jsNode = examples[name].js;
if (!jsNode) {
throw new Error(`Missing ${name}.js`);
}
const moduleIndex = bundleInfo.map.sources.findIndex(
filepath => path.resolve(filepath) === jsNode.absolutePath
);
if (moduleIndex < 0) {
throw new Error(`Could not find ${node.absolutePath} in module list`);
}
const source = bundleInfo.map.sourcesContent[moduleIndex];
if (!source) {
throw new Error(`Could not find source for ${jsNode.absolutePath}`);
}
let exampleCss = '';
const cssNode = examples[name].css;
if (cssNode) {
exampleCss = await fse.readFile(cssNode.absolutePath, {encoding: 'utf8'});
await fse.writeFile(path.join(embedDir, cssNode.base), exampleCss);
}
const embedTemplate = await getEmbedTemplate();
const embed = embedTemplate({
title: markdownNode.frontmatter.title,
baseCss,
olCss: await getOLCss(),
exampleCss,
html: markdownNode.html,
mainBundleUrl
});
const embedName = `${name}.html`;
writes.push(fse.writeFile(path.join(embedDir, embedName), embed));
const slug = markdownNode.fields.slug;
index[name] = {
title: markdownNode.frontmatter.title,
slug
};
createPage({
path: slug,
component: path.join(__dirname, 'components', 'Example.js'),
context: {
slug,
frontmatter: markdownNode.frontmatter,
embedUrl: `/${embedDirName}/${embedName}`,
html: markdownNode.html,
js: source.replace(/'\.\.\/\.\.\/\.\.\/src\/(.*?)\.js/g, "'$1"),
css: exampleCss
}
});
}
await fse.ensureDir(exampleDir);
writes.push(
fse.writeFile(path.join(exampleDir, 'index.json'), JSON.stringify(index))
);
await Promise.all(writes);
};

View File

@@ -0,0 +1 @@
// no-op

View File

@@ -0,0 +1,4 @@
{
"name": "examples",
"main": "index.js"
}

View File

@@ -0,0 +1,76 @@
import React, {Component, Fragment} from 'react';
import {string, array} from 'prop-types';
import Markdown from 'react-markdown';
import {slugify, getShortName, getShortModuleName} from '../../utils/doc';
class Class extends Component {
static propTypes = {
name: string.isRequired,
description: string,
params: array,
exported: string
};
renderArguments() {
if (!this.props.params) {
return null;
}
return (
<Fragment>
<h4>Arguments</h4>
<ul>{this.props.params.map(this.renderArgument)}</ul>
</Fragment>
);
}
renderArgument(arg) {
return (
<li key={arg.name}>
<code>{arg.name}</code>: {arg.description}
</li>
);
}
render() {
const name = this.props.name;
const shortName = getShortName(name);
const moduleName = getShortModuleName(name);
const slug = slugify(name);
const exported = this.props.exported;
let importSyntax;
if (exported) {
if (exported === 'default') {
importSyntax = `import ${shortName} from '${moduleName}';\n\n`;
} else if (exported !== shortName) {
importSyntax = `import {${exported} as ${shortName}} from '${moduleName}';\n\n`;
} else {
importSyntax = `import {${exported}} from '${moduleName}';\n\n`;
}
}
const params = this.props.params || [];
const usage = `new ${shortName}(${params
.map(param => param.name)
.join(', ')});`;
const description = this.props.description || '';
return (
<Fragment>
<a name={slug} href={`#${slug}`} />
<pre>
<code>
{importSyntax}
{usage}
</code>
</pre>
<Markdown source={description} />
{this.renderArguments()}
</Fragment>
);
}
}
export default Class;

View File

@@ -0,0 +1,76 @@
import React, {Component, Fragment} from 'react';
import {string, array} from 'prop-types';
import Markdown from 'react-markdown';
import {slugify, getShortName, getShortModuleName} from '../../utils/doc';
class Func extends Component {
static propTypes = {
name: string.isRequired,
description: string,
params: array,
exported: string
};
renderArguments() {
if (!this.props.params) {
return null;
}
return (
<Fragment>
<h4>Arguments</h4>
<ul>{this.props.params.map(this.renderArgument)}</ul>
</Fragment>
);
}
renderArgument(arg) {
return (
<li key={arg.name}>
<code>{arg.name}</code>: {arg.description}
</li>
);
}
render() {
const name = this.props.name;
const shortName = getShortName(name);
const moduleName = getShortModuleName(name);
const slug = slugify(name);
const exported = this.props.exported;
let importSyntax;
if (exported) {
if (exported === 'default') {
importSyntax = `import ${shortName} from '${moduleName}';\n\n`;
} else if (exported !== shortName) {
importSyntax = `import {${exported} as ${shortName}} from '${moduleName}';\n\n`;
} else {
importSyntax = `import {${exported}} from '${moduleName}';\n\n`;
}
}
const params = this.props.params || [];
const usage = `${shortName}(${params
.map(param => param.name)
.join(', ')});`;
const description = this.props.description || '';
return (
<Fragment>
<a name={slug} href={`#${slug}`} />
<pre>
<code>
{importSyntax}
{usage}
</code>
</pre>
<Markdown source={description} />
{this.renderArguments()}
</Fragment>
);
}
}
export default Func;

View File

@@ -0,0 +1,57 @@
import React, {Component, Fragment} from 'react';
import {string, array} from 'prop-types';
import {slugify, getShortModuleName} from '../../utils/doc';
import Func from './Func';
import Class from './Class';
class Module extends Component {
static propTypes = {
name: string.isRequired,
classes: array.isRequired,
functions: array.isRequired
};
renderClasses() {
if (this.props.classes.length === 0) {
return null;
}
return (
<Fragment>
<h3>Classes</h3>
{this.props.classes.map(cls => <Class key={cls.name} {...cls} />)}
</Fragment>
);
}
renderFuncs() {
if (this.props.functions.length === 0) {
return null;
}
return (
<Fragment>
<h3>Functions</h3>
{this.props.functions.map(func => <Func key={func.name} {...func} />)}
</Fragment>
);
}
render() {
const name = this.props.name;
const slug = slugify(name);
return (
<section>
<a name={slug} href={`#${slug}`}>
<h1>
<code>{getShortModuleName(name)}</code>
</h1>
</a>
{this.renderClasses()}
{this.renderFuncs()}
</section>
);
}
}
export default Module;

View File

@@ -0,0 +1,10 @@
{
"rules": {
"no-unused-vars": [
"error",
{
"varsIgnorePattern": "^map"
}
]
}
}

View File

@@ -0,0 +1,39 @@
import Map from '../../../src/ol/Map.js';
import View from '../../../src/ol/View.js';
import GeoJSON from '../../../src/ol/format/GeoJSON.js';
import {
Tile as TileLayer,
Vector as VectorLayer
} from '../../../src/ol/layer.js';
import {BingMaps, Vector as VectorSource} from '../../../src/ol/source.js';
import {Style, Stroke} from '../../../src/ol/style.js';
const map = new Map({
layers: [
new TileLayer({
source: new BingMaps({
key: 'As1HiMj1PvLPlqc_gtM7AqZfBL8ZL3VrjaS3zIb22Uvb9WKhuJObROC-qUpa81U5',
imagerySet: 'Aerial'
})
}),
new VectorLayer({
source: new VectorSource({
format: new GeoJSON(),
url:
'https://raw.githubusercontent.com/johan/world.geo.json/master/countries.geo.json'
}),
opacity: 0.5,
style: new Style({
stroke: new Stroke({
width: 1.25,
color: 'lightgrey'
})
})
})
],
target: 'map',
view: new View({
center: [0, 0],
zoom: 2
})
});

View File

@@ -0,0 +1,10 @@
---
title: Multiple Layers
shortdesc: Using layers to compose a map.
docs: >
Layers control how data is rendered on a map. In this example, a `Vector` layer displays GeoJSON over tiles from a `Tile` layer.
cloak:
- key: As1HiMj1PvLPlqc_gtM7AqZfBL8ZL3VrjaS3zIb22Uvb9WKhuJObROC-qUpa81U5
value: Your Bing Maps Key from http://www.bingmapsportal.com/ here
---
<div id="map"></div>

17
site/src/examples/map.js Normal file
View File

@@ -0,0 +1,17 @@
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';
const map = new Map({
layers: [
new TileLayer({
source: new OSM()
})
],
target: 'map',
view: new View({
center: [0, 0],
zoom: 1
})
});

7
site/src/examples/map.md Normal file
View File

@@ -0,0 +1,7 @@
---
title: My First Map
shortdesc: Example of a map with a single layer.
docs: >
A map with an OSM source.
---
<div id="map"></div>

44
site/src/layouts/index.js Normal file
View File

@@ -0,0 +1,44 @@
import {func} from 'prop-types';
import Link from 'gatsby-link';
import React from 'react';
import styled from 'react-emotion';
const Page = styled('div')({
margin: '1em auto',
maxWidth: '960px'
});
const Header = styled('header')({
display: 'flex',
alignItems: 'baseline',
padding: '0 2em',
marginBottom: '2em',
'& h1': {
margin: '0 auto 0 0'
}
});
const Main = styled('main')({
padding: '0 2em'
});
const Layout = ({children}) => (
<Page>
<Header>
<h1>
<Link to="/">OpenLayers</Link>
</h1>
<div>
<Link to="/docs/">docs</Link>&nbsp;
<Link to="/examples/">examples</Link>
</div>
</Header>
<Main>{children()}</Main>
</Page>
);
Layout.propTypes = {
children: func.isRequired
};
export default Layout;

19
site/src/pages/docs.js Normal file
View File

@@ -0,0 +1,19 @@
import React, {Component, Fragment} from 'react';
import Module from '../components/doc/Module';
import {getModules} from '../utils/doc';
import info from '../../../build/info.json';
const modules = getModules(info);
class Docs extends Component {
render() {
return (
<Fragment>
{modules.map(mod => <Module key={mod.name} {...mod} />)}
</Fragment>
);
}
}
export default Docs;

View File

@@ -0,0 +1,42 @@
import React, {Component} from 'react';
import {object} from 'prop-types';
import Link from 'gatsby-link';
class Examples extends Component {
renderExample({node}) {
const context = node.context;
return (
<li key={node.id}>
<Link to={context.slug}>{context.frontmatter.title}</Link>
</li>
);
}
render() {
return <ul>{this.props.data.allSitePage.edges.map(this.renderExample)}</ul>;
}
}
Examples.propTypes = {
data: object.isRequired
};
export const query = graphql`
query ExampleList {
allSitePage(filter: {pluginCreator: {name: {eq: "examples"}}}) {
edges {
node {
id
context {
slug
frontmatter {
title
}
}
}
}
}
}
`;
export default Examples;

3
site/src/pages/index.js Normal file
View File

@@ -0,0 +1,3 @@
import React from 'react';
export default () => <p>This is the home page</p>;

111
site/src/utils/doc.js Normal file
View File

@@ -0,0 +1,111 @@
function getLongModuleName(name) {
return name.split(/[~\.]/).shift();
}
export function getShortModuleName(longname) {
return getLongModuleName(longname).slice(7);
}
export function getShortName(longname) {
return longname.split(/[~\.]/).pop();
}
export function slugify(name) {
return name.replace(/[#~\.]/g, '-');
}
function getExported(name, exports) {
const local = getShortName(name);
for (const exported in exports) {
if (exports[exported] === local) {
return exported;
}
}
}
export function getModules(info) {
const moduleLookup = {};
info.modules.forEach(mod => {
moduleLookup[mod.name] = {...mod, functions: [], classes: []};
});
// extract classes
const classLookup = {};
info.symbols.forEach(symbol => {
const name = symbol.name;
const parent = symbol.memberof;
if (symbol.kind === 'class') {
const mod = moduleLookup[parent];
if (!mod) {
throw new Error(
`No module found for class ${name} with parent ${parent}`
);
}
const cls = {
...symbol,
methods: [],
properties: [],
exported: getExported(name, mod.exports)
};
mod.classes.push(cls);
classLookup[name] = cls;
}
});
info.symbols.forEach(symbol => {
const name = symbol.name;
const parent = symbol.memberof;
if (symbol.kind === 'member') {
if (parent in classLookup) {
classLookup[parent].properties.push(symbol);
return;
}
// instance property where constructor is not marked @api
const moduleId = getLongModuleName(name);
const mod = moduleLookup[moduleId];
if (!mod) {
throw new Error(`Unexpected member: ${name}`);
}
const cls = {name: parent, methods: [], properties: [symbol]};
mod.classes.push(cls);
classLookup[parent] = cls;
return;
}
if (symbol.kind === 'function') {
if (parent in moduleLookup) {
moduleLookup[parent].functions.push({
...symbol,
exported: getExported(name, moduleLookup[parent].exports)
});
return;
}
if (parent in classLookup) {
classLookup[parent].methods.push(symbol);
return;
}
// method where constructor is not marked @api
const moduleId = getLongModuleName(name);
const mod = moduleLookup[moduleId];
if (!mod) {
throw new Error(`Unexpected function: ${name}`);
}
const cls = {name: parent, methods: [symbol], properties: []};
mod.classes.push(cls);
classLookup[parent] = cls;
return;
}
});
return Object.keys(moduleLookup)
.sort()
.map(id => moduleLookup[id]);
}

View File

@@ -0,0 +1,14 @@
const Typography = require('typography');
const theme = require('typography-theme-noriega').default;
const CodePlugin = require('typography-plugin-code').default;
theme.plugins = [new CodePlugin()];
theme.overrideThemeStyles = () => ({
a: {
color: '#003c88',
textDecoration: 'none'
}
});
module.exports = new Typography(theme);

View File

@@ -1,28 +1,29 @@
/** /**
* @module ol/AssertionError * @module ol/AssertionError
*/ */
import {VERSION} from './util.js'; import {VERSION, inherits} from './index.js';
/** /**
* Error object thrown when an assertion failed. This is an ECMA-262 Error, * Error object thrown when an assertion failed. This is an ECMA-262 Error,
* extended with a `code` property. * extended with a `code` property.
* See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error. * @see {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error}
*/ * @constructor
class AssertionError extends Error { * @extends {Error}
/**
* @param {number} code Error code. * @param {number} code Error code.
*/ */
constructor(code) { const AssertionError = function(code) {
const path = VERSION.split('-')[0];
const message = 'Assertion failed. See https://openlayers.org/en/' + path +
'/doc/errors/#' + code + ' for details.';
super(message); const path = VERSION ? VERSION.split('-')[0] : 'latest';
/**
* @type {string}
*/
this.message = 'Assertion failed. See https://openlayers.org/en/' + path +
'/doc/errors/#' + code + ' for details.';
/** /**
* Error code. The meaning of the code can be found on * Error code. The meaning of the code can be found on
* https://openlayers.org/en/latest/doc/errors/ (replace `latest` with * {@link https://openlayers.org/en/latest/doc/errors/} (replace `latest` with
* the version found in the OpenLayers script's header comment if a version * the version found in the OpenLayers script's header comment if a version
* other than the latest is used). * other than the latest is used).
* @type {number} * @type {number}
@@ -30,15 +31,10 @@ class AssertionError extends Error {
*/ */
this.code = code; this.code = code;
/**
* @type {string}
*/
this.name = 'AssertionError'; this.name = 'AssertionError';
// Re-assign message, see https://github.com/Rich-Harris/buble/issues/40 };
this.message = message;
}
} inherits(AssertionError, Error);
export default AssertionError; export default AssertionError;

View File

@@ -1,6 +1,7 @@
/** /**
* @module ol/Collection * @module ol/Collection
*/ */
import {inherits} from './index.js';
import AssertionError from './AssertionError.js'; import AssertionError from './AssertionError.js';
import CollectionEventType from './CollectionEventType.js'; import CollectionEventType from './CollectionEventType.js';
import BaseObject from './Object.js'; import BaseObject from './Object.js';
@@ -20,15 +21,15 @@ const Property = {
* @classdesc * @classdesc
* Events emitted by {@link module:ol/Collection~Collection} instances are instances of this * Events emitted by {@link module:ol/Collection~Collection} instances are instances of this
* type. * type.
*/ *
export class CollectionEvent extends Event { * @constructor
* @extends {module:ol/events/Event}
/**
* @param {module:ol/CollectionEventType} type Type. * @param {module:ol/CollectionEventType} type Type.
* @param {*=} opt_element Element. * @param {*=} opt_element Element.
*/ */
constructor(type, opt_element) { export const CollectionEvent = function(type, opt_element) {
super(type);
Event.call(this, type);
/** /**
* The element that is added to or removed from the collection. * The element that is added to or removed from the collection.
@@ -37,9 +38,9 @@ export class CollectionEvent extends Event {
*/ */
this.element = opt_element; this.element = opt_element;
} };
} inherits(CollectionEvent, Event);
/** /**
@@ -56,18 +57,17 @@ export class CollectionEvent extends Event {
* Collection; they trigger events on the appropriate object, not on the * Collection; they trigger events on the appropriate object, not on the
* Collection as a whole. * Collection as a whole.
* *
* @constructor
* @extends {module:ol/Object}
* @fires module:ol/Collection~CollectionEvent
* @param {Array.<T>=} opt_array Array.
* @param {module:ol/Collection~Options=} opt_options Collection options.
* @template T * @template T
* @api * @api
*/ */
class Collection extends BaseObject { const Collection = function(opt_array, opt_options) {
/** BaseObject.call(this);
* @param {Array.<T>=} opt_array Array.
* @param {module:ol/Collection~Options=} opt_options Collection options.
*/
constructor(opt_array, opt_options) {
super();
const options = opt_options || {}; const options = opt_options || {};
@@ -91,17 +91,21 @@ class Collection extends BaseObject {
this.updateLength_(); this.updateLength_();
} };
inherits(Collection, BaseObject);
/** /**
* Remove all elements from the collection. * Remove all elements from the collection.
* @api * @api
*/ */
clear() { Collection.prototype.clear = function() {
while (this.getLength() > 0) { while (this.getLength() > 0) {
this.pop(); this.pop();
} }
} };
/** /**
* Add elements to the collection. This pushes each item in the provided array * Add elements to the collection. This pushes each item in the provided array
@@ -110,12 +114,13 @@ class Collection extends BaseObject {
* @return {module:ol/Collection.<T>} This collection. * @return {module:ol/Collection.<T>} This collection.
* @api * @api
*/ */
extend(arr) { Collection.prototype.extend = function(arr) {
for (let i = 0, ii = arr.length; i < ii; ++i) { for (let i = 0, ii = arr.length; i < ii; ++i) {
this.push(arr[i]); this.push(arr[i]);
} }
return this; return this;
} };
/** /**
* Iterate over each element, calling the provided callback. * Iterate over each element, calling the provided callback.
@@ -124,12 +129,13 @@ class Collection extends BaseObject {
* index and the array). The return value is ignored. * index and the array). The return value is ignored.
* @api * @api
*/ */
forEach(f) { Collection.prototype.forEach = function(f) {
const array = this.array_; const array = this.array_;
for (let i = 0, ii = array.length; i < ii; ++i) { for (let i = 0, ii = array.length; i < ii; ++i) {
f(array[i], i, array); f(array[i], i, array);
} }
} };
/** /**
* Get a reference to the underlying Array object. Warning: if the array * Get a reference to the underlying Array object. Warning: if the array
@@ -139,9 +145,10 @@ class Collection extends BaseObject {
* @return {!Array.<T>} Array. * @return {!Array.<T>} Array.
* @api * @api
*/ */
getArray() { Collection.prototype.getArray = function() {
return this.array_; return this.array_;
} };
/** /**
* Get the element at the provided index. * Get the element at the provided index.
@@ -149,9 +156,10 @@ class Collection extends BaseObject {
* @return {T} Element. * @return {T} Element.
* @api * @api
*/ */
item(index) { Collection.prototype.item = function(index) {
return this.array_[index]; return this.array_[index];
} };
/** /**
* Get the length of this collection. * Get the length of this collection.
@@ -159,9 +167,10 @@ class Collection extends BaseObject {
* @observable * @observable
* @api * @api
*/ */
getLength() { Collection.prototype.getLength = function() {
return /** @type {number} */ (this.get(Property.LENGTH)); return /** @type {number} */ (this.get(Property.LENGTH));
} };
/** /**
* Insert an element at the provided index. * Insert an element at the provided index.
@@ -169,7 +178,7 @@ class Collection extends BaseObject {
* @param {T} elem Element. * @param {T} elem Element.
* @api * @api
*/ */
insertAt(index, elem) { Collection.prototype.insertAt = function(index, elem) {
if (this.unique_) { if (this.unique_) {
this.assertUnique_(elem); this.assertUnique_(elem);
} }
@@ -177,7 +186,8 @@ class Collection extends BaseObject {
this.updateLength_(); this.updateLength_();
this.dispatchEvent( this.dispatchEvent(
new CollectionEvent(CollectionEventType.ADD, elem)); new CollectionEvent(CollectionEventType.ADD, elem));
} };
/** /**
* Remove the last element of the collection and return it. * Remove the last element of the collection and return it.
@@ -185,9 +195,10 @@ class Collection extends BaseObject {
* @return {T|undefined} Element. * @return {T|undefined} Element.
* @api * @api
*/ */
pop() { Collection.prototype.pop = function() {
return this.removeAt(this.getLength() - 1); return this.removeAt(this.getLength() - 1);
} };
/** /**
* Insert the provided element at the end of the collection. * Insert the provided element at the end of the collection.
@@ -195,14 +206,15 @@ class Collection extends BaseObject {
* @return {number} New length of the collection. * @return {number} New length of the collection.
* @api * @api
*/ */
push(elem) { Collection.prototype.push = function(elem) {
if (this.unique_) { if (this.unique_) {
this.assertUnique_(elem); this.assertUnique_(elem);
} }
const n = this.getLength(); const n = this.getLength();
this.insertAt(n, elem); this.insertAt(n, elem);
return this.getLength(); return this.getLength();
} };
/** /**
* Remove the first occurrence of an element from the collection. * Remove the first occurrence of an element from the collection.
@@ -210,7 +222,7 @@ class Collection extends BaseObject {
* @return {T|undefined} The removed element or undefined if none found. * @return {T|undefined} The removed element or undefined if none found.
* @api * @api
*/ */
remove(elem) { Collection.prototype.remove = function(elem) {
const arr = this.array_; const arr = this.array_;
for (let i = 0, ii = arr.length; i < ii; ++i) { for (let i = 0, ii = arr.length; i < ii; ++i) {
if (arr[i] === elem) { if (arr[i] === elem) {
@@ -218,7 +230,8 @@ class Collection extends BaseObject {
} }
} }
return undefined; return undefined;
} };
/** /**
* Remove the element at the provided index and return it. * Remove the element at the provided index and return it.
@@ -227,13 +240,14 @@ class Collection extends BaseObject {
* @return {T|undefined} Value. * @return {T|undefined} Value.
* @api * @api
*/ */
removeAt(index) { Collection.prototype.removeAt = function(index) {
const prev = this.array_[index]; const prev = this.array_[index];
this.array_.splice(index, 1); this.array_.splice(index, 1);
this.updateLength_(); this.updateLength_();
this.dispatchEvent(new CollectionEvent(CollectionEventType.REMOVE, prev)); this.dispatchEvent(new CollectionEvent(CollectionEventType.REMOVE, prev));
return prev; return prev;
} };
/** /**
* Set the element at the provided index. * Set the element at the provided index.
@@ -241,7 +255,7 @@ class Collection extends BaseObject {
* @param {T} elem Element. * @param {T} elem Element.
* @api * @api
*/ */
setAt(index, elem) { Collection.prototype.setAt = function(index, elem) {
const n = this.getLength(); const n = this.getLength();
if (index < n) { if (index < n) {
if (this.unique_) { if (this.unique_) {
@@ -259,28 +273,28 @@ class Collection extends BaseObject {
} }
this.insertAt(index, elem); this.insertAt(index, elem);
} }
} };
/** /**
* @private * @private
*/ */
updateLength_() { Collection.prototype.updateLength_ = function() {
this.set(Property.LENGTH, this.array_.length); this.set(Property.LENGTH, this.array_.length);
} };
/** /**
* @private * @private
* @param {T} elem Element. * @param {T} elem Element.
* @param {number=} opt_except Optional index to ignore. * @param {number=} opt_except Optional index to ignore.
*/ */
assertUnique_(elem, opt_except) { Collection.prototype.assertUnique_ = function(elem, opt_except) {
for (let i = 0, ii = this.array_.length; i < ii; ++i) { for (let i = 0, ii = this.array_.length; i < ii; ++i) {
if (this.array_[i] === elem && i !== opt_except) { if (this.array_[i] === elem && i !== opt_except) {
throw new AssertionError(58); throw new AssertionError(58);
} }
} }
} };
}
export default Collection; export default Collection;

View File

@@ -5,18 +5,9 @@ import {UNDEFINED} from './functions.js';
/** /**
* Objects that need to clean up after themselves. * Objects that need to clean up after themselves.
* @constructor
*/ */
class Disposable { const Disposable = function() {};
/**
* Clean up.
*/
dispose() {
if (!this.disposed_) {
this.disposed_ = true;
this.disposeInternal();
}
}
}
/** /**
* The object has already been disposed. * The object has already been disposed.
@@ -25,6 +16,16 @@ class Disposable {
*/ */
Disposable.prototype.disposed_ = false; Disposable.prototype.disposed_ = false;
/**
* Clean up.
*/
Disposable.prototype.dispose = function() {
if (!this.disposed_) {
this.disposed_ = true;
this.disposeInternal();
}
};
/** /**
* Extension point for disposable objects. * Extension point for disposable objects.
* @protected * @protected

View File

@@ -4,6 +4,7 @@
import {assert} from './asserts.js'; import {assert} from './asserts.js';
import {listen, unlisten, unlistenByKey} from './events.js'; import {listen, unlisten, unlistenByKey} from './events.js';
import EventType from './events/EventType.js'; import EventType from './events/EventType.js';
import {inherits} from './index.js';
import BaseObject, {getChangeEventType} from './Object.js'; import BaseObject, {getChangeEventType} from './Object.js';
import Geometry from './geom/Geometry.js'; import Geometry from './geom/Geometry.js';
import Style from './style/Style.js'; import Style from './style/Style.js';
@@ -50,19 +51,17 @@ import Style from './style/Style.js';
* var point = feature.getGeometry(); * var point = feature.getGeometry();
* ``` * ```
* *
* @api * @constructor
*/ * @extends {module:ol/Object}
class Feature extends BaseObject {
/**
* @param {module:ol/geom/Geometry|Object.<string, *>=} opt_geometryOrProperties * @param {module:ol/geom/Geometry|Object.<string, *>=} opt_geometryOrProperties
* You may pass a Geometry object directly, or an object literal containing * You may pass a Geometry object directly, or an object literal containing
* properties. If you pass an object literal, you may include a Geometry * properties. If you pass an object literal, you may include a Geometry
* associated with a `geometry` key. * associated with a `geometry` key.
* @api
*/ */
constructor(opt_geometryOrProperties) { const Feature = function(opt_geometryOrProperties) {
super(); BaseObject.call(this);
/** /**
* @private * @private
@@ -110,7 +109,10 @@ class Feature extends BaseObject {
this.setProperties(properties); this.setProperties(properties);
} }
} }
} };
inherits(Feature, BaseObject);
/** /**
* Clone this feature. If the original feature has a geometry it * Clone this feature. If the original feature has a geometry it
@@ -118,7 +120,7 @@ class Feature extends BaseObject {
* @return {module:ol/Feature} The clone. * @return {module:ol/Feature} The clone.
* @api * @api
*/ */
clone() { Feature.prototype.clone = function() {
const clone = new Feature(this.getProperties()); const clone = new Feature(this.getProperties());
clone.setGeometryName(this.getGeometryName()); clone.setGeometryName(this.getGeometryName());
const geometry = this.getGeometry(); const geometry = this.getGeometry();
@@ -130,7 +132,8 @@ class Feature extends BaseObject {
clone.setStyle(style); clone.setStyle(style);
} }
return clone; return clone;
} };
/** /**
* Get the feature's default geometry. A feature may have any number of named * Get the feature's default geometry. A feature may have any number of named
@@ -140,11 +143,12 @@ class Feature extends BaseObject {
* @api * @api
* @observable * @observable
*/ */
getGeometry() { Feature.prototype.getGeometry = function() {
return ( return (
/** @type {module:ol/geom/Geometry|undefined} */ (this.get(this.geometryName_)) /** @type {module:ol/geom/Geometry|undefined} */ (this.get(this.geometryName_))
); );
} };
/** /**
* Get the feature identifier. This is a stable identifier for the feature and * Get the feature identifier. This is a stable identifier for the feature and
@@ -153,9 +157,10 @@ class Feature extends BaseObject {
* @return {number|string|undefined} Id. * @return {number|string|undefined} Id.
* @api * @api
*/ */
getId() { Feature.prototype.getId = function() {
return this.id_; return this.id_;
} };
/** /**
* Get the name of the feature's default geometry. By default, the default * Get the name of the feature's default geometry. By default, the default
@@ -164,9 +169,10 @@ class Feature extends BaseObject {
* for this feature. * for this feature.
* @api * @api
*/ */
getGeometryName() { Feature.prototype.getGeometryName = function() {
return this.geometryName_; return this.geometryName_;
} };
/** /**
* Get the feature's style. Will return what was provided to the * Get the feature's style. Will return what was provided to the
@@ -174,9 +180,10 @@ class Feature extends BaseObject {
* @return {module:ol/style/Style|Array.<module:ol/style/Style>|module:ol/style/Style~StyleFunction} The feature style. * @return {module:ol/style/Style|Array.<module:ol/style/Style>|module:ol/style/Style~StyleFunction} The feature style.
* @api * @api
*/ */
getStyle() { Feature.prototype.getStyle = function() {
return this.style_; return this.style_;
} };
/** /**
* Get the feature's style function. * Get the feature's style function.
@@ -184,21 +191,23 @@ class Feature extends BaseObject {
* representing the current style of this feature. * representing the current style of this feature.
* @api * @api
*/ */
getStyleFunction() { Feature.prototype.getStyleFunction = function() {
return this.styleFunction_; return this.styleFunction_;
} };
/** /**
* @private * @private
*/ */
handleGeometryChange_() { Feature.prototype.handleGeometryChange_ = function() {
this.changed(); this.changed();
} };
/** /**
* @private * @private
*/ */
handleGeometryChanged_() { Feature.prototype.handleGeometryChanged_ = function() {
if (this.geometryChangeKey_) { if (this.geometryChangeKey_) {
unlistenByKey(this.geometryChangeKey_); unlistenByKey(this.geometryChangeKey_);
this.geometryChangeKey_ = null; this.geometryChangeKey_ = null;
@@ -209,7 +218,8 @@ class Feature extends BaseObject {
EventType.CHANGE, this.handleGeometryChange_, this); EventType.CHANGE, this.handleGeometryChange_, this);
} }
this.changed(); this.changed();
} };
/** /**
* Set the default geometry for the feature. This will update the property * Set the default geometry for the feature. This will update the property
@@ -218,9 +228,10 @@ class Feature extends BaseObject {
* @api * @api
* @observable * @observable
*/ */
setGeometry(geometry) { Feature.prototype.setGeometry = function(geometry) {
this.set(this.geometryName_, geometry); this.set(this.geometryName_, geometry);
} };
/** /**
* Set the style for the feature. This can be a single style object, an array * Set the style for the feature. This can be a single style object, an array
@@ -230,11 +241,12 @@ class Feature extends BaseObject {
* @api * @api
* @fires module:ol/events/Event~Event#event:change * @fires module:ol/events/Event~Event#event:change
*/ */
setStyle(style) { Feature.prototype.setStyle = function(style) {
this.style_ = style; this.style_ = style;
this.styleFunction_ = !style ? undefined : createStyleFunction(style); this.styleFunction_ = !style ? undefined : createStyleFunction(style);
this.changed(); this.changed();
} };
/** /**
* Set the feature id. The feature id is considered stable and may be used when * Set the feature id. The feature id is considered stable and may be used when
@@ -245,10 +257,11 @@ class Feature extends BaseObject {
* @api * @api
* @fires module:ol/events/Event~Event#event:change * @fires module:ol/events/Event~Event#event:change
*/ */
setId(id) { Feature.prototype.setId = function(id) {
this.id_ = id; this.id_ = id;
this.changed(); this.changed();
} };
/** /**
* Set the property name to be used when getting the feature's default geometry. * Set the property name to be used when getting the feature's default geometry.
@@ -257,7 +270,7 @@ class Feature extends BaseObject {
* @param {string} name The property name of the default geometry. * @param {string} name The property name of the default geometry.
* @api * @api
*/ */
setGeometryName(name) { Feature.prototype.setGeometryName = function(name) {
unlisten( unlisten(
this, getChangeEventType(this.geometryName_), this, getChangeEventType(this.geometryName_),
this.handleGeometryChanged_, this); this.handleGeometryChanged_, this);
@@ -266,8 +279,7 @@ class Feature extends BaseObject {
this, getChangeEventType(this.geometryName_), this, getChangeEventType(this.geometryName_),
this.handleGeometryChanged_, this); this.handleGeometryChanged_, this);
this.handleGeometryChanged_(); this.handleGeometryChanged_();
} };
}
/** /**

View File

@@ -1,6 +1,7 @@
/** /**
* @module ol/Geolocation * @module ol/Geolocation
*/ */
import {inherits} from './index.js';
import GeolocationProperty from './GeolocationProperty.js'; import GeolocationProperty from './GeolocationProperty.js';
import BaseObject, {getChangeEventType} from './Object.js'; import BaseObject, {getChangeEventType} from './Object.js';
import {listen} from './events.js'; import {listen} from './events.js';
@@ -15,8 +16,8 @@ import {get as getProjection, getTransformFromProjections, identityTransform} fr
* @typedef {Object} Options * @typedef {Object} Options
* @property {boolean} [tracking=false] Start Tracking right after * @property {boolean} [tracking=false] Start Tracking right after
* instantiation. * instantiation.
* @property {PositionOptions} [trackingOptions] Tracking options. * @property {GeolocationPositionOptions} [trackingOptions] Tracking options.
* See http://www.w3.org/TR/geolocation-API/#position_options_interface. * See {@link http://www.w3.org/TR/geolocation-API/#position_options_interface}.
* @property {module:ol/proj~ProjectionLike} [projection] The projection the position * @property {module:ol/proj~ProjectionLike} [projection] The projection the position
* is reported in. * is reported in.
*/ */
@@ -43,16 +44,14 @@ import {get as getProjection, getTransformFromProjections, identityTransform} fr
* }); * });
* *
* @fires error * @fires error
* @constructor
* @extends {module:ol/Object}
* @param {module:ol/Geolocation~Options=} opt_options Options.
* @api * @api
*/ */
class Geolocation extends BaseObject { const Geolocation = function(opt_options) {
/** BaseObject.call(this);
* @param {module:ol/Geolocation~Options=} opt_options Options.
*/
constructor(opt_options) {
super();
const options = opt_options || {}; const options = opt_options || {};
@@ -91,20 +90,24 @@ class Geolocation extends BaseObject {
this.setTracking(options.tracking !== undefined ? options.tracking : false); this.setTracking(options.tracking !== undefined ? options.tracking : false);
} };
inherits(Geolocation, BaseObject);
/** /**
* @inheritDoc * @inheritDoc
*/ */
disposeInternal() { Geolocation.prototype.disposeInternal = function() {
this.setTracking(false); this.setTracking(false);
super.disposeInternal(); BaseObject.prototype.disposeInternal.call(this);
} };
/** /**
* @private * @private
*/ */
handleProjectionChanged_() { Geolocation.prototype.handleProjectionChanged_ = function() {
const projection = this.getProjection(); const projection = this.getProjection();
if (projection) { if (projection) {
this.transform_ = getTransformFromProjections( this.transform_ = getTransformFromProjections(
@@ -113,12 +116,13 @@ class Geolocation extends BaseObject {
this.set(GeolocationProperty.POSITION, this.transform_(this.position_)); this.set(GeolocationProperty.POSITION, this.transform_(this.position_));
} }
} }
} };
/** /**
* @private * @private
*/ */
handleTrackingChanged_() { Geolocation.prototype.handleTrackingChanged_ = function() {
if (GEOLOCATION) { if (GEOLOCATION) {
const tracking = this.getTracking(); const tracking = this.getTracking();
if (tracking && this.watchId_ === undefined) { if (tracking && this.watchId_ === undefined) {
@@ -131,13 +135,14 @@ class Geolocation extends BaseObject {
this.watchId_ = undefined; this.watchId_ = undefined;
} }
} }
} };
/** /**
* @private * @private
* @param {Position} position position event. * @param {GeolocationPosition} position position event.
*/ */
positionChange_(position) { Geolocation.prototype.positionChange_ = function(position) {
const coords = position.coords; const coords = position.coords;
this.set(GeolocationProperty.ACCURACY, coords.accuracy); this.set(GeolocationProperty.ACCURACY, coords.accuracy);
this.set(GeolocationProperty.ALTITUDE, this.set(GeolocationProperty.ALTITUDE,
@@ -161,7 +166,7 @@ class Geolocation extends BaseObject {
geometry.applyTransform(this.transform_); geometry.applyTransform(this.transform_);
this.set(GeolocationProperty.ACCURACY_GEOMETRY, geometry); this.set(GeolocationProperty.ACCURACY_GEOMETRY, geometry);
this.changed(); this.changed();
} };
/** /**
* Triggered when the Geolocation returns an error. * Triggered when the Geolocation returns an error.
@@ -171,13 +176,14 @@ class Geolocation extends BaseObject {
/** /**
* @private * @private
* @param {PositionError} error error object. * @param {GeolocationPositionError} error error object.
*/ */
positionError_(error) { Geolocation.prototype.positionError_ = function(error) {
error.type = EventType.ERROR; error.type = EventType.ERROR;
this.setTracking(false); this.setTracking(false);
this.dispatchEvent(/** @type {{type: string, target: undefined}} */ (error)); this.dispatchEvent(/** @type {{type: string, target: undefined}} */ (error));
} };
/** /**
* Get the accuracy of the position in meters. * Get the accuracy of the position in meters.
@@ -186,9 +192,10 @@ class Geolocation extends BaseObject {
* @observable * @observable
* @api * @api
*/ */
getAccuracy() { Geolocation.prototype.getAccuracy = function() {
return /** @type {number|undefined} */ (this.get(GeolocationProperty.ACCURACY)); return /** @type {number|undefined} */ (this.get(GeolocationProperty.ACCURACY));
} };
/** /**
* Get a geometry of the position accuracy. * Get a geometry of the position accuracy.
@@ -196,11 +203,12 @@ class Geolocation extends BaseObject {
* @observable * @observable
* @api * @api
*/ */
getAccuracyGeometry() { Geolocation.prototype.getAccuracyGeometry = function() {
return ( return (
/** @type {?module:ol/geom/Polygon} */ (this.get(GeolocationProperty.ACCURACY_GEOMETRY) || null) /** @type {?module:ol/geom/Polygon} */ (this.get(GeolocationProperty.ACCURACY_GEOMETRY) || null)
); );
} };
/** /**
* Get the altitude associated with the position. * Get the altitude associated with the position.
@@ -209,9 +217,10 @@ class Geolocation extends BaseObject {
* @observable * @observable
* @api * @api
*/ */
getAltitude() { Geolocation.prototype.getAltitude = function() {
return /** @type {number|undefined} */ (this.get(GeolocationProperty.ALTITUDE)); return /** @type {number|undefined} */ (this.get(GeolocationProperty.ALTITUDE));
} };
/** /**
* Get the altitude accuracy of the position. * Get the altitude accuracy of the position.
@@ -220,9 +229,10 @@ class Geolocation extends BaseObject {
* @observable * @observable
* @api * @api
*/ */
getAltitudeAccuracy() { Geolocation.prototype.getAltitudeAccuracy = function() {
return /** @type {number|undefined} */ (this.get(GeolocationProperty.ALTITUDE_ACCURACY)); return /** @type {number|undefined} */ (this.get(GeolocationProperty.ALTITUDE_ACCURACY));
} };
/** /**
* Get the heading as radians clockwise from North. * Get the heading as radians clockwise from North.
@@ -232,9 +242,10 @@ class Geolocation extends BaseObject {
* @observable * @observable
* @api * @api
*/ */
getHeading() { Geolocation.prototype.getHeading = function() {
return /** @type {number|undefined} */ (this.get(GeolocationProperty.HEADING)); return /** @type {number|undefined} */ (this.get(GeolocationProperty.HEADING));
} };
/** /**
* Get the position of the device. * Get the position of the device.
@@ -243,11 +254,12 @@ class Geolocation extends BaseObject {
* @observable * @observable
* @api * @api
*/ */
getPosition() { Geolocation.prototype.getPosition = function() {
return ( return (
/** @type {module:ol/coordinate~Coordinate|undefined} */ (this.get(GeolocationProperty.POSITION)) /** @type {module:ol/coordinate~Coordinate|undefined} */ (this.get(GeolocationProperty.POSITION))
); );
} };
/** /**
* Get the projection associated with the position. * Get the projection associated with the position.
@@ -256,11 +268,12 @@ class Geolocation extends BaseObject {
* @observable * @observable
* @api * @api
*/ */
getProjection() { Geolocation.prototype.getProjection = function() {
return ( return (
/** @type {module:ol/proj/Projection|undefined} */ (this.get(GeolocationProperty.PROJECTION)) /** @type {module:ol/proj/Projection|undefined} */ (this.get(GeolocationProperty.PROJECTION))
); );
} };
/** /**
* Get the speed in meters per second. * Get the speed in meters per second.
@@ -269,9 +282,10 @@ class Geolocation extends BaseObject {
* @observable * @observable
* @api * @api
*/ */
getSpeed() { Geolocation.prototype.getSpeed = function() {
return /** @type {number|undefined} */ (this.get(GeolocationProperty.SPEED)); return /** @type {number|undefined} */ (this.get(GeolocationProperty.SPEED));
} };
/** /**
* Determine if the device location is being tracked. * Determine if the device location is being tracked.
@@ -279,22 +293,24 @@ class Geolocation extends BaseObject {
* @observable * @observable
* @api * @api
*/ */
getTracking() { Geolocation.prototype.getTracking = function() {
return /** @type {boolean} */ (this.get(GeolocationProperty.TRACKING)); return /** @type {boolean} */ (this.get(GeolocationProperty.TRACKING));
} };
/** /**
* Get the tracking options. * Get the tracking options.
* See http://www.w3.org/TR/geolocation-API/#position-options. * @see http://www.w3.org/TR/geolocation-API/#position-options
* @return {PositionOptions|undefined} PositionOptions as defined by * @return {GeolocationPositionOptions|undefined} PositionOptions as defined by
* the [HTML5 Geolocation spec * the [HTML5 Geolocation spec
* ](http://www.w3.org/TR/geolocation-API/#position_options_interface). * ](http://www.w3.org/TR/geolocation-API/#position_options_interface).
* @observable * @observable
* @api * @api
*/ */
getTrackingOptions() { Geolocation.prototype.getTrackingOptions = function() {
return /** @type {PositionOptions|undefined} */ (this.get(GeolocationProperty.TRACKING_OPTIONS)); return /** @type {GeolocationPositionOptions|undefined} */ (this.get(GeolocationProperty.TRACKING_OPTIONS));
} };
/** /**
* Set the projection to use for transforming the coordinates. * Set the projection to use for transforming the coordinates.
@@ -303,9 +319,10 @@ class Geolocation extends BaseObject {
* @observable * @observable
* @api * @api
*/ */
setProjection(projection) { Geolocation.prototype.setProjection = function(projection) {
this.set(GeolocationProperty.PROJECTION, getProjection(projection)); this.set(GeolocationProperty.PROJECTION, getProjection(projection));
} };
/** /**
* Enable or disable tracking. * Enable or disable tracking.
@@ -313,23 +330,21 @@ class Geolocation extends BaseObject {
* @observable * @observable
* @api * @api
*/ */
setTracking(tracking) { Geolocation.prototype.setTracking = function(tracking) {
this.set(GeolocationProperty.TRACKING, tracking); this.set(GeolocationProperty.TRACKING, tracking);
} };
/** /**
* Set the tracking options. * Set the tracking options.
* See http://www.w3.org/TR/geolocation-API/#position-options. * @see http://www.w3.org/TR/geolocation-API/#position-options
* @param {PositionOptions} options PositionOptions as defined by the * @param {GeolocationPositionOptions} options PositionOptions as defined by the
* [HTML5 Geolocation spec * [HTML5 Geolocation spec
* ](http://www.w3.org/TR/geolocation-API/#position_options_interface). * ](http://www.w3.org/TR/geolocation-API/#position_options_interface).
* @observable * @observable
* @api * @api
*/ */
setTrackingOptions(options) { Geolocation.prototype.setTrackingOptions = function(options) {
this.set(GeolocationProperty.TRACKING_OPTIONS, options); this.set(GeolocationProperty.TRACKING_OPTIONS, options);
} };
}
export default Geolocation; export default Geolocation;

View File

@@ -112,14 +112,11 @@ const INTERVALS = [
/** /**
* Render a grid for a coordinate system on a map. * Render a grid for a coordinate system on a map.
* @constructor
* @param {module:ol/Graticule~Options=} opt_options Options.
* @api * @api
*/ */
class Graticule { const Graticule = function(opt_options) {
/**
* @param {module:ol/Graticule~Options=} opt_options Options.
*/
constructor(opt_options) {
const options = opt_options || {}; const options = opt_options || {};
/** /**
@@ -248,20 +245,21 @@ class Graticule {
this.parallelsLabels_ = null; this.parallelsLabels_ = null;
if (options.showLabels == true) { if (options.showLabels == true) {
const degreesToString = degreesToStringHDMS;
/** /**
* @type {null|function(number):string} * @type {null|function(number):string}
* @private * @private
*/ */
this.lonLabelFormatter_ = options.lonLabelFormatter == undefined ? this.lonLabelFormatter_ = options.lonLabelFormatter == undefined ?
degreesToStringHDMS.bind(this, 'EW') : options.lonLabelFormatter; degreesToString.bind(this, 'EW') : options.lonLabelFormatter;
/** /**
* @type {function(number):string} * @type {function(number):string}
* @private * @private
*/ */
this.latLabelFormatter_ = options.latLabelFormatter == undefined ? this.latLabelFormatter_ = options.latLabelFormatter == undefined ?
degreesToStringHDMS.bind(this, 'NS') : options.latLabelFormatter; degreesToString.bind(this, 'NS') : options.latLabelFormatter;
/** /**
* Longitude label position in fractions (0..1) of view extent. 0 means * Longitude label position in fractions (0..1) of view extent. 0 means
@@ -320,7 +318,8 @@ class Graticule {
} }
this.setMap(options.map !== undefined ? options.map : null); this.setMap(options.map !== undefined ? options.map : null);
} };
/** /**
* @param {number} lon Longitude. * @param {number} lon Longitude.
@@ -332,7 +331,7 @@ class Graticule {
* @return {number} Index. * @return {number} Index.
* @private * @private
*/ */
addMeridian_(lon, minLat, maxLat, squaredTolerance, extent, index) { Graticule.prototype.addMeridian_ = function(lon, minLat, maxLat, squaredTolerance, extent, index) {
const lineString = this.getMeridian_(lon, minLat, maxLat, squaredTolerance, index); const lineString = this.getMeridian_(lon, minLat, maxLat, squaredTolerance, index);
if (intersects(lineString.getExtent(), extent)) { if (intersects(lineString.getExtent(), extent)) {
if (this.meridiansLabels_) { if (this.meridiansLabels_) {
@@ -345,7 +344,7 @@ class Graticule {
this.meridians_[index++] = lineString; this.meridians_[index++] = lineString;
} }
return index; return index;
} };
/** /**
* @param {module:ol/geom/LineString} lineString Meridian * @param {module:ol/geom/LineString} lineString Meridian
@@ -354,7 +353,7 @@ class Graticule {
* @return {module:ol/geom/Point} Meridian point. * @return {module:ol/geom/Point} Meridian point.
* @private * @private
*/ */
getMeridianPoint_(lineString, extent, index) { Graticule.prototype.getMeridianPoint_ = function(lineString, extent, index) {
const flatCoordinates = lineString.getFlatCoordinates(); const flatCoordinates = lineString.getFlatCoordinates();
const clampedBottom = Math.max(extent[1], flatCoordinates[1]); const clampedBottom = Math.max(extent[1], flatCoordinates[1]);
const clampedTop = Math.min(extent[3], flatCoordinates[flatCoordinates.length - 1]); const clampedTop = Math.min(extent[3], flatCoordinates[flatCoordinates.length - 1]);
@@ -362,15 +361,12 @@ class Graticule {
extent[1] + Math.abs(extent[1] - extent[3]) * this.lonLabelPosition_, extent[1] + Math.abs(extent[1] - extent[3]) * this.lonLabelPosition_,
clampedBottom, clampedTop); clampedBottom, clampedTop);
const coordinate = [flatCoordinates[0], lat]; const coordinate = [flatCoordinates[0], lat];
let point; const point = this.meridiansLabels_[index] !== undefined ?
if (index in this.meridiansLabels_) { this.meridiansLabels_[index].geom : new Point(null);
point = this.meridiansLabels_[index];
point.setCoordinates(coordinate); point.setCoordinates(coordinate);
} else {
point = new Point(coordinate);
}
return point; return point;
} };
/** /**
* @param {number} lat Latitude. * @param {number} lat Latitude.
@@ -382,7 +378,7 @@ class Graticule {
* @return {number} Index. * @return {number} Index.
* @private * @private
*/ */
addParallel_(lat, minLon, maxLon, squaredTolerance, extent, index) { Graticule.prototype.addParallel_ = function(lat, minLon, maxLon, squaredTolerance, extent, index) {
const lineString = this.getParallel_(lat, minLon, maxLon, squaredTolerance, index); const lineString = this.getParallel_(lat, minLon, maxLon, squaredTolerance, index);
if (intersects(lineString.getExtent(), extent)) { if (intersects(lineString.getExtent(), extent)) {
if (this.parallelsLabels_) { if (this.parallelsLabels_) {
@@ -395,7 +391,8 @@ class Graticule {
this.parallels_[index++] = lineString; this.parallels_[index++] = lineString;
} }
return index; return index;
} };
/** /**
* @param {module:ol/geom/LineString} lineString Parallels. * @param {module:ol/geom/LineString} lineString Parallels.
@@ -404,7 +401,7 @@ class Graticule {
* @return {module:ol/geom/Point} Parallel point. * @return {module:ol/geom/Point} Parallel point.
* @private * @private
*/ */
getParallelPoint_(lineString, extent, index) { Graticule.prototype.getParallelPoint_ = function(lineString, extent, index) {
const flatCoordinates = lineString.getFlatCoordinates(); const flatCoordinates = lineString.getFlatCoordinates();
const clampedLeft = Math.max(extent[0], flatCoordinates[0]); const clampedLeft = Math.max(extent[0], flatCoordinates[0]);
const clampedRight = Math.min(extent[2], flatCoordinates[flatCoordinates.length - 2]); const clampedRight = Math.min(extent[2], flatCoordinates[flatCoordinates.length - 2]);
@@ -412,15 +409,12 @@ class Graticule {
extent[0] + Math.abs(extent[0] - extent[2]) * this.latLabelPosition_, extent[0] + Math.abs(extent[0] - extent[2]) * this.latLabelPosition_,
clampedLeft, clampedRight); clampedLeft, clampedRight);
const coordinate = [lon, flatCoordinates[1]]; const coordinate = [lon, flatCoordinates[1]];
let point; const point = this.parallelsLabels_[index] !== undefined ?
if (index in this.parallelsLabels_) { this.parallelsLabels_[index].geom : new Point(null);
point = this.parallelsLabels_[index];
point.setCoordinates(coordinate); point.setCoordinates(coordinate);
} else {
point = new Point(coordinate);
}
return point; return point;
} };
/** /**
* @param {module:ol/extent~Extent} extent Extent. * @param {module:ol/extent~Extent} extent Extent.
@@ -429,7 +423,7 @@ class Graticule {
* @param {number} squaredTolerance Squared tolerance. * @param {number} squaredTolerance Squared tolerance.
* @private * @private
*/ */
createGraticule_(extent, center, resolution, squaredTolerance) { Graticule.prototype.createGraticule_ = function(extent, center, resolution, squaredTolerance) {
const interval = this.getInterval_(resolution); const interval = this.getInterval_(resolution);
if (interval == -1) { if (interval == -1) {
@@ -514,47 +508,51 @@ class Graticule {
this.parallelsLabels_.length = idx; this.parallelsLabels_.length = idx;
} }
} };
/** /**
* @param {number} resolution Resolution. * @param {number} resolution Resolution.
* @return {number} The interval in degrees. * @return {number} The interval in degrees.
* @private * @private
*/ */
getInterval_(resolution) { Graticule.prototype.getInterval_ = function(resolution) {
const centerLon = this.projectionCenterLonLat_[0]; const centerLon = this.projectionCenterLonLat_[0];
const centerLat = this.projectionCenterLonLat_[1]; const centerLat = this.projectionCenterLonLat_[1];
let interval = -1; let interval = -1;
let i, ii, delta, dist;
const target = Math.pow(this.targetSize_ * resolution, 2); const target = Math.pow(this.targetSize_ * resolution, 2);
/** @type {Array.<number>} **/ /** @type {Array.<number>} **/
const p1 = []; const p1 = [];
/** @type {Array.<number>} **/ /** @type {Array.<number>} **/
const p2 = []; const p2 = [];
for (let i = 0, ii = INTERVALS.length; i < ii; ++i) { for (i = 0, ii = INTERVALS.length; i < ii; ++i) {
const delta = INTERVALS[i] / 2; delta = INTERVALS[i] / 2;
p1[0] = centerLon - delta; p1[0] = centerLon - delta;
p1[1] = centerLat - delta; p1[1] = centerLat - delta;
p2[0] = centerLon + delta; p2[0] = centerLon + delta;
p2[1] = centerLat + delta; p2[1] = centerLat + delta;
this.fromLonLatTransform_(p1, p1); this.fromLonLatTransform_(p1, p1);
this.fromLonLatTransform_(p2, p2); this.fromLonLatTransform_(p2, p2);
const dist = Math.pow(p2[0] - p1[0], 2) + Math.pow(p2[1] - p1[1], 2); dist = Math.pow(p2[0] - p1[0], 2) + Math.pow(p2[1] - p1[1], 2);
if (dist <= target) { if (dist <= target) {
break; break;
} }
interval = INTERVALS[i]; interval = INTERVALS[i];
} }
return interval; return interval;
} };
/** /**
* Get the map associated with this graticule. * Get the map associated with this graticule.
* @return {module:ol/PluggableMap} The map. * @return {module:ol/PluggableMap} The map.
* @api * @api
*/ */
getMap() { Graticule.prototype.getMap = function() {
return this.map_; return this.map_;
} };
/** /**
* @param {number} lon Longitude. * @param {number} lon Longitude.
@@ -565,26 +563,23 @@ class Graticule {
* @param {number} index Index. * @param {number} index Index.
* @private * @private
*/ */
getMeridian_(lon, minLat, maxLat, squaredTolerance, index) { Graticule.prototype.getMeridian_ = function(lon, minLat, maxLat, squaredTolerance, index) {
const flatCoordinates = meridian(lon, minLat, maxLat, this.projection_, squaredTolerance); const flatCoordinates = meridian(lon, minLat, maxLat, this.projection_, squaredTolerance);
let lineString = this.meridians_[index]; const lineString = this.meridians_[index] !== undefined ? this.meridians_[index] : new LineString(null);
if (!lineString) {
lineString = this.meridians_[index] = new LineString(flatCoordinates, GeometryLayout.XY);
} else {
lineString.setFlatCoordinates(GeometryLayout.XY, flatCoordinates); lineString.setFlatCoordinates(GeometryLayout.XY, flatCoordinates);
lineString.changed();
}
return lineString; return lineString;
} };
/** /**
* Get the list of meridians. Meridians are lines of equal longitude. * Get the list of meridians. Meridians are lines of equal longitude.
* @return {Array.<module:ol/geom/LineString>} The meridians. * @return {Array.<module:ol/geom/LineString>} The meridians.
* @api * @api
*/ */
getMeridians() { Graticule.prototype.getMeridians = function() {
return this.meridians_; return this.meridians_;
} };
/** /**
* @param {number} lat Latitude. * @param {number} lat Latitude.
@@ -595,32 +590,29 @@ class Graticule {
* @param {number} index Index. * @param {number} index Index.
* @private * @private
*/ */
getParallel_(lat, minLon, maxLon, squaredTolerance, index) { Graticule.prototype.getParallel_ = function(lat, minLon, maxLon, squaredTolerance, index) {
const flatCoordinates = parallel(lat, minLon, maxLon, this.projection_, squaredTolerance); const flatCoordinates = parallel(lat, minLon, maxLon, this.projection_, squaredTolerance);
let lineString = this.parallels_[index]; const lineString = this.parallels_[index] !== undefined ? this.parallels_[index] : new LineString(null);
if (!lineString) {
lineString = new LineString(flatCoordinates, GeometryLayout.XY);
} else {
lineString.setFlatCoordinates(GeometryLayout.XY, flatCoordinates); lineString.setFlatCoordinates(GeometryLayout.XY, flatCoordinates);
lineString.changed();
}
return lineString; return lineString;
} };
/** /**
* Get the list of parallels. Parallels are lines of equal latitude. * Get the list of parallels. Parallels are lines of equal latitude.
* @return {Array.<module:ol/geom/LineString>} The parallels. * @return {Array.<module:ol/geom/LineString>} The parallels.
* @api * @api
*/ */
getParallels() { Graticule.prototype.getParallels = function() {
return this.parallels_; return this.parallels_;
} };
/** /**
* @param {module:ol/render/Event} e Event. * @param {module:ol/render/Event} e Event.
* @private * @private
*/ */
handlePostCompose_(e) { Graticule.prototype.handlePostCompose_ = function(e) {
const vectorContext = e.vectorContext; const vectorContext = e.vectorContext;
const frameState = e.frameState; const frameState = e.frameState;
const extent = frameState.extent; const extent = frameState.extent;
@@ -669,36 +661,50 @@ class Graticule {
vectorContext.drawGeometry(labelData.geom); vectorContext.drawGeometry(labelData.geom);
} }
} }
} };
/** /**
* @param {module:ol/proj/Projection} projection Projection. * @param {module:ol/proj/Projection} projection Projection.
* @private * @private
*/ */
updateProjectionInfo_(projection) { Graticule.prototype.updateProjectionInfo_ = function(projection) {
const epsg4326Projection = getProjection('EPSG:4326'); const epsg4326Projection = getProjection('EPSG:4326');
const extent = projection.getExtent();
const worldExtent = projection.getWorldExtent(); const worldExtent = projection.getWorldExtent();
const worldExtentP = transformExtent(worldExtent, epsg4326Projection, projection); const worldExtentP = transformExtent(worldExtent, epsg4326Projection, projection);
this.maxLat_ = worldExtent[3]; const maxLat = worldExtent[3];
this.maxLon_ = worldExtent[2]; const maxLon = worldExtent[2];
this.minLat_ = worldExtent[1]; const minLat = worldExtent[1];
this.minLon_ = worldExtent[0]; const minLon = worldExtent[0];
const maxLatP = worldExtentP[3];
const maxLonP = worldExtentP[2];
const minLatP = worldExtentP[1];
const minLonP = worldExtentP[0];
this.maxLat_ = maxLat;
this.maxLon_ = maxLon;
this.minLat_ = minLat;
this.minLon_ = minLon;
this.maxLatP_ = maxLatP;
this.maxLonP_ = maxLonP;
this.minLatP_ = minLatP;
this.minLonP_ = minLonP;
this.maxLatP_ = worldExtentP[3];
this.maxLonP_ = worldExtentP[2];
this.minLatP_ = worldExtentP[1];
this.minLonP_ = worldExtentP[0];
this.fromLonLatTransform_ = getTransform(epsg4326Projection, projection); this.fromLonLatTransform_ = getTransform(epsg4326Projection, projection);
this.toLonLatTransform_ = getTransform(projection, epsg4326Projection); this.toLonLatTransform_ = getTransform(projection, epsg4326Projection);
this.projectionCenterLonLat_ = this.toLonLatTransform_(getCenter(projection.getExtent())); this.projectionCenterLonLat_ = this.toLonLatTransform_(getCenter(extent));
this.projection_ = projection; this.projection_ = projection;
} };
/** /**
* Set the map for this graticule. The graticule will be rendered on the * Set the map for this graticule. The graticule will be rendered on the
@@ -706,7 +712,7 @@ class Graticule {
* @param {module:ol/PluggableMap} map Map. * @param {module:ol/PluggableMap} map Map.
* @api * @api
*/ */
setMap(map) { Graticule.prototype.setMap = function(map) {
if (this.map_) { if (this.map_) {
unlistenByKey(this.postcomposeListenerKey_); unlistenByKey(this.postcomposeListenerKey_);
this.postcomposeListenerKey_ = null; this.postcomposeListenerKey_ = null;
@@ -717,7 +723,5 @@ class Graticule {
map.render(); map.render();
} }
this.map_ = map; this.map_ = map;
} };
}
export default Graticule; export default Graticule;

View File

@@ -1,6 +1,7 @@
/** /**
* @module ol/Image * @module ol/Image
*/ */
import {inherits} from './index.js';
import ImageBase from './ImageBase.js'; import ImageBase from './ImageBase.js';
import ImageState from './ImageState.js'; import ImageState from './ImageState.js';
import {listenOnce, unlistenByKey} from './events.js'; import {listenOnce, unlistenByKey} from './events.js';
@@ -27,9 +28,9 @@ import {getHeight} from './extent.js';
*/ */
class ImageWrapper extends ImageBase {
/** /**
* @constructor
* @extends {module:ol/ImageBase}
* @param {module:ol/extent~Extent} extent Extent. * @param {module:ol/extent~Extent} extent Extent.
* @param {number|undefined} resolution Resolution. * @param {number|undefined} resolution Resolution.
* @param {number} pixelRatio Pixel ratio. * @param {number} pixelRatio Pixel ratio.
@@ -37,9 +38,9 @@ class ImageWrapper extends ImageBase {
* @param {?string} crossOrigin Cross origin. * @param {?string} crossOrigin Cross origin.
* @param {module:ol/Image~LoadFunction} imageLoadFunction Image load function. * @param {module:ol/Image~LoadFunction} imageLoadFunction Image load function.
*/ */
constructor(extent, resolution, pixelRatio, src, crossOrigin, imageLoadFunction) { const ImageWrapper = function(extent, resolution, pixelRatio, src, crossOrigin, imageLoadFunction) {
super(extent, resolution, pixelRatio, ImageState.IDLE); ImageBase.call(this, extent, resolution, pixelRatio, ImageState.IDLE);
/** /**
* @private * @private
@@ -49,7 +50,7 @@ class ImageWrapper extends ImageBase {
/** /**
* @private * @private
* @type {HTMLCanvasElement|HTMLImageElement|HTMLVideoElement} * @type {HTMLCanvasElement|Image|HTMLVideoElement}
*/ */
this.image_ = new Image(); this.image_ = new Image();
if (crossOrigin !== null) { if (crossOrigin !== null) {
@@ -74,40 +75,46 @@ class ImageWrapper extends ImageBase {
*/ */
this.imageLoadFunction_ = imageLoadFunction; this.imageLoadFunction_ = imageLoadFunction;
} };
inherits(ImageWrapper, ImageBase);
/** /**
* @inheritDoc * @inheritDoc
* @api * @api
*/ */
getImage() { ImageWrapper.prototype.getImage = function() {
return this.image_; return this.image_;
} };
/** /**
* Tracks loading or read errors. * Tracks loading or read errors.
* *
* @private * @private
*/ */
handleImageError_() { ImageWrapper.prototype.handleImageError_ = function() {
this.state = ImageState.ERROR; this.state = ImageState.ERROR;
this.unlistenImage_(); this.unlistenImage_();
this.changed(); this.changed();
} };
/** /**
* Tracks successful image load. * Tracks successful image load.
* *
* @private * @private
*/ */
handleImageLoad_() { ImageWrapper.prototype.handleImageLoad_ = function() {
if (this.resolution === undefined) { if (this.resolution === undefined) {
this.resolution = getHeight(this.extent) / this.image_.height; this.resolution = getHeight(this.extent) / this.image_.height;
} }
this.state = ImageState.LOADED; this.state = ImageState.LOADED;
this.unlistenImage_(); this.unlistenImage_();
this.changed(); this.changed();
} };
/** /**
* Load the image or retry if loading previously failed. * Load the image or retry if loading previously failed.
@@ -116,7 +123,7 @@ class ImageWrapper extends ImageBase {
* @override * @override
* @api * @api
*/ */
load() { ImageWrapper.prototype.load = function() {
if (this.state == ImageState.IDLE || this.state == ImageState.ERROR) { if (this.state == ImageState.IDLE || this.state == ImageState.ERROR) {
this.state = ImageState.LOADING; this.state = ImageState.LOADING;
this.changed(); this.changed();
@@ -128,25 +135,25 @@ class ImageWrapper extends ImageBase {
]; ];
this.imageLoadFunction_(this, this.src_); this.imageLoadFunction_(this, this.src_);
} }
} };
/** /**
* @param {HTMLCanvasElement|HTMLImageElement|HTMLVideoElement} image Image. * @param {HTMLCanvasElement|Image|HTMLVideoElement} image Image.
*/ */
setImage(image) { ImageWrapper.prototype.setImage = function(image) {
this.image_ = image; this.image_ = image;
} };
/** /**
* Discards event handlers which listen for load completion or errors. * Discards event handlers which listen for load completion or errors.
* *
* @private * @private
*/ */
unlistenImage_() { ImageWrapper.prototype.unlistenImage_ = function() {
this.imageListenerKeys_.forEach(unlistenByKey); this.imageListenerKeys_.forEach(unlistenByKey);
this.imageListenerKeys_ = null; this.imageListenerKeys_ = null;
} };
}
export default ImageWrapper; export default ImageWrapper;

View File

@@ -1,23 +1,22 @@
/** /**
* @module ol/ImageBase * @module ol/ImageBase
*/ */
import {inherits} from './index.js';
import EventTarget from './events/EventTarget.js'; import EventTarget from './events/EventTarget.js';
import EventType from './events/EventType.js'; import EventType from './events/EventType.js';
/** /**
* @constructor
* @abstract * @abstract
*/ * @extends {module:ol/events/EventTarget}
class ImageBase extends EventTarget {
/**
* @param {module:ol/extent~Extent} extent Extent. * @param {module:ol/extent~Extent} extent Extent.
* @param {number|undefined} resolution Resolution. * @param {number|undefined} resolution Resolution.
* @param {number} pixelRatio Pixel ratio. * @param {number} pixelRatio Pixel ratio.
* @param {module:ol/ImageState} state State. * @param {module:ol/ImageState} state State.
*/ */
constructor(extent, resolution, pixelRatio, state) { const ImageBase = function(extent, resolution, pixelRatio, state) {
super(); EventTarget.call(this);
/** /**
* @protected * @protected
@@ -43,55 +42,62 @@ class ImageBase extends EventTarget {
*/ */
this.state = state; this.state = state;
} };
inherits(ImageBase, EventTarget);
/** /**
* @protected * @protected
*/ */
changed() { ImageBase.prototype.changed = function() {
this.dispatchEvent(EventType.CHANGE); this.dispatchEvent(EventType.CHANGE);
} };
/** /**
* @return {module:ol/extent~Extent} Extent. * @return {module:ol/extent~Extent} Extent.
*/ */
getExtent() { ImageBase.prototype.getExtent = function() {
return this.extent; return this.extent;
} };
/** /**
* @abstract * @abstract
* @return {HTMLCanvasElement|HTMLImageElement|HTMLVideoElement} Image. * @return {HTMLCanvasElement|Image|HTMLVideoElement} Image.
*/ */
getImage() {} ImageBase.prototype.getImage = function() {};
/** /**
* @return {number} PixelRatio. * @return {number} PixelRatio.
*/ */
getPixelRatio() { ImageBase.prototype.getPixelRatio = function() {
return this.pixelRatio_; return this.pixelRatio_;
} };
/** /**
* @return {number} Resolution. * @return {number} Resolution.
*/ */
getResolution() { ImageBase.prototype.getResolution = function() {
return /** @type {number} */ (this.resolution); return /** @type {number} */ (this.resolution);
} };
/** /**
* @return {module:ol/ImageState} State. * @return {module:ol/ImageState} State.
*/ */
getState() { ImageBase.prototype.getState = function() {
return this.state; return this.state;
} };
/** /**
* Load not yet loaded URI. * Load not yet loaded URI.
* @abstract * @abstract
*/ */
load() {} ImageBase.prototype.load = function() {};
}
export default ImageBase; export default ImageBase;

View File

@@ -1,6 +1,7 @@
/** /**
* @module ol/ImageCanvas * @module ol/ImageCanvas
*/ */
import {inherits} from './index.js';
import ImageBase from './ImageBase.js'; import ImageBase from './ImageBase.js';
import ImageState from './ImageState.js'; import ImageState from './ImageState.js';
@@ -15,9 +16,9 @@ import ImageState from './ImageState.js';
*/ */
class ImageCanvas extends ImageBase {
/** /**
* @constructor
* @extends {module:ol/ImageBase}
* @param {module:ol/extent~Extent} extent Extent. * @param {module:ol/extent~Extent} extent Extent.
* @param {number} resolution Resolution. * @param {number} resolution Resolution.
* @param {number} pixelRatio Pixel ratio. * @param {number} pixelRatio Pixel ratio.
@@ -25,11 +26,7 @@ class ImageCanvas extends ImageBase {
* @param {module:ol/ImageCanvas~Loader=} opt_loader Optional loader function to * @param {module:ol/ImageCanvas~Loader=} opt_loader Optional loader function to
* support asynchronous canvas drawing. * support asynchronous canvas drawing.
*/ */
constructor(extent, resolution, pixelRatio, canvas, opt_loader) { const ImageCanvas = function(extent, resolution, pixelRatio, canvas, opt_loader) {
const state = opt_loader !== undefined ? ImageState.IDLE : ImageState.LOADED;
super(extent, resolution, pixelRatio, state);
/** /**
* Optional canvas loader function. * Optional canvas loader function.
@@ -38,6 +35,10 @@ class ImageCanvas extends ImageBase {
*/ */
this.loader_ = opt_loader !== undefined ? opt_loader : null; this.loader_ = opt_loader !== undefined ? opt_loader : null;
const state = opt_loader !== undefined ? ImageState.IDLE : ImageState.LOADED;
ImageBase.call(this, extent, resolution, pixelRatio, state);
/** /**
* @private * @private
* @type {HTMLCanvasElement} * @type {HTMLCanvasElement}
@@ -50,22 +51,26 @@ class ImageCanvas extends ImageBase {
*/ */
this.error_ = null; this.error_ = null;
} };
inherits(ImageCanvas, ImageBase);
/** /**
* Get any error associated with asynchronous rendering. * Get any error associated with asynchronous rendering.
* @return {Error} Any error that occurred during rendering. * @return {Error} Any error that occurred during rendering.
*/ */
getError() { ImageCanvas.prototype.getError = function() {
return this.error_; return this.error_;
} };
/** /**
* Handle async drawing complete. * Handle async drawing complete.
* @param {Error} err Any error during drawing. * @param {Error} err Any error during drawing.
* @private * @private
*/ */
handleLoad_(err) { ImageCanvas.prototype.handleLoad_ = function(err) {
if (err) { if (err) {
this.error_ = err; this.error_ = err;
this.state = ImageState.ERROR; this.state = ImageState.ERROR;
@@ -73,26 +78,25 @@ class ImageCanvas extends ImageBase {
this.state = ImageState.LOADED; this.state = ImageState.LOADED;
} }
this.changed(); this.changed();
} };
/** /**
* @inheritDoc * @inheritDoc
*/ */
load() { ImageCanvas.prototype.load = function() {
if (this.state == ImageState.IDLE) { if (this.state == ImageState.IDLE) {
this.state = ImageState.LOADING; this.state = ImageState.LOADING;
this.changed(); this.changed();
this.loader_(this.handleLoad_.bind(this)); this.loader_(this.handleLoad_.bind(this));
} }
} };
/** /**
* @return {HTMLCanvasElement} Canvas element. * @return {HTMLCanvasElement} Canvas element.
*/ */
getImage() { ImageCanvas.prototype.getImage = function() {
return this.canvas_; return this.canvas_;
} };
}
export default ImageCanvas; export default ImageCanvas;

View File

@@ -1,6 +1,7 @@
/** /**
* @module ol/ImageTile * @module ol/ImageTile
*/ */
import {inherits} from './index.js';
import Tile from './Tile.js'; import Tile from './Tile.js';
import TileState from './TileState.js'; import TileState from './TileState.js';
import {createCanvasContext2D} from './dom.js'; import {createCanvasContext2D} from './dom.js';
@@ -13,9 +14,9 @@ import EventType from './events/EventType.js';
* @api * @api
*/ */
class ImageTile extends Tile {
/** /**
* @constructor
* @extends {module:ol/Tile}
* @param {module:ol/tilecoord~TileCoord} tileCoord Tile coordinate. * @param {module:ol/tilecoord~TileCoord} tileCoord Tile coordinate.
* @param {module:ol/TileState} state State. * @param {module:ol/TileState} state State.
* @param {string} src Image source URI. * @param {string} src Image source URI.
@@ -23,9 +24,9 @@ class ImageTile extends Tile {
* @param {module:ol/Tile~LoadFunction} tileLoadFunction Tile load function. * @param {module:ol/Tile~LoadFunction} tileLoadFunction Tile load function.
* @param {module:ol/Tile~Options=} opt_options Tile options. * @param {module:ol/Tile~Options=} opt_options Tile options.
*/ */
constructor(tileCoord, state, src, crossOrigin, tileLoadFunction, opt_options) { const ImageTile = function(tileCoord, state, src, crossOrigin, tileLoadFunction, opt_options) {
super(tileCoord, state, opt_options); Tile.call(this, tileCoord, state, opt_options);
/** /**
* @private * @private
@@ -43,7 +44,7 @@ class ImageTile extends Tile {
/** /**
* @private * @private
* @type {HTMLImageElement|HTMLCanvasElement} * @type {Image|HTMLCanvasElement}
*/ */
this.image_ = new Image(); this.image_ = new Image();
if (crossOrigin !== null) { if (crossOrigin !== null) {
@@ -62,12 +63,15 @@ class ImageTile extends Tile {
*/ */
this.tileLoadFunction_ = tileLoadFunction; this.tileLoadFunction_ = tileLoadFunction;
} };
inherits(ImageTile, Tile);
/** /**
* @inheritDoc * @inheritDoc
*/ */
disposeInternal() { ImageTile.prototype.disposeInternal = function() {
if (this.state == TileState.LOADING) { if (this.state == TileState.LOADING) {
this.unlistenImage_(); this.unlistenImage_();
this.image_ = getBlankImage(); this.image_ = getBlankImage();
@@ -77,43 +81,47 @@ class ImageTile extends Tile {
} }
this.state = TileState.ABORT; this.state = TileState.ABORT;
this.changed(); this.changed();
super.disposeInternal(); Tile.prototype.disposeInternal.call(this);
} };
/** /**
* Get the HTML image element for this tile (may be a Canvas, Image, or Video). * Get the HTML image element for this tile (may be a Canvas, Image, or Video).
* @return {HTMLCanvasElement|HTMLImageElement|HTMLVideoElement} Image. * @return {HTMLCanvasElement|HTMLImageElement|HTMLVideoElement} Image.
* @api * @api
*/ */
getImage() { ImageTile.prototype.getImage = function() {
return this.image_; return this.image_;
} };
/** /**
* @inheritDoc * @inheritDoc
*/ */
getKey() { ImageTile.prototype.getKey = function() {
return this.src_; return this.src_;
} };
/** /**
* Tracks loading or read errors. * Tracks loading or read errors.
* *
* @private * @private
*/ */
handleImageError_() { ImageTile.prototype.handleImageError_ = function() {
this.state = TileState.ERROR; this.state = TileState.ERROR;
this.unlistenImage_(); this.unlistenImage_();
this.image_ = getBlankImage(); this.image_ = getBlankImage();
this.changed(); this.changed();
} };
/** /**
* Tracks successful image load. * Tracks successful image load.
* *
* @private * @private
*/ */
handleImageLoad_() { ImageTile.prototype.handleImageLoad_ = function() {
if (this.image_.naturalWidth && this.image_.naturalHeight) { if (this.image_.naturalWidth && this.image_.naturalHeight) {
this.state = TileState.LOADED; this.state = TileState.LOADED;
} else { } else {
@@ -121,13 +129,14 @@ class ImageTile extends Tile {
} }
this.unlistenImage_(); this.unlistenImage_();
this.changed(); this.changed();
} };
/** /**
* @inheritDoc * @inheritDoc
* @api * @api
*/ */
load() { ImageTile.prototype.load = function() {
if (this.state == TileState.ERROR) { if (this.state == TileState.ERROR) {
this.state = TileState.IDLE; this.state = TileState.IDLE;
this.image_ = new Image(); this.image_ = new Image();
@@ -146,18 +155,18 @@ class ImageTile extends Tile {
]; ];
this.tileLoadFunction_(this, this.src_); this.tileLoadFunction_(this, this.src_);
} }
} };
/** /**
* Discards event handlers which listen for load completion or errors. * Discards event handlers which listen for load completion or errors.
* *
* @private * @private
*/ */
unlistenImage_() { ImageTile.prototype.unlistenImage_ = function() {
this.imageListenerKeys_.forEach(unlistenByKey); this.imageListenerKeys_.forEach(unlistenByKey);
this.imageListenerKeys_ = null; this.imageListenerKeys_ = null;
} };
}
/** /**

View File

@@ -6,17 +6,15 @@
* @classdesc * @classdesc
* Implementation of inertial deceleration for map movement. * Implementation of inertial deceleration for map movement.
* *
* @api * @constructor
*/
class Kinetic {
/**
* @param {number} decay Rate of decay (must be negative). * @param {number} decay Rate of decay (must be negative).
* @param {number} minVelocity Minimum velocity (pixels/millisecond). * @param {number} minVelocity Minimum velocity (pixels/millisecond).
* @param {number} delay Delay to consider to calculate the kinetic * @param {number} delay Delay to consider to calculate the kinetic
* initial values (milliseconds). * initial values (milliseconds).
* @struct
* @api
*/ */
constructor(decay, minVelocity, delay) { const Kinetic = function(decay, minVelocity, delay) {
/** /**
* @private * @private
@@ -53,29 +51,32 @@ class Kinetic {
* @type {number} * @type {number}
*/ */
this.initialVelocity_ = 0; this.initialVelocity_ = 0;
} };
/** /**
* FIXME empty description for jsdoc * FIXME empty description for jsdoc
*/ */
begin() { Kinetic.prototype.begin = function() {
this.points_.length = 0; this.points_.length = 0;
this.angle_ = 0; this.angle_ = 0;
this.initialVelocity_ = 0; this.initialVelocity_ = 0;
} };
/** /**
* @param {number} x X. * @param {number} x X.
* @param {number} y Y. * @param {number} y Y.
*/ */
update(x, y) { Kinetic.prototype.update = function(x, y) {
this.points_.push(x, y, Date.now()); this.points_.push(x, y, Date.now());
} };
/** /**
* @return {boolean} Whether we should do kinetic animation. * @return {boolean} Whether we should do kinetic animation.
*/ */
end() { Kinetic.prototype.end = function() {
if (this.points_.length < 6) { if (this.points_.length < 6) {
// at least 2 points are required (i.e. there must be at least 6 elements // at least 2 points are required (i.e. there must be at least 6 elements
// in the array) // in the array)
@@ -108,21 +109,21 @@ class Kinetic {
this.angle_ = Math.atan2(dy, dx); this.angle_ = Math.atan2(dy, dx);
this.initialVelocity_ = Math.sqrt(dx * dx + dy * dy) / duration; this.initialVelocity_ = Math.sqrt(dx * dx + dy * dy) / duration;
return this.initialVelocity_ > this.minVelocity_; return this.initialVelocity_ > this.minVelocity_;
} };
/** /**
* @return {number} Total distance travelled (pixels). * @return {number} Total distance travelled (pixels).
*/ */
getDistance() { Kinetic.prototype.getDistance = function() {
return (this.minVelocity_ - this.initialVelocity_) / this.decay_; return (this.minVelocity_ - this.initialVelocity_) / this.decay_;
} };
/** /**
* @return {number} Angle of the kinetic panning animation (radians). * @return {number} Angle of the kinetic panning animation (radians).
*/ */
getAngle() { Kinetic.prototype.getAngle = function() {
return this.angle_; return this.angle_;
} };
}
export default Kinetic; export default Kinetic;

View File

@@ -1,6 +1,7 @@
/** /**
* @module ol/Map * @module ol/Map
*/ */
import {inherits} from './index.js';
import PluggableMap from './PluggableMap.js'; import PluggableMap from './PluggableMap.js';
import {defaults as defaultControls} from './control/util.js'; import {defaults as defaultControls} from './control/util.js';
import {defaults as defaultInteractions} from './interaction.js'; import {defaults as defaultInteractions} from './interaction.js';
@@ -56,18 +57,16 @@ import CanvasVectorTileLayerRenderer from './renderer/canvas/VectorTileLayer.js'
* options or added with `addLayer` can be groups, which can contain further * options or added with `addLayer` can be groups, which can contain further
* groups, and so on. * groups, and so on.
* *
* @constructor
* @extends {module:ol/PluggableMap}
* @param {module:ol/PluggableMap~MapOptions} options Map options.
* @fires module:ol/MapBrowserEvent~MapBrowserEvent * @fires module:ol/MapBrowserEvent~MapBrowserEvent
* @fires module:ol/MapEvent~MapEvent * @fires module:ol/MapEvent~MapEvent
* @fires module:ol/render/Event~RenderEvent#postcompose * @fires module:ol/render/Event~RenderEvent#postcompose
* @fires module:ol/render/Event~RenderEvent#precompose * @fires module:ol/render/Event~RenderEvent#precompose
* @api * @api
*/ */
class Map extends PluggableMap { const Map = function(options) {
/**
* @param {module:ol/PluggableMap~MapOptions} options Map options.
*/
constructor(options) {
options = assign({}, options); options = assign({}, options);
if (!options.controls) { if (!options.controls) {
options.controls = defaultControls(); options.controls = defaultControls();
@@ -76,10 +75,12 @@ class Map extends PluggableMap {
options.interactions = defaultInteractions(); options.interactions = defaultInteractions();
} }
super(options); PluggableMap.call(this, options);
} };
createRenderer() { inherits(Map, PluggableMap);
Map.prototype.createRenderer = function() {
const renderer = new CanvasMapRenderer(this); const renderer = new CanvasMapRenderer(this);
renderer.registerLayerRenderers([ renderer.registerLayerRenderers([
CanvasImageLayerRenderer, CanvasImageLayerRenderer,
@@ -88,8 +89,6 @@ class Map extends PluggableMap {
CanvasVectorTileLayerRenderer CanvasVectorTileLayerRenderer
]); ]);
return renderer; return renderer;
} };
}
export default Map; export default Map;

View File

@@ -1,25 +1,25 @@
/** /**
* @module ol/MapBrowserEvent * @module ol/MapBrowserEvent
*/ */
import {inherits} from './index.js';
import MapEvent from './MapEvent.js'; import MapEvent from './MapEvent.js';
/** /**
* @classdesc * @classdesc
* Events emitted as map browser events are instances of this type. * Events emitted as map browser events are instances of this type.
* See {@link module:ol/Map~Map} for which events trigger a map browser event. * See {@link module:ol/Map~Map} for which events trigger a map browser event.
*/ *
class MapBrowserEvent extends MapEvent { * @constructor
* @extends {module:ol/MapEvent}
/**
* @param {string} type Event type. * @param {string} type Event type.
* @param {module:ol/PluggableMap} map Map. * @param {module:ol/PluggableMap} map Map.
* @param {Event} browserEvent Browser event. * @param {Event} browserEvent Browser event.
* @param {boolean=} opt_dragging Is the map currently being dragged? * @param {boolean=} opt_dragging Is the map currently being dragged?
* @param {?module:ol/PluggableMap~FrameState=} opt_frameState Frame state. * @param {?module:ol/PluggableMap~FrameState=} opt_frameState Frame state.
*/ */
constructor(type, map, browserEvent, opt_dragging, opt_frameState) { const MapBrowserEvent = function(type, map, browserEvent, opt_dragging, opt_frameState) {
super(type, map, opt_frameState); MapEvent.call(this, type, map, opt_frameState);
/** /**
* The original browser event. * The original browser event.
@@ -31,7 +31,7 @@ class MapBrowserEvent extends MapEvent {
/** /**
* The map pixel relative to the viewport corresponding to the original browser event. * The map pixel relative to the viewport corresponding to the original browser event.
* @type {module:ol/pixel~Pixel} * @type {module:ol~Pixel}
* @api * @api
*/ */
this.pixel = map.getEventPixel(browserEvent); this.pixel = map.getEventPixel(browserEvent);
@@ -52,30 +52,31 @@ class MapBrowserEvent extends MapEvent {
*/ */
this.dragging = opt_dragging !== undefined ? opt_dragging : false; this.dragging = opt_dragging !== undefined ? opt_dragging : false;
} };
inherits(MapBrowserEvent, MapEvent);
/** /**
* Prevents the default browser action. * Prevents the default browser action.
* See https://developer.mozilla.org/en-US/docs/Web/API/event.preventDefault. * @see https://developer.mozilla.org/en-US/docs/Web/API/event.preventDefault
* @override * @override
* @api * @api
*/ */
preventDefault() { MapBrowserEvent.prototype.preventDefault = function() {
super.preventDefault(); MapEvent.prototype.preventDefault.call(this);
this.originalEvent.preventDefault(); this.originalEvent.preventDefault();
} };
/** /**
* Prevents further propagation of the current event. * Prevents further propagation of the current event.
* See https://developer.mozilla.org/en-US/docs/Web/API/event.stopPropagation. * @see https://developer.mozilla.org/en-US/docs/Web/API/event.stopPropagation
* @override * @override
* @api * @api
*/ */
stopPropagation() { MapBrowserEvent.prototype.stopPropagation = function() {
super.stopPropagation(); MapEvent.prototype.stopPropagation.call(this);
this.originalEvent.stopPropagation(); this.originalEvent.stopPropagation();
} };
}
export default MapBrowserEvent; export default MapBrowserEvent;

View File

@@ -1,6 +1,7 @@
/** /**
* @module ol/MapBrowserEventHandler * @module ol/MapBrowserEventHandler
*/ */
import {inherits} from './index.js';
import {DEVICE_PIXEL_RATIO} from './has.js'; import {DEVICE_PIXEL_RATIO} from './has.js';
import MapBrowserEventType from './MapBrowserEventType.js'; import MapBrowserEventType from './MapBrowserEventType.js';
import MapBrowserPointerEvent from './MapBrowserPointerEvent.js'; import MapBrowserPointerEvent from './MapBrowserPointerEvent.js';
@@ -9,15 +10,17 @@ import EventTarget from './events/EventTarget.js';
import PointerEventType from './pointer/EventType.js'; import PointerEventType from './pointer/EventType.js';
import PointerEventHandler from './pointer/PointerEventHandler.js'; import PointerEventHandler from './pointer/PointerEventHandler.js';
class MapBrowserEventHandler extends EventTarget {
/** /**
* @param {module:ol/PluggableMap} map The map with the viewport to listen to events on. * @param {module:ol/PluggableMap} map The map with the viewport to
* @param {number=} moveTolerance The minimal distance the pointer must travel to trigger a move. * listen to events on.
* @param {number=} moveTolerance The minimal distance the pointer must travel
* to trigger a move.
* @constructor
* @extends {module:ol/events/EventTarget}
*/ */
constructor(map, moveTolerance) { const MapBrowserEventHandler = function(map, moveTolerance) {
super(); EventTarget.call(this);
/** /**
* This is the element that we will listen to the real events on. * This is the element that we will listen to the real events on.
@@ -107,14 +110,17 @@ class MapBrowserEventHandler extends EventTarget {
PointerEventType.POINTERMOVE, PointerEventType.POINTERMOVE,
this.relayEvent_, this); this.relayEvent_, this);
} };
inherits(MapBrowserEventHandler, EventTarget);
/** /**
* @param {module:ol/pointer/PointerEvent} pointerEvent Pointer * @param {module:ol/pointer/PointerEvent} pointerEvent Pointer
* event. * event.
* @private * @private
*/ */
emulateClick_(pointerEvent) { MapBrowserEventHandler.prototype.emulateClick_ = function(pointerEvent) {
let newEvent = new MapBrowserPointerEvent( let newEvent = new MapBrowserPointerEvent(
MapBrowserEventType.CLICK, this.map_, pointerEvent); MapBrowserEventType.CLICK, this.map_, pointerEvent);
this.dispatchEvent(newEvent); this.dispatchEvent(newEvent);
@@ -134,7 +140,8 @@ class MapBrowserEventHandler extends EventTarget {
this.dispatchEvent(newEvent); this.dispatchEvent(newEvent);
}.bind(this), 250); }.bind(this), 250);
} }
} };
/** /**
* Keeps track on how many pointers are currently active. * Keeps track on how many pointers are currently active.
@@ -143,7 +150,7 @@ class MapBrowserEventHandler extends EventTarget {
* event. * event.
* @private * @private
*/ */
updateActivePointers_(pointerEvent) { MapBrowserEventHandler.prototype.updateActivePointers_ = function(pointerEvent) {
const event = pointerEvent; const event = pointerEvent;
if (event.type == MapBrowserEventType.POINTERUP || if (event.type == MapBrowserEventType.POINTERUP ||
@@ -153,14 +160,15 @@ class MapBrowserEventHandler extends EventTarget {
this.trackedTouches_[event.pointerId] = true; this.trackedTouches_[event.pointerId] = true;
} }
this.activePointers_ = Object.keys(this.trackedTouches_).length; this.activePointers_ = Object.keys(this.trackedTouches_).length;
} };
/** /**
* @param {module:ol/pointer/PointerEvent} pointerEvent Pointer * @param {module:ol/pointer/PointerEvent} pointerEvent Pointer
* event. * event.
* @private * @private
*/ */
handlePointerUp_(pointerEvent) { MapBrowserEventHandler.prototype.handlePointerUp_ = function(pointerEvent) {
this.updateActivePointers_(pointerEvent); this.updateActivePointers_(pointerEvent);
const newEvent = new MapBrowserPointerEvent( const newEvent = new MapBrowserPointerEvent(
MapBrowserEventType.POINTERUP, this.map_, pointerEvent); MapBrowserEventType.POINTERUP, this.map_, pointerEvent);
@@ -184,7 +192,8 @@ class MapBrowserEventHandler extends EventTarget {
this.documentPointerEventHandler_.dispose(); this.documentPointerEventHandler_.dispose();
this.documentPointerEventHandler_ = null; this.documentPointerEventHandler_ = null;
} }
} };
/** /**
* @param {module:ol/pointer/PointerEvent} pointerEvent Pointer * @param {module:ol/pointer/PointerEvent} pointerEvent Pointer
@@ -192,16 +201,17 @@ class MapBrowserEventHandler extends EventTarget {
* @return {boolean} If the left mouse button was pressed. * @return {boolean} If the left mouse button was pressed.
* @private * @private
*/ */
isMouseActionButton_(pointerEvent) { MapBrowserEventHandler.prototype.isMouseActionButton_ = function(pointerEvent) {
return pointerEvent.button === 0; return pointerEvent.button === 0;
} };
/** /**
* @param {module:ol/pointer/PointerEvent} pointerEvent Pointer * @param {module:ol/pointer/PointerEvent} pointerEvent Pointer
* event. * event.
* @private * @private
*/ */
handlePointerDown_(pointerEvent) { MapBrowserEventHandler.prototype.handlePointerDown_ = function(pointerEvent) {
this.updateActivePointers_(pointerEvent); this.updateActivePointers_(pointerEvent);
const newEvent = new MapBrowserPointerEvent( const newEvent = new MapBrowserPointerEvent(
MapBrowserEventType.POINTERDOWN, this.map_, pointerEvent); MapBrowserEventType.POINTERDOWN, this.map_, pointerEvent);
@@ -242,14 +252,15 @@ class MapBrowserEventHandler extends EventTarget {
this.handlePointerUp_, this) this.handlePointerUp_, this)
); );
} }
} };
/** /**
* @param {module:ol/pointer/PointerEvent} pointerEvent Pointer * @param {module:ol/pointer/PointerEvent} pointerEvent Pointer
* event. * event.
* @private * @private
*/ */
handlePointerMove_(pointerEvent) { MapBrowserEventHandler.prototype.handlePointerMove_ = function(pointerEvent) {
// Between pointerdown and pointerup, pointermove events are triggered. // Between pointerdown and pointerup, pointermove events are triggered.
// To avoid a 'false' touchmove event to be dispatched, we test if the pointer // To avoid a 'false' touchmove event to be dispatched, we test if the pointer
// moved a significant distance. // moved a significant distance.
@@ -266,7 +277,8 @@ class MapBrowserEventHandler extends EventTarget {
// https://code.google.com/p/android/issues/detail?id=19827 // https://code.google.com/p/android/issues/detail?id=19827
// ex: Galaxy Tab P3110 + Android 4.1.1 // ex: Galaxy Tab P3110 + Android 4.1.1
pointerEvent.preventDefault(); pointerEvent.preventDefault();
} };
/** /**
* Wrap and relay a pointer event. Note that this requires that the type * Wrap and relay a pointer event. Note that this requires that the type
@@ -275,11 +287,12 @@ class MapBrowserEventHandler extends EventTarget {
* event. * event.
* @private * @private
*/ */
relayEvent_(pointerEvent) { MapBrowserEventHandler.prototype.relayEvent_ = function(pointerEvent) {
const dragging = !!(this.down_ && this.isMoving_(pointerEvent)); const dragging = !!(this.down_ && this.isMoving_(pointerEvent));
this.dispatchEvent(new MapBrowserPointerEvent( this.dispatchEvent(new MapBrowserPointerEvent(
pointerEvent.type, this.map_, pointerEvent, dragging)); pointerEvent.type, this.map_, pointerEvent, dragging));
} };
/** /**
* @param {module:ol/pointer/PointerEvent} pointerEvent Pointer * @param {module:ol/pointer/PointerEvent} pointerEvent Pointer
@@ -287,16 +300,16 @@ class MapBrowserEventHandler extends EventTarget {
* @return {boolean} Is moving. * @return {boolean} Is moving.
* @private * @private
*/ */
isMoving_(pointerEvent) { MapBrowserEventHandler.prototype.isMoving_ = function(pointerEvent) {
return this.dragging_ || return Math.abs(pointerEvent.clientX - this.down_.clientX) > this.moveTolerance_ ||
Math.abs(pointerEvent.clientX - this.down_.clientX) > this.moveTolerance_ ||
Math.abs(pointerEvent.clientY - this.down_.clientY) > this.moveTolerance_; Math.abs(pointerEvent.clientY - this.down_.clientY) > this.moveTolerance_;
} };
/** /**
* @inheritDoc * @inheritDoc
*/ */
disposeInternal() { MapBrowserEventHandler.prototype.disposeInternal = function() {
if (this.relayedListenerKey_) { if (this.relayedListenerKey_) {
unlistenByKey(this.relayedListenerKey_); unlistenByKey(this.relayedListenerKey_);
this.relayedListenerKey_ = null; this.relayedListenerKey_ = null;
@@ -317,9 +330,6 @@ class MapBrowserEventHandler extends EventTarget {
this.pointerEventHandler_.dispose(); this.pointerEventHandler_.dispose();
this.pointerEventHandler_ = null; this.pointerEventHandler_ = null;
} }
super.disposeInternal(); EventTarget.prototype.disposeInternal.call(this);
} };
}
export default MapBrowserEventHandler; export default MapBrowserEventHandler;

View File

@@ -1,20 +1,24 @@
/** /**
* @module ol/MapBrowserPointerEvent * @module ol/MapBrowserPointerEvent
*/ */
import {inherits} from './index.js';
import MapBrowserEvent from './MapBrowserEvent.js'; import MapBrowserEvent from './MapBrowserEvent.js';
class MapBrowserPointerEvent extends MapBrowserEvent {
/** /**
* @constructor
* @extends {module:ol/MapBrowserEvent}
* @param {string} type Event type. * @param {string} type Event type.
* @param {module:ol/PluggableMap} map Map. * @param {module:ol/PluggableMap} map Map.
* @param {module:ol/pointer/PointerEvent} pointerEvent Pointer event. * @param {module:ol/pointer/PointerEvent} pointerEvent Pointer
* event.
* @param {boolean=} opt_dragging Is the map currently being dragged? * @param {boolean=} opt_dragging Is the map currently being dragged?
* @param {?module:ol/PluggableMap~FrameState=} opt_frameState Frame state. * @param {?module:ol/PluggableMap~FrameState=} opt_frameState Frame state.
*/ */
constructor(type, map, pointerEvent, opt_dragging, opt_frameState) { const MapBrowserPointerEvent = function(type, map, pointerEvent, opt_dragging,
opt_frameState) {
super(type, map, pointerEvent.originalEvent, opt_dragging, opt_frameState); MapBrowserEvent.call(this, type, map, pointerEvent.originalEvent, opt_dragging,
opt_frameState);
/** /**
* @const * @const
@@ -22,8 +26,7 @@ class MapBrowserPointerEvent extends MapBrowserEvent {
*/ */
this.pointerEvent = pointerEvent; this.pointerEvent = pointerEvent;
} };
}
inherits(MapBrowserPointerEvent, MapBrowserEvent);
export default MapBrowserPointerEvent; export default MapBrowserPointerEvent;

View File

@@ -1,23 +1,23 @@
/** /**
* @module ol/MapEvent * @module ol/MapEvent
*/ */
import {inherits} from './index.js';
import Event from './events/Event.js'; import Event from './events/Event.js';
/** /**
* @classdesc * @classdesc
* Events emitted as map events are instances of this type. * Events emitted as map events are instances of this type.
* See {@link module:ol/Map~Map} for which events trigger a map event. * See {@link module:ol/Map~Map} for which events trigger a map event.
*/ *
class MapEvent extends Event { * @constructor
* @extends {module:ol/events/Event}
/**
* @param {string} type Event type. * @param {string} type Event type.
* @param {module:ol/PluggableMap} map Map. * @param {module:ol/PluggableMap} map Map.
* @param {?module:ol/PluggableMap~FrameState=} opt_frameState Frame state. * @param {?module:ol/PluggableMap~FrameState=} opt_frameState Frame state.
*/ */
constructor(type, map, opt_frameState) { const MapEvent = function(type, map, opt_frameState) {
super(type); Event.call(this, type);
/** /**
* The map where the event occurred. * The map where the event occurred.
@@ -33,8 +33,7 @@ class MapEvent extends Event {
*/ */
this.frameState = opt_frameState !== undefined ? opt_frameState : null; this.frameState = opt_frameState !== undefined ? opt_frameState : null;
} };
}
inherits(MapEvent, Event);
export default MapEvent; export default MapEvent;

View File

@@ -1,7 +1,7 @@
/** /**
* @module ol/Object * @module ol/Object
*/ */
import {getUid} from './util.js'; import {getUid, inherits} from './index.js';
import ObjectEventType from './ObjectEventType.js'; import ObjectEventType from './ObjectEventType.js';
import Observable from './Observable.js'; import Observable from './Observable.js';
import Event from './events/Event.js'; import Event from './events/Event.js';
@@ -10,17 +10,17 @@ import {assign} from './obj.js';
/** /**
* @classdesc * @classdesc
* Events emitted by {@link module:ol/Object~BaseObject} instances are instances of this type. * Events emitted by {@link module:ol/Object~BaseObject} instances are instances of
*/ * this type.
class ObjectEvent extends Event { *
/**
* @param {string} type The event type. * @param {string} type The event type.
* @param {string} key The property name. * @param {string} key The property name.
* @param {*} oldValue The old value for `key`. * @param {*} oldValue The old value for `key`.
* @extends {module:ol/events/Event}
* @constructor
*/ */
constructor(type, key, oldValue) { const ObjectEvent = function(type, key, oldValue) {
super(type); Event.call(this, type);
/** /**
* The name of the property whose value is changing. * The name of the property whose value is changing.
@@ -37,9 +37,8 @@ class ObjectEvent extends Event {
*/ */
this.oldValue = oldValue; this.oldValue = oldValue;
} };
inherits(ObjectEvent, Event);
}
/** /**
@@ -82,18 +81,16 @@ class ObjectEvent extends Event {
* Properties can be deleted by using the unset method. E.g. * Properties can be deleted by using the unset method. E.g.
* object.unset('foo'). * object.unset('foo').
* *
* @constructor
* @extends {module:ol/Observable}
* @param {Object.<string, *>=} opt_values An object with key-value pairs.
* @fires module:ol/Object~ObjectEvent * @fires module:ol/Object~ObjectEvent
* @api * @api
*/ */
class BaseObject extends Observable { const BaseObject = function(opt_values) {
Observable.call(this);
/** // Call {@link module:ol~getUid} to ensure that the order of objects' ids is
* @param {Object.<string, *>=} opt_values An object with key-value pairs.
*/
constructor(opt_values) {
super();
// Call {@link module:ol/util~getUid} to ensure that the order of objects' ids is
// the same as the order in which they were created. This also helps to // the same as the order in which they were created. This also helps to
// ensure that object properties are always added in the same order, which // ensure that object properties are always added in the same order, which
// helps many JavaScript engines generate faster code. // helps many JavaScript engines generate faster code.
@@ -108,100 +105,9 @@ class BaseObject extends Observable {
if (opt_values !== undefined) { if (opt_values !== undefined) {
this.setProperties(opt_values); this.setProperties(opt_values);
} }
} };
/** inherits(BaseObject, Observable);
* Gets a value.
* @param {string} key Key name.
* @return {*} Value.
* @api
*/
get(key) {
let value;
if (this.values_.hasOwnProperty(key)) {
value = this.values_[key];
}
return value;
}
/**
* Get a list of object property names.
* @return {Array.<string>} List of property names.
* @api
*/
getKeys() {
return Object.keys(this.values_);
}
/**
* Get an object of all property names and values.
* @return {Object.<string, *>} Object.
* @api
*/
getProperties() {
return assign({}, this.values_);
}
/**
* @param {string} key Key name.
* @param {*} oldValue Old value.
*/
notify(key, oldValue) {
let eventType;
eventType = getChangeEventType(key);
this.dispatchEvent(new ObjectEvent(eventType, key, oldValue));
eventType = ObjectEventType.PROPERTYCHANGE;
this.dispatchEvent(new ObjectEvent(eventType, key, oldValue));
}
/**
* Sets a value.
* @param {string} key Key name.
* @param {*} value Value.
* @param {boolean=} opt_silent Update without triggering an event.
* @api
*/
set(key, value, opt_silent) {
if (opt_silent) {
this.values_[key] = value;
} else {
const oldValue = this.values_[key];
this.values_[key] = value;
if (oldValue !== value) {
this.notify(key, oldValue);
}
}
}
/**
* Sets a collection of key-value pairs. Note that this changes any existing
* properties and adds new ones (it does not remove any existing properties).
* @param {Object.<string, *>} values Values.
* @param {boolean=} opt_silent Update without triggering an event.
* @api
*/
setProperties(values, opt_silent) {
for (const key in values) {
this.set(key, values[key], opt_silent);
}
}
/**
* Unsets a property.
* @param {string} key Key name.
* @param {boolean=} opt_silent Unset without triggering an event.
* @api
*/
unset(key, opt_silent) {
if (key in this.values_) {
const oldValue = this.values_[key];
delete this.values_[key];
if (!opt_silent) {
this.notify(key, oldValue);
}
}
}
}
/** /**
@@ -221,4 +127,103 @@ export function getChangeEventType(key) {
} }
/**
* Gets a value.
* @param {string} key Key name.
* @return {*} Value.
* @api
*/
BaseObject.prototype.get = function(key) {
let value;
if (this.values_.hasOwnProperty(key)) {
value = this.values_[key];
}
return value;
};
/**
* Get a list of object property names.
* @return {Array.<string>} List of property names.
* @api
*/
BaseObject.prototype.getKeys = function() {
return Object.keys(this.values_);
};
/**
* Get an object of all property names and values.
* @return {Object.<string, *>} Object.
* @api
*/
BaseObject.prototype.getProperties = function() {
return assign({}, this.values_);
};
/**
* @param {string} key Key name.
* @param {*} oldValue Old value.
*/
BaseObject.prototype.notify = function(key, oldValue) {
let eventType;
eventType = getChangeEventType(key);
this.dispatchEvent(new ObjectEvent(eventType, key, oldValue));
eventType = ObjectEventType.PROPERTYCHANGE;
this.dispatchEvent(new ObjectEvent(eventType, key, oldValue));
};
/**
* Sets a value.
* @param {string} key Key name.
* @param {*} value Value.
* @param {boolean=} opt_silent Update without triggering an event.
* @api
*/
BaseObject.prototype.set = function(key, value, opt_silent) {
if (opt_silent) {
this.values_[key] = value;
} else {
const oldValue = this.values_[key];
this.values_[key] = value;
if (oldValue !== value) {
this.notify(key, oldValue);
}
}
};
/**
* Sets a collection of key-value pairs. Note that this changes any existing
* properties and adds new ones (it does not remove any existing properties).
* @param {Object.<string, *>} values Values.
* @param {boolean=} opt_silent Update without triggering an event.
* @api
*/
BaseObject.prototype.setProperties = function(values, opt_silent) {
for (const key in values) {
this.set(key, values[key], opt_silent);
}
};
/**
* Unsets a property.
* @param {string} key Key name.
* @param {boolean=} opt_silent Unset without triggering an event.
* @api
*/
BaseObject.prototype.unset = function(key, opt_silent) {
if (key in this.values_) {
const oldValue = this.values_[key];
delete this.values_[key];
if (!opt_silent) {
this.notify(key, oldValue);
}
}
};
export default BaseObject; export default BaseObject;

View File

@@ -1,6 +1,7 @@
/** /**
* @module ol/Observable * @module ol/Observable
*/ */
import {inherits} from './index.js';
import {listen, unlistenByKey, unlisten, listenOnce} from './events.js'; import {listen, unlistenByKey, unlisten, listenOnce} from './events.js';
import EventTarget from './events/EventTarget.js'; import EventTarget from './events/EventTarget.js';
import EventType from './events/EventType.js'; import EventType from './events/EventType.js';
@@ -13,13 +14,15 @@ import EventType from './events/EventType.js';
* and unregistration. A generic `change` event is always available through * and unregistration. A generic `change` event is always available through
* {@link module:ol/Observable~Observable#changed}. * {@link module:ol/Observable~Observable#changed}.
* *
* @constructor
* @extends {module:ol/events/EventTarget}
* @fires module:ol/events/Event~Event * @fires module:ol/events/Event~Event
* @struct
* @api * @api
*/ */
class Observable extends EventTarget { const Observable = function() {
constructor() {
super(); EventTarget.call(this);
/** /**
* @private * @private
@@ -27,88 +30,9 @@ class Observable extends EventTarget {
*/ */
this.revision_ = 0; this.revision_ = 0;
} };
/** inherits(Observable, EventTarget);
* Increases the revision counter and dispatches a 'change' event.
* @api
*/
changed() {
++this.revision_;
this.dispatchEvent(EventType.CHANGE);
}
/**
* Get the version number for this object. Each time the object is modified,
* its version number will be incremented.
* @return {number} Revision.
* @api
*/
getRevision() {
return this.revision_;
}
/**
* Listen for a certain type of event.
* @param {string|Array.<string>} type The event type or array of event types.
* @param {function(?): ?} listener The listener function.
* @return {module:ol/events~EventsKey|Array.<module:ol/events~EventsKey>} Unique key for the listener. If
* called with an array of event types as the first argument, the return
* will be an array of keys.
* @api
*/
on(type, listener) {
if (Array.isArray(type)) {
const len = type.length;
const keys = new Array(len);
for (let i = 0; i < len; ++i) {
keys[i] = listen(this, type[i], listener);
}
return keys;
} else {
return listen(this, /** @type {string} */ (type), listener);
}
}
/**
* Listen once for a certain type of event.
* @param {string|Array.<string>} type The event type or array of event types.
* @param {function(?): ?} listener The listener function.
* @return {module:ol/events~EventsKey|Array.<module:ol/events~EventsKey>} Unique key for the listener. If
* called with an array of event types as the first argument, the return
* will be an array of keys.
* @api
*/
once(type, listener) {
if (Array.isArray(type)) {
const len = type.length;
const keys = new Array(len);
for (let i = 0; i < len; ++i) {
keys[i] = listenOnce(this, type[i], listener);
}
return keys;
} else {
return listenOnce(this, /** @type {string} */ (type), listener);
}
}
/**
* Unlisten for a certain type of event.
* @param {string|Array.<string>} type The event type or array of event types.
* @param {function(?): ?} listener The listener function.
* @api
*/
un(type, listener) {
if (Array.isArray(type)) {
for (let i = 0, ii = type.length; i < ii; ++i) {
unlisten(this, type[i], listener);
}
return;
} else {
unlisten(this, /** @type {string} */ (type), listener);
}
}
}
/** /**
@@ -128,4 +52,101 @@ export function unByKey(key) {
} }
/**
* Increases the revision counter and dispatches a 'change' event.
* @api
*/
Observable.prototype.changed = function() {
++this.revision_;
this.dispatchEvent(EventType.CHANGE);
};
/**
* Dispatches an event and calls all listeners listening for events
* of this type. The event parameter can either be a string or an
* Object with a `type` property.
*
* @param {{type: string,
* target: (EventTarget|module:ol/events/EventTarget|undefined)}|
* module:ol/events/Event|string} event Event object.
* @function
* @api
*/
Observable.prototype.dispatchEvent;
/**
* Get the version number for this object. Each time the object is modified,
* its version number will be incremented.
* @return {number} Revision.
* @api
*/
Observable.prototype.getRevision = function() {
return this.revision_;
};
/**
* Listen for a certain type of event.
* @param {string|Array.<string>} type The event type or array of event types.
* @param {function(?): ?} listener The listener function.
* @return {module:ol/events~EventsKey|Array.<module:ol/events~EventsKey>} Unique key for the listener. If
* called with an array of event types as the first argument, the return
* will be an array of keys.
* @api
*/
Observable.prototype.on = function(type, listener) {
if (Array.isArray(type)) {
const len = type.length;
const keys = new Array(len);
for (let i = 0; i < len; ++i) {
keys[i] = listen(this, type[i], listener);
}
return keys;
} else {
return listen(this, /** @type {string} */ (type), listener);
}
};
/**
* Listen once for a certain type of event.
* @param {string|Array.<string>} type The event type or array of event types.
* @param {function(?): ?} listener The listener function.
* @return {module:ol/events~EventsKey|Array.<module:ol/events~EventsKey>} Unique key for the listener. If
* called with an array of event types as the first argument, the return
* will be an array of keys.
* @api
*/
Observable.prototype.once = function(type, listener) {
if (Array.isArray(type)) {
const len = type.length;
const keys = new Array(len);
for (let i = 0; i < len; ++i) {
keys[i] = listenOnce(this, type[i], listener);
}
return keys;
} else {
return listenOnce(this, /** @type {string} */ (type), listener);
}
};
/**
* Unlisten for a certain type of event.
* @param {string|Array.<string>} type The event type or array of event types.
* @param {function(?): ?} listener The listener function.
* @api
*/
Observable.prototype.un = function(type, listener) {
if (Array.isArray(type)) {
for (let i = 0, ii = type.length; i < ii; ++i) {
unlisten(this, type[i], listener);
}
return;
} else {
unlisten(this, /** @type {string} */ (type), listener);
}
};
export default Observable; export default Observable;

View File

@@ -1,6 +1,7 @@
/** /**
* @module ol/Overlay * @module ol/Overlay
*/ */
import {inherits} from './index.js';
import MapEventType from './MapEventType.js'; import MapEventType from './MapEventType.js';
import BaseObject, {getChangeEventType} from './Object.js'; import BaseObject, {getChangeEventType} from './Object.js';
import OverlayPositioning from './OverlayPositioning.js'; import OverlayPositioning from './OverlayPositioning.js';
@@ -14,7 +15,7 @@ import {containsExtent} from './extent.js';
* @typedef {Object} Options * @typedef {Object} Options
* @property {number|string} [id] Set the overlay id. The overlay id can be used * @property {number|string} [id] Set the overlay id. The overlay id can be used
* with the {@link module:ol/Map~Map#getOverlayById} method. * with the {@link module:ol/Map~Map#getOverlayById} method.
* @property {HTMLElement} [element] The overlay element. * @property {Element} [element] The overlay element.
* @property {Array.<number>} [offset=[0, 0]] Offsets in pixels used when positioning * @property {Array.<number>} [offset=[0, 0]] Offsets in pixels used when positioning
* the overlay. The first element in the * the overlay. The first element in the
* array is the horizontal offset. A positive value shifts the overlay right. * array is the horizontal offset. A positive value shifts the overlay right.
@@ -31,7 +32,7 @@ import {containsExtent} from './extent.js';
* viewport should be stopped. If `true` the overlay is placed in the same * viewport should be stopped. If `true` the overlay is placed in the same
* container as that of the controls (CSS class name * container as that of the controls (CSS class name
* `ol-overlaycontainer-stopevent`); if `false` it is placed in the container * `ol-overlaycontainer-stopevent`); if `false` it is placed in the container
* with CSS class name specified by the `className` property. * with CSS class name `ol-overlaycontainer`.
* @property {boolean} [insertFirst=true] Whether the overlay is inserted first * @property {boolean} [insertFirst=true] Whether the overlay is inserted first
* in the overlay container, or appended. If the overlay is placed in the same * in the overlay container, or appended. If the overlay is placed in the same
* container as that of the controls (see the `stopEvent` option) you will * container as that of the controls (see the `stopEvent` option) you will
@@ -92,16 +93,14 @@ const Property = {
* popup.setPosition(coordinate); * popup.setPosition(coordinate);
* map.addOverlay(popup); * map.addOverlay(popup);
* *
* @constructor
* @extends {module:ol/Object}
* @param {module:ol/Overlay~Options} options Overlay options.
* @api * @api
*/ */
class Overlay extends BaseObject { const Overlay = function(options) {
/** BaseObject.call(this);
* @param {module:ol/Overlay~Options} options Overlay options.
*/
constructor(options) {
super();
/** /**
* @protected * @protected
@@ -130,7 +129,7 @@ class Overlay extends BaseObject {
/** /**
* @protected * @protected
* @type {HTMLElement} * @type {Element}
*/ */
this.element = document.createElement('DIV'); this.element = document.createElement('DIV');
this.element.className = options.className !== undefined ? this.element.className = options.className !== undefined ?
@@ -212,26 +211,31 @@ class Overlay extends BaseObject {
this.setPosition(options.position); this.setPosition(options.position);
} }
} };
inherits(Overlay, BaseObject);
/** /**
* Get the DOM element of this overlay. * Get the DOM element of this overlay.
* @return {HTMLElement|undefined} The Element containing the overlay. * @return {Element|undefined} The Element containing the overlay.
* @observable * @observable
* @api * @api
*/ */
getElement() { Overlay.prototype.getElement = function() {
return /** @type {HTMLElement|undefined} */ (this.get(Property.ELEMENT)); return /** @type {Element|undefined} */ (this.get(Property.ELEMENT));
} };
/** /**
* Get the overlay identifier which is set on constructor. * Get the overlay identifier which is set on constructor.
* @return {number|string|undefined} Id. * @return {number|string|undefined} Id.
* @api * @api
*/ */
getId() { Overlay.prototype.getId = function() {
return this.id; return this.id;
} };
/** /**
* Get the map associated with this overlay. * Get the map associated with this overlay.
@@ -240,11 +244,12 @@ class Overlay extends BaseObject {
* @observable * @observable
* @api * @api
*/ */
getMap() { Overlay.prototype.getMap = function() {
return ( return (
/** @type {module:ol/PluggableMap|undefined} */ (this.get(Property.MAP)) /** @type {module:ol/PluggableMap|undefined} */ (this.get(Property.MAP))
); );
} };
/** /**
* Get the offset of this overlay. * Get the offset of this overlay.
@@ -252,9 +257,10 @@ class Overlay extends BaseObject {
* @observable * @observable
* @api * @api
*/ */
getOffset() { Overlay.prototype.getOffset = function() {
return /** @type {Array.<number>} */ (this.get(Property.OFFSET)); return /** @type {Array.<number>} */ (this.get(Property.OFFSET));
} };
/** /**
* Get the current position of this overlay. * Get the current position of this overlay.
@@ -263,11 +269,12 @@ class Overlay extends BaseObject {
* @observable * @observable
* @api * @api
*/ */
getPosition() { Overlay.prototype.getPosition = function() {
return ( return (
/** @type {module:ol/coordinate~Coordinate|undefined} */ (this.get(Property.POSITION)) /** @type {module:ol/coordinate~Coordinate|undefined} */ (this.get(Property.POSITION))
); );
} };
/** /**
* Get the current positioning of this overlay. * Get the current positioning of this overlay.
@@ -276,27 +283,29 @@ class Overlay extends BaseObject {
* @observable * @observable
* @api * @api
*/ */
getPositioning() { Overlay.prototype.getPositioning = function() {
return ( return (
/** @type {module:ol/OverlayPositioning} */ (this.get(Property.POSITIONING)) /** @type {module:ol/OverlayPositioning} */ (this.get(Property.POSITIONING))
); );
} };
/** /**
* @protected * @protected
*/ */
handleElementChanged() { Overlay.prototype.handleElementChanged = function() {
removeChildren(this.element); removeChildren(this.element);
const element = this.getElement(); const element = this.getElement();
if (element) { if (element) {
this.element.appendChild(element); this.element.appendChild(element);
} }
} };
/** /**
* @protected * @protected
*/ */
handleMapChanged() { Overlay.prototype.handleMapChanged = function() {
if (this.mapPostrenderListenerKey) { if (this.mapPostrenderListenerKey) {
removeNode(this.element); removeNode(this.element);
unlistenByKey(this.mapPostrenderListenerKey); unlistenByKey(this.mapPostrenderListenerKey);
@@ -315,48 +324,54 @@ class Overlay extends BaseObject {
container.appendChild(this.element); container.appendChild(this.element);
} }
} }
} };
/** /**
* @protected * @protected
*/ */
render() { Overlay.prototype.render = function() {
this.updatePixelPosition(); this.updatePixelPosition();
} };
/** /**
* @protected * @protected
*/ */
handleOffsetChanged() { Overlay.prototype.handleOffsetChanged = function() {
this.updatePixelPosition(); this.updatePixelPosition();
} };
/** /**
* @protected * @protected
*/ */
handlePositionChanged() { Overlay.prototype.handlePositionChanged = function() {
this.updatePixelPosition(); this.updatePixelPosition();
if (this.get(Property.POSITION) && this.autoPan) { if (this.get(Property.POSITION) && this.autoPan) {
this.panIntoView(); this.panIntoView();
} }
} };
/** /**
* @protected * @protected
*/ */
handlePositioningChanged() { Overlay.prototype.handlePositioningChanged = function() {
this.updatePixelPosition(); this.updatePixelPosition();
} };
/** /**
* Set the DOM element to be associated with this overlay. * Set the DOM element to be associated with this overlay.
* @param {HTMLElement|undefined} element The Element containing the overlay. * @param {Element|undefined} element The Element containing the overlay.
* @observable * @observable
* @api * @api
*/ */
setElement(element) { Overlay.prototype.setElement = function(element) {
this.set(Property.ELEMENT, element); this.set(Property.ELEMENT, element);
} };
/** /**
* Set the map to be associated with this overlay. * Set the map to be associated with this overlay.
@@ -365,9 +380,10 @@ class Overlay extends BaseObject {
* @observable * @observable
* @api * @api
*/ */
setMap(map) { Overlay.prototype.setMap = function(map) {
this.set(Property.MAP, map); this.set(Property.MAP, map);
} };
/** /**
* Set the offset for this overlay. * Set the offset for this overlay.
@@ -375,9 +391,10 @@ class Overlay extends BaseObject {
* @observable * @observable
* @api * @api
*/ */
setOffset(offset) { Overlay.prototype.setOffset = function(offset) {
this.set(Property.OFFSET, offset); this.set(Property.OFFSET, offset);
} };
/** /**
* Set the position for this overlay. If the position is `undefined` the * Set the position for this overlay. If the position is `undefined` the
@@ -387,16 +404,17 @@ class Overlay extends BaseObject {
* @observable * @observable
* @api * @api
*/ */
setPosition(position) { Overlay.prototype.setPosition = function(position) {
this.set(Property.POSITION, position); this.set(Property.POSITION, position);
} };
/** /**
* Pan the map so that the overlay is entirely visible in the current viewport * Pan the map so that the overlay is entirely visible in the current viewport
* (if necessary). * (if necessary).
* @protected * @protected
*/ */
panIntoView() { Overlay.prototype.panIntoView = function() {
const map = this.getMap(); const map = this.getMap();
if (!map || !map.getTargetElement()) { if (!map || !map.getTargetElement()) {
@@ -404,7 +422,7 @@ class Overlay extends BaseObject {
} }
const mapRect = this.getRect(map.getTargetElement(), map.getSize()); const mapRect = this.getRect(map.getTargetElement(), map.getSize());
const element = this.getElement(); const element = /** @type {!Element} */ (this.getElement());
const overlayRect = this.getRect(element, [outerWidth(element), outerHeight(element)]); const overlayRect = this.getRect(element, [outerWidth(element), outerHeight(element)]);
const margin = this.autoPanMargin; const margin = this.autoPanMargin;
@@ -446,16 +464,17 @@ class Overlay extends BaseObject {
}); });
} }
} }
} };
/** /**
* Get the extent of an element relative to the document * Get the extent of an element relative to the document
* @param {HTMLElement|undefined} element The element. * @param {Element|undefined} element The element.
* @param {module:ol/size~Size|undefined} size The size of the element. * @param {module:ol/size~Size|undefined} size The size of the element.
* @return {module:ol/extent~Extent} The extent. * @return {module:ol/extent~Extent} The extent.
* @protected * @protected
*/ */
getRect(element, size) { Overlay.prototype.getRect = function(element, size) {
const box = element.getBoundingClientRect(); const box = element.getBoundingClientRect();
const offsetX = box.left + window.pageXOffset; const offsetX = box.left + window.pageXOffset;
const offsetY = box.top + window.pageYOffset; const offsetY = box.top + window.pageYOffset;
@@ -465,7 +484,8 @@ class Overlay extends BaseObject {
offsetX + size[0], offsetX + size[0],
offsetY + size[1] offsetY + size[1]
]; ];
} };
/** /**
* Set the positioning for this overlay. * Set the positioning for this overlay.
@@ -474,27 +494,29 @@ class Overlay extends BaseObject {
* @observable * @observable
* @api * @api
*/ */
setPositioning(positioning) { Overlay.prototype.setPositioning = function(positioning) {
this.set(Property.POSITIONING, positioning); this.set(Property.POSITIONING, positioning);
} };
/** /**
* Modify the visibility of the element. * Modify the visibility of the element.
* @param {boolean} visible Element visibility. * @param {boolean} visible Element visibility.
* @protected * @protected
*/ */
setVisible(visible) { Overlay.prototype.setVisible = function(visible) {
if (this.rendered.visible !== visible) { if (this.rendered.visible !== visible) {
this.element.style.display = visible ? '' : 'none'; this.element.style.display = visible ? '' : 'none';
this.rendered.visible = visible; this.rendered.visible = visible;
} }
} };
/** /**
* Update pixel position. * Update pixel position.
* @protected * @protected
*/ */
updatePixelPosition() { Overlay.prototype.updatePixelPosition = function() {
const map = this.getMap(); const map = this.getMap();
const position = this.getPosition(); const position = this.getPosition();
if (!map || !map.isRendered() || !position) { if (!map || !map.isRendered() || !position) {
@@ -505,14 +527,15 @@ class Overlay extends BaseObject {
const pixel = map.getPixelFromCoordinate(position); const pixel = map.getPixelFromCoordinate(position);
const mapSize = map.getSize(); const mapSize = map.getSize();
this.updateRenderedPosition(pixel, mapSize); this.updateRenderedPosition(pixel, mapSize);
} };
/** /**
* @param {module:ol/pixel~Pixel} pixel The pixel location. * @param {module:ol~Pixel} pixel The pixel location.
* @param {module:ol/size~Size|undefined} mapSize The map size. * @param {module:ol/size~Size|undefined} mapSize The map size.
* @protected * @protected
*/ */
updateRenderedPosition(pixel, mapSize) { Overlay.prototype.updateRenderedPosition = function(pixel, mapSize) {
const style = this.element.style; const style = this.element.style;
const offset = this.getOffset(); const offset = this.getOffset();
@@ -570,16 +593,15 @@ class Overlay extends BaseObject {
this.rendered.top_ = style.top = top; this.rendered.top_ = style.top = top;
} }
} }
} };
/** /**
* returns the options this Overlay has been created with * returns the options this Overlay has been created with
* @return {module:ol/Overlay~Options} overlay options * @return {module:ol/Overlay~Options} overlay options
*/ */
getOptions() { Overlay.prototype.getOptions = function() {
return this.options; return this.options;
} };
}
export default Overlay; export default Overlay;

View File

@@ -1,7 +1,7 @@
/** /**
* @module ol/PluggableMap * @module ol/PluggableMap
*/ */
import {getUid} from './util.js'; import {getUid, inherits} from './index.js';
import Collection from './Collection.js'; import Collection from './Collection.js';
import CollectionEventType from './CollectionEventType.js'; import CollectionEventType from './CollectionEventType.js';
import MapBrowserEvent from './MapBrowserEvent.js'; import MapBrowserEvent from './MapBrowserEvent.js';
@@ -76,7 +76,7 @@ import {create as createTransform, apply as applyTransform} from './transform.js
* @typedef {Object} MapOptionsInternal * @typedef {Object} MapOptionsInternal
* @property {module:ol/Collection.<module:ol/control/Control>} [controls] * @property {module:ol/Collection.<module:ol/control/Control>} [controls]
* @property {module:ol/Collection.<module:ol/interaction/Interaction>} [interactions] * @property {module:ol/Collection.<module:ol/interaction/Interaction>} [interactions]
* @property {HTMLElement|Document} keyboardEventTarget * @property {Element|Document} keyboardEventTarget
* @property {module:ol/Collection.<module:ol/Overlay>} overlays * @property {module:ol/Collection.<module:ol/Overlay>} overlays
* @property {Object.<string, *>} values * @property {Object.<string, *>} values
*/ */
@@ -93,7 +93,7 @@ import {create as createTransform, apply as applyTransform} from './transform.js
* @property {module:ol/Collection.<module:ol/interaction/Interaction>|Array.<module:ol/interaction/Interaction>} [interactions] * @property {module:ol/Collection.<module:ol/interaction/Interaction>|Array.<module:ol/interaction/Interaction>} [interactions]
* Interactions that are initially added to the map. If not specified, * Interactions that are initially added to the map. If not specified,
* {@link module:ol/interaction~defaults} is used. * {@link module:ol/interaction~defaults} is used.
* @property {HTMLElement|Document|string} [keyboardEventTarget] The element to * @property {Element|Document|string} [keyboardEventTarget] The element to
* listen to keyboard events on. This determines when the `KeyboardPan` and * listen to keyboard events on. This determines when the `KeyboardPan` and
* `KeyboardZoom` interactions trigger. For example, if this option is set to * `KeyboardZoom` interactions trigger. For example, if this option is set to
* `document` the keyboard interactions will always trigger. If this option is * `document` the keyboard interactions will always trigger. If this option is
@@ -120,7 +120,7 @@ import {create as createTransform, apply as applyTransform} from './transform.js
* Increasing this value can make it easier to click on the map. * Increasing this value can make it easier to click on the map.
* @property {module:ol/Collection.<module:ol/Overlay>|Array.<module:ol/Overlay>} [overlays] * @property {module:ol/Collection.<module:ol/Overlay>|Array.<module:ol/Overlay>} [overlays]
* Overlays initially added to the map. By default, no overlays are added. * Overlays initially added to the map. By default, no overlays are added.
* @property {HTMLElement|string} [target] The container for the map, either the * @property {Element|string} [target] The container for the map, either the
* element itself or the `id` of the element. If not specified at construction * element itself or the `id` of the element. If not specified at construction
* time, {@link module:ol/Map~Map#setTarget} must be called for the map to be * time, {@link module:ol/Map~Map#setTarget} must be called for the map to be
* rendered. * rendered.
@@ -131,20 +131,18 @@ import {create as createTransform, apply as applyTransform} from './transform.js
/** /**
* @constructor
* @extends {module:ol/Object}
* @param {module:ol/PluggableMap~MapOptions} options Map options.
* @fires module:ol/MapBrowserEvent~MapBrowserEvent * @fires module:ol/MapBrowserEvent~MapBrowserEvent
* @fires module:ol/MapEvent~MapEvent * @fires module:ol/MapEvent~MapEvent
* @fires module:ol/render/Event~RenderEvent#postcompose * @fires module:ol/render/Event~RenderEvent#postcompose
* @fires module:ol/render/Event~RenderEvent#precompose * @fires module:ol/render/Event~RenderEvent#precompose
* @api * @api
*/ */
class PluggableMap extends BaseObject { const PluggableMap = function(options) {
/** BaseObject.call(this);
* @param {module:ol/PluggableMap~MapOptions} options Map options.
*/
constructor(options) {
super();
const optionsInternal = createOptionsInternal(options); const optionsInternal = createOptionsInternal(options);
@@ -242,7 +240,7 @@ class PluggableMap extends BaseObject {
/** /**
* @private * @private
* @type {!HTMLElement} * @type {Element}
*/ */
this.viewport_ = document.createElement('DIV'); this.viewport_ = document.createElement('DIV');
this.viewport_.className = 'ol-viewport' + (TOUCH ? ' ol-touch' : ''); this.viewport_.className = 'ol-viewport' + (TOUCH ? ' ol-touch' : '');
@@ -256,7 +254,7 @@ class PluggableMap extends BaseObject {
/** /**
* @private * @private
* @type {!HTMLElement} * @type {!Element}
*/ */
this.overlayContainer_ = document.createElement('DIV'); this.overlayContainer_ = document.createElement('DIV');
this.overlayContainer_.className = 'ol-overlaycontainer'; this.overlayContainer_.className = 'ol-overlaycontainer';
@@ -264,7 +262,7 @@ class PluggableMap extends BaseObject {
/** /**
* @private * @private
* @type {!HTMLElement} * @type {!Element}
*/ */
this.overlayContainerStopEvent_ = document.createElement('DIV'); this.overlayContainerStopEvent_ = document.createElement('DIV');
this.overlayContainerStopEvent_.className = 'ol-overlaycontainer-stopevent'; this.overlayContainerStopEvent_.className = 'ol-overlaycontainer-stopevent';
@@ -295,7 +293,7 @@ class PluggableMap extends BaseObject {
/** /**
* @private * @private
* @type {HTMLElement|Document} * @type {Element|Document}
*/ */
this.keyboardEventTarget_ = optionsInternal.keyboardEventTarget; this.keyboardEventTarget_ = optionsInternal.keyboardEventTarget;
@@ -338,7 +336,7 @@ class PluggableMap extends BaseObject {
* @type {module:ol/renderer/Map} * @type {module:ol/renderer/Map}
* @private * @private
*/ */
this.renderer_ = this.createRenderer(); this.renderer_ = this.createRenderer(this.viewport_, this);
/** /**
* @type {function(Event)|undefined} * @type {function(Event)|undefined}
@@ -460,29 +458,35 @@ class PluggableMap extends BaseObject {
event.element.setMap(null); event.element.setMap(null);
}, this); }, this);
} };
createRenderer() { inherits(PluggableMap, BaseObject);
PluggableMap.prototype.createRenderer = function() {
throw new Error('Use a map type that has a createRenderer method'); throw new Error('Use a map type that has a createRenderer method');
} };
/** /**
* Add the given control to the map. * Add the given control to the map.
* @param {module:ol/control/Control} control Control. * @param {module:ol/control/Control} control Control.
* @api * @api
*/ */
addControl(control) { PluggableMap.prototype.addControl = function(control) {
this.getControls().push(control); this.getControls().push(control);
} };
/** /**
* Add the given interaction to the map. * Add the given interaction to the map.
* @param {module:ol/interaction/Interaction} interaction Interaction to add. * @param {module:ol/interaction/Interaction} interaction Interaction to add.
* @api * @api
*/ */
addInteraction(interaction) { PluggableMap.prototype.addInteraction = function(interaction) {
this.getInteractions().push(interaction); this.getInteractions().push(interaction);
} };
/** /**
* Adds the given layer to the top of this map. If you want to add a layer * Adds the given layer to the top of this map. If you want to add a layer
@@ -491,38 +495,41 @@ class PluggableMap extends BaseObject {
* @param {module:ol/layer/Base} layer Layer. * @param {module:ol/layer/Base} layer Layer.
* @api * @api
*/ */
addLayer(layer) { PluggableMap.prototype.addLayer = function(layer) {
const layers = this.getLayerGroup().getLayers(); const layers = this.getLayerGroup().getLayers();
layers.push(layer); layers.push(layer);
} };
/** /**
* Add the given overlay to the map. * Add the given overlay to the map.
* @param {module:ol/Overlay} overlay Overlay. * @param {module:ol/Overlay} overlay Overlay.
* @api * @api
*/ */
addOverlay(overlay) { PluggableMap.prototype.addOverlay = function(overlay) {
this.getOverlays().push(overlay); this.getOverlays().push(overlay);
} };
/** /**
* This deals with map's overlay collection changes. * This deals with map's overlay collection changes.
* @param {module:ol/Overlay} overlay Overlay. * @param {module:ol/Overlay} overlay Overlay.
* @private * @private
*/ */
addOverlayInternal_(overlay) { PluggableMap.prototype.addOverlayInternal_ = function(overlay) {
const id = overlay.getId(); const id = overlay.getId();
if (id !== undefined) { if (id !== undefined) {
this.overlayIdIndex_[id.toString()] = overlay; this.overlayIdIndex_[id.toString()] = overlay;
} }
overlay.setMap(this); overlay.setMap(this);
} };
/** /**
* *
* @inheritDoc * @inheritDoc
*/ */
disposeInternal() { PluggableMap.prototype.disposeInternal = function() {
this.mapBrowserEventHandler_.dispose(); this.mapBrowserEventHandler_.dispose();
unlisten(this.viewport_, EventType.CONTEXTMENU, this.handleBrowserEvent, this); unlisten(this.viewport_, EventType.CONTEXTMENU, this.handleBrowserEvent, this);
unlisten(this.viewport_, EventType.WHEEL, this.handleBrowserEvent, this); unlisten(this.viewport_, EventType.WHEEL, this.handleBrowserEvent, this);
@@ -536,14 +543,15 @@ class PluggableMap extends BaseObject {
this.animationDelayKey_ = undefined; this.animationDelayKey_ = undefined;
} }
this.setTarget(null); this.setTarget(null);
super.disposeInternal(); BaseObject.prototype.disposeInternal.call(this);
} };
/** /**
* Detect features that intersect a pixel on the viewport, and execute a * Detect features that intersect a pixel on the viewport, and execute a
* callback with each intersecting feature. Layers included in the detection can * callback with each intersecting feature. Layers included in the detection can
* be configured through the `layerFilter` option in `opt_options`. * be configured through the `layerFilter` option in `opt_options`.
* @param {module:ol/pixel~Pixel} pixel Pixel. * @param {module:ol~Pixel} pixel Pixel.
* @param {function(this: S, (module:ol/Feature|module:ol/render/Feature), * @param {function(this: S, (module:ol/Feature|module:ol/render/Feature),
* module:ol/layer/Layer): T} callback Feature callback. The callback will be * module:ol/layer/Layer): T} callback Feature callback. The callback will be
* called with two arguments. The first argument is one * called with two arguments. The first argument is one
@@ -558,7 +566,7 @@ class PluggableMap extends BaseObject {
* @template S,T * @template S,T
* @api * @api
*/ */
forEachFeatureAtPixel(pixel, callback, opt_options) { PluggableMap.prototype.forEachFeatureAtPixel = function(pixel, callback, opt_options) {
if (!this.frameState_) { if (!this.frameState_) {
return; return;
} }
@@ -571,17 +579,18 @@ class PluggableMap extends BaseObject {
return this.renderer_.forEachFeatureAtCoordinate( return this.renderer_.forEachFeatureAtCoordinate(
coordinate, this.frameState_, hitTolerance, callback, null, coordinate, this.frameState_, hitTolerance, callback, null,
layerFilter, null); layerFilter, null);
} };
/** /**
* Get all features that intersect a pixel on the viewport. * Get all features that intersect a pixel on the viewport.
* @param {module:ol/pixel~Pixel} pixel Pixel. * @param {module:ol~Pixel} pixel Pixel.
* @param {module:ol/PluggableMap~AtPixelOptions=} opt_options Optional options. * @param {module:ol/PluggableMap~AtPixelOptions=} opt_options Optional options.
* @return {Array.<module:ol/Feature|module:ol/render/Feature>} The detected features or * @return {Array.<module:ol/Feature|module:ol/render/Feature>} The detected features or
* `null` if none were found. * `null` if none were found.
* @api * @api
*/ */
getFeaturesAtPixel(pixel, opt_options) { PluggableMap.prototype.getFeaturesAtPixel = function(pixel, opt_options) {
let features = null; let features = null;
this.forEachFeatureAtPixel(pixel, function(feature) { this.forEachFeatureAtPixel(pixel, function(feature) {
if (!features) { if (!features) {
@@ -590,47 +599,55 @@ class PluggableMap extends BaseObject {
features.push(feature); features.push(feature);
}, opt_options); }, opt_options);
return features; return features;
} };
/** /**
* Detect layers that have a color value at a pixel on the viewport, and * Detect layers that have a color value at a pixel on the viewport, and
* execute a callback with each matching layer. Layers included in the * execute a callback with each matching layer. Layers included in the
* detection can be configured through `opt_layerFilter`. * detection can be configured through `opt_layerFilter`.
* @param {module:ol/pixel~Pixel} pixel Pixel. * @param {module:ol~Pixel} pixel Pixel.
* @param {function(this: S, module:ol/layer/Layer, (Uint8ClampedArray|Uint8Array)): T} callback * @param {function(this: S, module:ol/layer/Layer, (Uint8ClampedArray|Uint8Array)): T} callback
* Layer callback. This callback will receive two arguments: first is the * Layer callback. This callback will receive two arguments: first is the
* {@link module:ol/layer/Layer layer}, second argument is an array representing * {@link module:ol/layer/Layer layer}, second argument is an array representing
* [R, G, B, A] pixel values (0 - 255) and will be `null` for layer types * [R, G, B, A] pixel values (0 - 255) and will be `null` for layer types
* that do not currently support this argument. To stop detection, callback * that do not currently support this argument. To stop detection, callback
* functions can return a truthy value. * functions can return a truthy value.
* @param {module:ol/PluggableMap~AtPixelOptions=} opt_options Configuration options. * @param {S=} opt_this Value to use as `this` when executing `callback`.
* @param {(function(this: U, module:ol/layer/Layer): boolean)=} opt_layerFilter Layer
* filter function. The filter function will receive one argument, the
* {@link module:ol/layer/Layer layer-candidate} and it should return a boolean
* value. Only layers which are visible and for which this function returns
* `true` will be tested for features. By default, all visible layers will
* be tested.
* @param {U=} opt_this2 Value to use as `this` when executing `layerFilter`.
* @return {T|undefined} Callback result, i.e. the return value of last * @return {T|undefined} Callback result, i.e. the return value of last
* callback execution, or the first truthy callback return value. * callback execution, or the first truthy callback return value.
* @template S,T * @template S,T,U
* @api * @api
*/ */
forEachLayerAtPixel(pixel, callback, opt_options) { PluggableMap.prototype.forEachLayerAtPixel = function(pixel, callback, opt_this, opt_layerFilter, opt_this2) {
if (!this.frameState_) { if (!this.frameState_) {
return; return;
} }
const options = opt_options || {}; const thisArg = opt_this !== undefined ? opt_this : null;
const hitTolerance = options.hitTolerance !== undefined ? const layerFilter = opt_layerFilter !== undefined ? opt_layerFilter : TRUE;
opt_options.hitTolerance * this.frameState_.pixelRatio : 0; const thisArg2 = opt_this2 !== undefined ? opt_this2 : null;
const layerFilter = options.layerFilter || TRUE;
return this.renderer_.forEachLayerAtPixel( return this.renderer_.forEachLayerAtPixel(
pixel, this.frameState_, hitTolerance, callback, null, layerFilter, null); pixel, this.frameState_, callback, thisArg,
} layerFilter, thisArg2);
};
/** /**
* Detect if features intersect a pixel on the viewport. Layers included in the * Detect if features intersect a pixel on the viewport. Layers included in the
* detection can be configured through `opt_layerFilter`. * detection can be configured through `opt_layerFilter`.
* @param {module:ol/pixel~Pixel} pixel Pixel. * @param {module:ol~Pixel} pixel Pixel.
* @param {module:ol/PluggableMap~AtPixelOptions=} opt_options Optional options. * @param {module:ol/PluggableMap~AtPixelOptions=} opt_options Optional options.
* @return {boolean} Is there a feature at the given pixel? * @return {boolean} Is there a feature at the given pixel?
* @template U * @template U
* @api * @api
*/ */
hasFeatureAtPixel(pixel, opt_options) { PluggableMap.prototype.hasFeatureAtPixel = function(pixel, opt_options) {
if (!this.frameState_) { if (!this.frameState_) {
return false; return false;
} }
@@ -641,7 +658,8 @@ class PluggableMap extends BaseObject {
opt_options.hitTolerance * this.frameState_.pixelRatio : 0; opt_options.hitTolerance * this.frameState_.pixelRatio : 0;
return this.renderer_.hasFeatureAtCoordinate( return this.renderer_.hasFeatureAtCoordinate(
coordinate, this.frameState_, hitTolerance, layerFilter, null); coordinate, this.frameState_, hitTolerance, layerFilter, null);
} };
/** /**
* Returns the coordinate in view projection for a browser event. * Returns the coordinate in view projection for a browser event.
@@ -649,69 +667,74 @@ class PluggableMap extends BaseObject {
* @return {module:ol/coordinate~Coordinate} Coordinate. * @return {module:ol/coordinate~Coordinate} Coordinate.
* @api * @api
*/ */
getEventCoordinate(event) { PluggableMap.prototype.getEventCoordinate = function(event) {
return this.getCoordinateFromPixel(this.getEventPixel(event)); return this.getCoordinateFromPixel(this.getEventPixel(event));
} };
/** /**
* Returns the map pixel position for a browser event relative to the viewport. * Returns the map pixel position for a browser event relative to the viewport.
* @param {Event} event Event. * @param {Event} event Event.
* @return {module:ol/pixel~Pixel} Pixel. * @return {module:ol~Pixel} Pixel.
* @api * @api
*/ */
getEventPixel(event) { PluggableMap.prototype.getEventPixel = function(event) {
const viewportPosition = this.viewport_.getBoundingClientRect(); const viewportPosition = this.viewport_.getBoundingClientRect();
const eventPosition = event.changedTouches ? event.changedTouches[0] : event; const eventPosition = event.changedTouches ? event.changedTouches[0] : event;
return [ return [
eventPosition.clientX - viewportPosition.left, eventPosition.clientX - viewportPosition.left,
eventPosition.clientY - viewportPosition.top eventPosition.clientY - viewportPosition.top
]; ];
} };
/** /**
* Get the target in which this map is rendered. * Get the target in which this map is rendered.
* Note that this returns what is entered as an option or in setTarget: * Note that this returns what is entered as an option or in setTarget:
* if that was an element, it returns an element; if a string, it returns that. * if that was an element, it returns an element; if a string, it returns that.
* @return {HTMLElement|string|undefined} The Element or id of the Element that the * @return {Element|string|undefined} The Element or id of the Element that the
* map is rendered in. * map is rendered in.
* @observable * @observable
* @api * @api
*/ */
getTarget() { PluggableMap.prototype.getTarget = function() {
return /** @type {HTMLElement|string|undefined} */ (this.get(MapProperty.TARGET)); return /** @type {Element|string|undefined} */ (this.get(MapProperty.TARGET));
} };
/** /**
* Get the DOM element into which this map is rendered. In contrast to * Get the DOM element into which this map is rendered. In contrast to
* `getTarget` this method always return an `Element`, or `null` if the * `getTarget` this method always return an `Element`, or `null` if the
* map has no target. * map has no target.
* @return {HTMLElement} The element that the map is rendered in. * @return {Element} The element that the map is rendered in.
* @api * @api
*/ */
getTargetElement() { PluggableMap.prototype.getTargetElement = function() {
const target = this.getTarget(); const target = this.getTarget();
if (target !== undefined) { if (target !== undefined) {
return typeof target === 'string' ? document.getElementById(target) : target; return typeof target === 'string' ? document.getElementById(target) : target;
} else { } else {
return null; return null;
} }
} };
/** /**
* Get the coordinate for a given pixel. This returns a coordinate in the * Get the coordinate for a given pixel. This returns a coordinate in the
* map view projection. * map view projection.
* @param {module:ol/pixel~Pixel} pixel Pixel position in the map viewport. * @param {module:ol~Pixel} pixel Pixel position in the map viewport.
* @return {module:ol/coordinate~Coordinate} The coordinate for the pixel position. * @return {module:ol/coordinate~Coordinate} The coordinate for the pixel position.
* @api * @api
*/ */
getCoordinateFromPixel(pixel) { PluggableMap.prototype.getCoordinateFromPixel = function(pixel) {
const frameState = this.frameState_; const frameState = this.frameState_;
if (!frameState) { if (!frameState) {
return null; return null;
} else { } else {
return applyTransform(frameState.pixelToCoordinateTransform, pixel.slice()); return applyTransform(frameState.pixelToCoordinateTransform, pixel.slice());
} }
} };
/** /**
* Get the map controls. Modifying this collection changes the controls * Get the map controls. Modifying this collection changes the controls
@@ -719,9 +742,10 @@ class PluggableMap extends BaseObject {
* @return {module:ol/Collection.<module:ol/control/Control>} Controls. * @return {module:ol/Collection.<module:ol/control/Control>} Controls.
* @api * @api
*/ */
getControls() { PluggableMap.prototype.getControls = function() {
return this.controls; return this.controls;
} };
/** /**
* Get the map overlays. Modifying this collection changes the overlays * Get the map overlays. Modifying this collection changes the overlays
@@ -729,9 +753,10 @@ class PluggableMap extends BaseObject {
* @return {module:ol/Collection.<module:ol/Overlay>} Overlays. * @return {module:ol/Collection.<module:ol/Overlay>} Overlays.
* @api * @api
*/ */
getOverlays() { PluggableMap.prototype.getOverlays = function() {
return this.overlays_; return this.overlays_;
} };
/** /**
* Get an overlay by its identifier (the value returned by overlay.getId()). * Get an overlay by its identifier (the value returned by overlay.getId()).
@@ -741,10 +766,11 @@ class PluggableMap extends BaseObject {
* @return {module:ol/Overlay} Overlay. * @return {module:ol/Overlay} Overlay.
* @api * @api
*/ */
getOverlayById(id) { PluggableMap.prototype.getOverlayById = function(id) {
const overlay = this.overlayIdIndex_[id.toString()]; const overlay = this.overlayIdIndex_[id.toString()];
return overlay !== undefined ? overlay : null; return overlay !== undefined ? overlay : null;
} };
/** /**
* Get the map interactions. Modifying this collection changes the interactions * Get the map interactions. Modifying this collection changes the interactions
@@ -754,9 +780,10 @@ class PluggableMap extends BaseObject {
* @return {module:ol/Collection.<module:ol/interaction/Interaction>} Interactions. * @return {module:ol/Collection.<module:ol/interaction/Interaction>} Interactions.
* @api * @api
*/ */
getInteractions() { PluggableMap.prototype.getInteractions = function() {
return this.interactions; return this.interactions;
} };
/** /**
* Get the layergroup associated with this map. * Get the layergroup associated with this map.
@@ -764,45 +791,49 @@ class PluggableMap extends BaseObject {
* @observable * @observable
* @api * @api
*/ */
getLayerGroup() { PluggableMap.prototype.getLayerGroup = function() {
return ( return (
/** @type {module:ol/layer/Group} */ (this.get(MapProperty.LAYERGROUP)) /** @type {module:ol/layer/Group} */ (this.get(MapProperty.LAYERGROUP))
); );
} };
/** /**
* Get the collection of layers associated with this map. * Get the collection of layers associated with this map.
* @return {!module:ol/Collection.<module:ol/layer/Base>} Layers. * @return {!module:ol/Collection.<module:ol/layer/Base>} Layers.
* @api * @api
*/ */
getLayers() { PluggableMap.prototype.getLayers = function() {
const layers = this.getLayerGroup().getLayers(); const layers = this.getLayerGroup().getLayers();
return layers; return layers;
} };
/** /**
* Get the pixel for a coordinate. This takes a coordinate in the map view * Get the pixel for a coordinate. This takes a coordinate in the map view
* projection and returns the corresponding pixel. * projection and returns the corresponding pixel.
* @param {module:ol/coordinate~Coordinate} coordinate A map coordinate. * @param {module:ol/coordinate~Coordinate} coordinate A map coordinate.
* @return {module:ol/pixel~Pixel} A pixel position in the map viewport. * @return {module:ol~Pixel} A pixel position in the map viewport.
* @api * @api
*/ */
getPixelFromCoordinate(coordinate) { PluggableMap.prototype.getPixelFromCoordinate = function(coordinate) {
const frameState = this.frameState_; const frameState = this.frameState_;
if (!frameState) { if (!frameState) {
return null; return null;
} else { } else {
return applyTransform(frameState.coordinateToPixelTransform, coordinate.slice(0, 2)); return applyTransform(frameState.coordinateToPixelTransform, coordinate.slice(0, 2));
} }
} };
/** /**
* Get the map renderer. * Get the map renderer.
* @return {module:ol/renderer/Map} Renderer * @return {module:ol/renderer/Map} Renderer
*/ */
getRenderer() { PluggableMap.prototype.getRenderer = function() {
return this.renderer_; return this.renderer_;
} };
/** /**
* Get the size of this map. * Get the size of this map.
@@ -810,11 +841,12 @@ class PluggableMap extends BaseObject {
* @observable * @observable
* @api * @api
*/ */
getSize() { PluggableMap.prototype.getSize = function() {
return ( return (
/** @type {module:ol/size~Size|undefined} */ (this.get(MapProperty.SIZE)) /** @type {module:ol/size~Size|undefined} */ (this.get(MapProperty.SIZE))
); );
} };
/** /**
* Get the view associated with this map. A view manages properties such as * Get the view associated with this map. A view manages properties such as
@@ -823,42 +855,46 @@ class PluggableMap extends BaseObject {
* @observable * @observable
* @api * @api
*/ */
getView() { PluggableMap.prototype.getView = function() {
return ( return (
/** @type {module:ol/View} */ (this.get(MapProperty.VIEW)) /** @type {module:ol/View} */ (this.get(MapProperty.VIEW))
); );
} };
/** /**
* Get the element that serves as the map viewport. * Get the element that serves as the map viewport.
* @return {HTMLElement} Viewport. * @return {Element} Viewport.
* @api * @api
*/ */
getViewport() { PluggableMap.prototype.getViewport = function() {
return this.viewport_; return this.viewport_;
} };
/** /**
* Get the element that serves as the container for overlays. Elements added to * Get the element that serves as the container for overlays. Elements added to
* this container will let mousedown and touchstart events through to the map, * this container will let mousedown and touchstart events through to the map,
* so clicks and gestures on an overlay will trigger {@link module:ol/MapBrowserEvent~MapBrowserEvent} * so clicks and gestures on an overlay will trigger {@link module:ol/MapBrowserEvent~MapBrowserEvent}
* events. * events.
* @return {!HTMLElement} The map's overlay container. * @return {!Element} The map's overlay container.
*/ */
getOverlayContainer() { PluggableMap.prototype.getOverlayContainer = function() {
return this.overlayContainer_; return this.overlayContainer_;
} };
/** /**
* Get the element that serves as a container for overlays that don't allow * Get the element that serves as a container for overlays that don't allow
* event propagation. Elements added to this container won't let mousedown and * event propagation. Elements added to this container won't let mousedown and
* touchstart events through to the map, so clicks and gestures on an overlay * touchstart events through to the map, so clicks and gestures on an overlay
* don't trigger any {@link module:ol/MapBrowserEvent~MapBrowserEvent}. * don't trigger any {@link module:ol/MapBrowserEvent~MapBrowserEvent}.
* @return {!HTMLElement} The map's overlay container that stops events. * @return {!Element} The map's overlay container that stops events.
*/ */
getOverlayContainerStopEvent() { PluggableMap.prototype.getOverlayContainerStopEvent = function() {
return this.overlayContainerStopEvent_; return this.overlayContainerStopEvent_;
} };
/** /**
* @param {module:ol/Tile} tile Tile. * @param {module:ol/Tile} tile Tile.
@@ -867,7 +903,7 @@ class PluggableMap extends BaseObject {
* @param {number} tileResolution Tile resolution. * @param {number} tileResolution Tile resolution.
* @return {number} Tile priority. * @return {number} Tile priority.
*/ */
getTilePriority(tile, tileSourceKey, tileCenter, tileResolution) { PluggableMap.prototype.getTilePriority = function(tile, tileSourceKey, tileCenter, tileResolution) {
// Filter out tiles at higher zoom levels than the current zoom level, or that // Filter out tiles at higher zoom levels than the current zoom level, or that
// are outside the visible extent. // are outside the visible extent.
const frameState = this.frameState_; const frameState = this.frameState_;
@@ -887,22 +923,24 @@ class PluggableMap extends BaseObject {
const deltaY = tileCenter[1] - frameState.focus[1]; const deltaY = tileCenter[1] - frameState.focus[1];
return 65536 * Math.log(tileResolution) + return 65536 * Math.log(tileResolution) +
Math.sqrt(deltaX * deltaX + deltaY * deltaY) / tileResolution; Math.sqrt(deltaX * deltaX + deltaY * deltaY) / tileResolution;
} };
/** /**
* @param {Event} browserEvent Browser event. * @param {Event} browserEvent Browser event.
* @param {string=} opt_type Type. * @param {string=} opt_type Type.
*/ */
handleBrowserEvent(browserEvent, opt_type) { PluggableMap.prototype.handleBrowserEvent = function(browserEvent, opt_type) {
const type = opt_type || browserEvent.type; const type = opt_type || browserEvent.type;
const mapBrowserEvent = new MapBrowserEvent(type, this, browserEvent); const mapBrowserEvent = new MapBrowserEvent(type, this, browserEvent);
this.handleMapBrowserEvent(mapBrowserEvent); this.handleMapBrowserEvent(mapBrowserEvent);
} };
/** /**
* @param {module:ol/MapBrowserEvent} mapBrowserEvent The event to handle. * @param {module:ol/MapBrowserEvent} mapBrowserEvent The event to handle.
*/ */
handleMapBrowserEvent(mapBrowserEvent) { PluggableMap.prototype.handleMapBrowserEvent = function(mapBrowserEvent) {
if (!this.frameState_) { if (!this.frameState_) {
// With no view defined, we cannot translate pixels into geographical // With no view defined, we cannot translate pixels into geographical
// coordinates so interactions cannot be used. // coordinates so interactions cannot be used.
@@ -923,12 +961,13 @@ class PluggableMap extends BaseObject {
} }
} }
} }
} };
/** /**
* @protected * @protected
*/ */
handlePostRender() { PluggableMap.prototype.handlePostRender = function() {
const frameState = this.frameState_; const frameState = this.frameState_;
@@ -967,19 +1006,21 @@ class PluggableMap extends BaseObject {
postRenderFunctions[i](this, frameState); postRenderFunctions[i](this, frameState);
} }
postRenderFunctions.length = 0; postRenderFunctions.length = 0;
} };
/** /**
* @private * @private
*/ */
handleSizeChanged_() { PluggableMap.prototype.handleSizeChanged_ = function() {
this.render(); this.render();
} };
/** /**
* @private * @private
*/ */
handleTargetChanged_() { PluggableMap.prototype.handleTargetChanged_ = function() {
// target may be undefined, null, a string or an Element. // target may be undefined, null, a string or an Element.
// If it's a string we convert it to an Element before proceeding. // If it's a string we convert it to an Element before proceeding.
// If it's not now an Element we remove the viewport from the DOM. // If it's not now an Element we remove the viewport from the DOM.
@@ -1023,26 +1064,29 @@ class PluggableMap extends BaseObject {
this.updateSize(); this.updateSize();
// updateSize calls setSize, so no need to call this.render // updateSize calls setSize, so no need to call this.render
// ourselves here. // ourselves here.
} };
/** /**
* @private * @private
*/ */
handleTileChange_() { PluggableMap.prototype.handleTileChange_ = function() {
this.render(); this.render();
} };
/** /**
* @private * @private
*/ */
handleViewPropertyChanged_() { PluggableMap.prototype.handleViewPropertyChanged_ = function() {
this.render(); this.render();
} };
/** /**
* @private * @private
*/ */
handleViewChanged_() { PluggableMap.prototype.handleViewChanged_ = function() {
if (this.viewPropertyListenerKey_) { if (this.viewPropertyListenerKey_) {
unlistenByKey(this.viewPropertyListenerKey_); unlistenByKey(this.viewPropertyListenerKey_);
this.viewPropertyListenerKey_ = null; this.viewPropertyListenerKey_ = null;
@@ -1062,12 +1106,13 @@ class PluggableMap extends BaseObject {
this.handleViewPropertyChanged_, this); this.handleViewPropertyChanged_, this);
} }
this.render(); this.render();
} };
/** /**
* @private * @private
*/ */
handleLayerGroupChanged_() { PluggableMap.prototype.handleLayerGroupChanged_ = function() {
if (this.layerGroupPropertyListenerKeys_) { if (this.layerGroupPropertyListenerKeys_) {
this.layerGroupPropertyListenerKeys_.forEach(unlistenByKey); this.layerGroupPropertyListenerKeys_.forEach(unlistenByKey);
this.layerGroupPropertyListenerKeys_ = null; this.layerGroupPropertyListenerKeys_ = null;
@@ -1084,35 +1129,39 @@ class PluggableMap extends BaseObject {
]; ];
} }
this.render(); this.render();
} };
/** /**
* @return {boolean} Is rendered. * @return {boolean} Is rendered.
*/ */
isRendered() { PluggableMap.prototype.isRendered = function() {
return !!this.frameState_; return !!this.frameState_;
} };
/** /**
* Requests an immediate render in a synchronous manner. * Requests an immediate render in a synchronous manner.
* @api * @api
*/ */
renderSync() { PluggableMap.prototype.renderSync = function() {
if (this.animationDelayKey_) { if (this.animationDelayKey_) {
cancelAnimationFrame(this.animationDelayKey_); cancelAnimationFrame(this.animationDelayKey_);
} }
this.animationDelay_(); this.animationDelay_();
} };
/** /**
* Request a map rendering (at the next animation frame). * Request a map rendering (at the next animation frame).
* @api * @api
*/ */
render() { PluggableMap.prototype.render = function() {
if (this.animationDelayKey_ === undefined) { if (this.animationDelayKey_ === undefined) {
this.animationDelayKey_ = requestAnimationFrame(this.animationDelay_); this.animationDelayKey_ = requestAnimationFrame(this.animationDelay_);
} }
} };
/** /**
* Remove the given control from the map. * Remove the given control from the map.
@@ -1121,9 +1170,10 @@ class PluggableMap extends BaseObject {
* if the control was not found). * if the control was not found).
* @api * @api
*/ */
removeControl(control) { PluggableMap.prototype.removeControl = function(control) {
return this.getControls().remove(control); return this.getControls().remove(control);
} };
/** /**
* Remove the given interaction from the map. * Remove the given interaction from the map.
@@ -1132,9 +1182,10 @@ class PluggableMap extends BaseObject {
* undefined if the interaction was not found). * undefined if the interaction was not found).
* @api * @api
*/ */
removeInteraction(interaction) { PluggableMap.prototype.removeInteraction = function(interaction) {
return this.getInteractions().remove(interaction); return this.getInteractions().remove(interaction);
} };
/** /**
* Removes the given layer from the map. * Removes the given layer from the map.
@@ -1143,10 +1194,11 @@ class PluggableMap extends BaseObject {
* layer was not found). * layer was not found).
* @api * @api
*/ */
removeLayer(layer) { PluggableMap.prototype.removeLayer = function(layer) {
const layers = this.getLayerGroup().getLayers(); const layers = this.getLayerGroup().getLayers();
return layers.remove(layer); return layers.remove(layer);
} };
/** /**
* Remove the given overlay from the map. * Remove the given overlay from the map.
@@ -1155,15 +1207,16 @@ class PluggableMap extends BaseObject {
* if the overlay was not found). * if the overlay was not found).
* @api * @api
*/ */
removeOverlay(overlay) { PluggableMap.prototype.removeOverlay = function(overlay) {
return this.getOverlays().remove(overlay); return this.getOverlays().remove(overlay);
} };
/** /**
* @param {number} time Time. * @param {number} time Time.
* @private * @private
*/ */
renderFrame_(time) { PluggableMap.prototype.renderFrame_ = function(time) {
let viewState; let viewState;
const size = this.getSize(); const size = this.getSize();
@@ -1249,7 +1302,8 @@ class PluggableMap extends BaseObject {
setTimeout(this.handlePostRender.bind(this), 0); setTimeout(this.handlePostRender.bind(this), 0);
} };
/** /**
* Sets the layergroup of this map. * Sets the layergroup of this map.
@@ -1257,9 +1311,10 @@ class PluggableMap extends BaseObject {
* @observable * @observable
* @api * @api
*/ */
setLayerGroup(layerGroup) { PluggableMap.prototype.setLayerGroup = function(layerGroup) {
this.set(MapProperty.LAYERGROUP, layerGroup); this.set(MapProperty.LAYERGROUP, layerGroup);
} };
/** /**
* Set the size of this map. * Set the size of this map.
@@ -1267,20 +1322,22 @@ class PluggableMap extends BaseObject {
* @observable * @observable
* @api * @api
*/ */
setSize(size) { PluggableMap.prototype.setSize = function(size) {
this.set(MapProperty.SIZE, size); this.set(MapProperty.SIZE, size);
} };
/** /**
* Set the target element to render this map into. * Set the target element to render this map into.
* @param {HTMLElement|string|undefined} target The Element or id of the Element * @param {Element|string|undefined} target The Element or id of the Element
* that the map is rendered in. * that the map is rendered in.
* @observable * @observable
* @api * @api
*/ */
setTarget(target) { PluggableMap.prototype.setTarget = function(target) {
this.set(MapProperty.TARGET, target); this.set(MapProperty.TARGET, target);
} };
/** /**
* Set the view for this map. * Set the view for this map.
@@ -1288,25 +1345,27 @@ class PluggableMap extends BaseObject {
* @observable * @observable
* @api * @api
*/ */
setView(view) { PluggableMap.prototype.setView = function(view) {
this.set(MapProperty.VIEW, view); this.set(MapProperty.VIEW, view);
} };
/** /**
* @param {module:ol/Feature} feature Feature. * @param {module:ol/Feature} feature Feature.
*/ */
skipFeature(feature) { PluggableMap.prototype.skipFeature = function(feature) {
const featureUid = getUid(feature).toString(); const featureUid = getUid(feature).toString();
this.skippedFeatureUids_[featureUid] = true; this.skippedFeatureUids_[featureUid] = true;
this.render(); this.render();
} };
/** /**
* Force a recalculation of the map viewport size. This should be called when * Force a recalculation of the map viewport size. This should be called when
* third-party code changes the size of the map viewport. * third-party code changes the size of the map viewport.
* @api * @api
*/ */
updateSize() { PluggableMap.prototype.updateSize = function() {
const targetElement = this.getTargetElement(); const targetElement = this.getTargetElement();
if (!targetElement) { if (!targetElement) {
@@ -1326,17 +1385,17 @@ class PluggableMap extends BaseObject {
parseFloat(computedStyle['borderBottomWidth']) parseFloat(computedStyle['borderBottomWidth'])
]); ]);
} }
} };
/** /**
* @param {module:ol/Feature} feature Feature. * @param {module:ol/Feature} feature Feature.
*/ */
unskipFeature(feature) { PluggableMap.prototype.unskipFeature = function(feature) {
const featureUid = getUid(feature).toString(); const featureUid = getUid(feature).toString();
delete this.skippedFeatureUids_[featureUid]; delete this.skippedFeatureUids_[featureUid];
this.render(); this.render();
} };
}
/** /**
@@ -1346,7 +1405,7 @@ class PluggableMap extends BaseObject {
function createOptionsInternal(options) { function createOptionsInternal(options) {
/** /**
* @type {HTMLElement|Document} * @type {Element|Document}
*/ */
let keyboardEventTarget = null; let keyboardEventTarget = null;
if (options.keyboardEventTarget !== undefined) { if (options.keyboardEventTarget !== undefined) {

View File

@@ -1,6 +1,7 @@
/** /**
* @module ol/Tile * @module ol/Tile
*/ */
import {inherits} from './index.js';
import TileState from './TileState.js'; import TileState from './TileState.js';
import {easeIn} from './easing.js'; import {easeIn} from './easing.js';
import EventTarget from './events/EventTarget.js'; import EventTarget from './events/EventTarget.js';
@@ -43,17 +44,15 @@ import EventType from './events/EventType.js';
* @classdesc * @classdesc
* Base class for tiles. * Base class for tiles.
* *
* @constructor
* @abstract * @abstract
*/ * @extends {module:ol/events/EventTarget}
class Tile extends EventTarget {
/**
* @param {module:ol/tilecoord~TileCoord} tileCoord Tile coordinate. * @param {module:ol/tilecoord~TileCoord} tileCoord Tile coordinate.
* @param {module:ol/TileState} state State. * @param {module:ol/TileState} state State.
* @param {module:ol/Tile~Options=} opt_options Tile options. * @param {module:ol/Tile~Options=} opt_options Tile options.
*/ */
constructor(tileCoord, state, opt_options) { const Tile = function(tileCoord, state, opt_options) {
super(); EventTarget.call(this);
const options = opt_options ? opt_options : {}; const options = opt_options ? opt_options : {};
@@ -97,21 +96,25 @@ class Tile extends EventTarget {
*/ */
this.transitionStarts_ = {}; this.transitionStarts_ = {};
} };
inherits(Tile, EventTarget);
/** /**
* @protected * @protected
*/ */
changed() { Tile.prototype.changed = function() {
this.dispatchEvent(EventType.CHANGE); this.dispatchEvent(EventType.CHANGE);
} };
/** /**
* @return {string} Key. * @return {string} Key.
*/ */
getKey() { Tile.prototype.getKey = function() {
return this.key + '/' + this.tileCoord; return this.key + '/' + this.tileCoord;
} };
/** /**
* Get the interim tile most suitable for rendering using the chain of interim * Get the interim tile most suitable for rendering using the chain of interim
@@ -119,7 +122,7 @@ class Tile extends EventTarget {
* such tile exists, the original tile is returned. * such tile exists, the original tile is returned.
* @return {!module:ol/Tile} Best tile for rendering. * @return {!module:ol/Tile} Best tile for rendering.
*/ */
getInterimTile() { Tile.prototype.getInterimTile = function() {
if (!this.interimTile) { if (!this.interimTile) {
//empty chain //empty chain
return this; return this;
@@ -139,13 +142,13 @@ class Tile extends EventTarget {
// we can not find a better tile // we can not find a better tile
return this; return this;
} };
/** /**
* Goes through the chain of interim tiles and discards sections of the chain * Goes through the chain of interim tiles and discards sections of the chain
* that are no longer relevant. * that are no longer relevant.
*/ */
refreshInterimChain() { Tile.prototype.refreshInterimChain = function() {
if (!this.interimTile) { if (!this.interimTile) {
return; return;
} }
@@ -173,31 +176,32 @@ class Tile extends EventTarget {
} }
tile = prev.interimTile; tile = prev.interimTile;
} while (tile); } while (tile);
} };
/** /**
* Get the tile coordinate for this tile. * Get the tile coordinate for this tile.
* @return {module:ol/tilecoord~TileCoord} The tile coordinate. * @return {module:ol/tilecoord~TileCoord} The tile coordinate.
* @api * @api
*/ */
getTileCoord() { Tile.prototype.getTileCoord = function() {
return this.tileCoord; return this.tileCoord;
} };
/** /**
* @return {module:ol/TileState} State. * @return {module:ol/TileState} State.
*/ */
getState() { Tile.prototype.getState = function() {
return this.state; return this.state;
} };
/** /**
* @param {module:ol/TileState} state State. * @param {module:ol/TileState} state State.
*/ */
setState(state) { Tile.prototype.setState = function(state) {
this.state = state; this.state = state;
this.changed(); this.changed();
} };
/** /**
* Load the image or retry if loading previously failed. * Load the image or retry if loading previously failed.
@@ -206,7 +210,7 @@ class Tile extends EventTarget {
* @abstract * @abstract
* @api * @api
*/ */
load() {} Tile.prototype.load = function() {};
/** /**
* Get the alpha value for rendering. * Get the alpha value for rendering.
@@ -214,7 +218,7 @@ class Tile extends EventTarget {
* @param {number} time The render frame time. * @param {number} time The render frame time.
* @return {number} A number between 0 and 1. * @return {number} A number between 0 and 1.
*/ */
getAlpha(id, time) { Tile.prototype.getAlpha = function(id, time) {
if (!this.transition_) { if (!this.transition_) {
return 1; return 1;
} }
@@ -232,7 +236,7 @@ class Tile extends EventTarget {
return 1; return 1;
} }
return easeIn(delta / this.transition_); return easeIn(delta / this.transition_);
} };
/** /**
* Determine if a tile is in an alpha transition. A tile is considered in * Determine if a tile is in an alpha transition. A tile is considered in
@@ -241,23 +245,20 @@ class Tile extends EventTarget {
* @param {number} id An id for the renderer. * @param {number} id An id for the renderer.
* @return {boolean} The tile is in transition. * @return {boolean} The tile is in transition.
*/ */
inTransition(id) { Tile.prototype.inTransition = function(id) {
if (!this.transition_) { if (!this.transition_) {
return false; return false;
} }
return this.transitionStarts_[id] !== -1; return this.transitionStarts_[id] !== -1;
} };
/** /**
* Mark a transition as complete. * Mark a transition as complete.
* @param {number} id An id for the renderer. * @param {number} id An id for the renderer.
*/ */
endTransition(id) { Tile.prototype.endTransition = function(id) {
if (this.transition_) { if (this.transition_) {
this.transitionStarts_[id] = -1; this.transitionStarts_[id] = -1;
} }
} };
}
export default Tile; export default Tile;

View File

@@ -1,24 +1,29 @@
/** /**
* @module ol/TileCache * @module ol/TileCache
*/ */
import {inherits} from './index.js';
import LRUCache from './structs/LRUCache.js'; import LRUCache from './structs/LRUCache.js';
import {fromKey, getKey} from './tilecoord.js'; import {fromKey, getKey} from './tilecoord.js';
class TileCache extends LRUCache {
/** /**
* @constructor
* @extends {module:ol/structs/LRUCache.<module:ol/Tile>}
* @param {number=} opt_highWaterMark High water mark. * @param {number=} opt_highWaterMark High water mark.
* @struct
*/ */
constructor(opt_highWaterMark) { const TileCache = function(opt_highWaterMark) {
super(opt_highWaterMark); LRUCache.call(this, opt_highWaterMark);
};
inherits(TileCache, LRUCache);
}
/** /**
* @param {!Object.<string, module:ol/TileRange>} usedTiles Used tiles. * @param {!Object.<string, module:ol/TileRange>} usedTiles Used tiles.
*/ */
expireCache(usedTiles) { TileCache.prototype.expireCache = function(usedTiles) {
while (this.canExpireCache()) { while (this.canExpireCache()) {
const tile = this.peekLast(); const tile = this.peekLast();
const zKey = tile.tileCoord[0].toString(); const zKey = tile.tileCoord[0].toString();
@@ -28,12 +33,13 @@ class TileCache extends LRUCache {
this.pop().dispose(); this.pop().dispose();
} }
} }
} };
/** /**
* Prune all tiles from the cache that don't have the same z as the newest tile. * Prune all tiles from the cache that don't have the same z as the newest tile.
*/ */
pruneExceptNewestZ() { TileCache.prototype.pruneExceptNewestZ = function() {
if (this.getCount() === 0) { if (this.getCount() === 0) {
return; return;
} }
@@ -46,8 +52,5 @@ class TileCache extends LRUCache {
tile.dispose(); tile.dispose();
} }
}, this); }, this);
} };
}
export default TileCache; export default TileCache;

View File

@@ -1,6 +1,7 @@
/** /**
* @module ol/TileQueue * @module ol/TileQueue
*/ */
import {inherits} from './index.js';
import TileState from './TileState.js'; import TileState from './TileState.js';
import {listen, unlisten} from './events.js'; import {listen, unlisten} from './events.js';
import EventType from './events/EventType.js'; import EventType from './events/EventType.js';
@@ -12,15 +13,19 @@ import PriorityQueue from './structs/PriorityQueue.js';
*/ */
class TileQueue extends PriorityQueue {
/** /**
* @param {module:ol/TileQueue~PriorityFunction} tilePriorityFunction Tile priority function. * @constructor
* @param {function(): ?} tileChangeCallback Function called on each tile change event. * @extends {module:ol/structs/PriorityQueue.<Array>}
* @param {module:ol/TileQueue~PriorityFunction} tilePriorityFunction
* Tile priority function.
* @param {function(): ?} tileChangeCallback
* Function called on each tile change event.
* @struct
*/ */
constructor(tilePriorityFunction, tileChangeCallback) { const TileQueue = function(tilePriorityFunction, tileChangeCallback) {
super( PriorityQueue.call(
this,
/** /**
* @param {Array} element Element. * @param {Array} element Element.
* @return {number} Priority. * @return {number} Priority.
@@ -54,32 +59,37 @@ class TileQueue extends PriorityQueue {
*/ */
this.tilesLoadingKeys_ = {}; this.tilesLoadingKeys_ = {};
} };
inherits(TileQueue, PriorityQueue);
/** /**
* @inheritDoc * @inheritDoc
*/ */
enqueue(element) { TileQueue.prototype.enqueue = function(element) {
const added = super.enqueue(element); const added = PriorityQueue.prototype.enqueue.call(this, element);
if (added) { if (added) {
const tile = element[0]; const tile = element[0];
listen(tile, EventType.CHANGE, this.handleTileChange, this); listen(tile, EventType.CHANGE, this.handleTileChange, this);
} }
return added; return added;
} };
/** /**
* @return {number} Number of tiles loading. * @return {number} Number of tiles loading.
*/ */
getTilesLoading() { TileQueue.prototype.getTilesLoading = function() {
return this.tilesLoading_; return this.tilesLoading_;
} };
/** /**
* @param {module:ol/events/Event} event Event. * @param {module:ol/events/Event} event Event.
* @protected * @protected
*/ */
handleTileChange(event) { TileQueue.prototype.handleTileChange = function(event) {
const tile = /** @type {module:ol/Tile} */ (event.target); const tile = /** @type {module:ol/Tile} */ (event.target);
const state = tile.getState(); const state = tile.getState();
if (state === TileState.LOADED || state === TileState.ERROR || if (state === TileState.LOADED || state === TileState.ERROR ||
@@ -92,13 +102,14 @@ class TileQueue extends PriorityQueue {
} }
this.tileChangeCallback_(); this.tileChangeCallback_();
} }
} };
/** /**
* @param {number} maxTotalLoading Maximum number tiles to load simultaneously. * @param {number} maxTotalLoading Maximum number tiles to load simultaneously.
* @param {number} maxNewLoads Maximum number of new tiles to load. * @param {number} maxNewLoads Maximum number of new tiles to load.
*/ */
loadMoreTiles(maxTotalLoading, maxNewLoads) { TileQueue.prototype.loadMoreTiles = function(maxTotalLoading, maxNewLoads) {
let newLoads = 0; let newLoads = 0;
let abortedTiles = false; let abortedTiles = false;
let state, tile, tileKey; let state, tile, tileKey;
@@ -121,8 +132,5 @@ class TileQueue extends PriorityQueue {
// a small, saturated tile cache. // a small, saturated tile cache.
this.tileChangeCallback_(); this.tileChangeCallback_();
} }
} };
}
export default TileQueue; export default TileQueue;

View File

@@ -1,20 +1,18 @@
/** /**
* @module ol/TileRange * @module ol/TileRange
*/ */
/** /**
* A representation of a contiguous block of tiles. A tile range is specified * A representation of a contiguous block of tiles. A tile range is specified
* by its min/max tile coordinates and is inclusive of coordinates. * by its min/max tile coordinates and is inclusive of coordinates.
*/ *
class TileRange { * @constructor
/**
* @param {number} minX Minimum X. * @param {number} minX Minimum X.
* @param {number} maxX Maximum X. * @param {number} maxX Maximum X.
* @param {number} minY Minimum Y. * @param {number} minY Minimum Y.
* @param {number} maxY Maximum Y. * @param {number} maxY Maximum Y.
* @struct
*/ */
constructor(minX, maxX, minY, maxY) { const TileRange = function(minX, maxX, minY, maxY) {
/** /**
* @type {number} * @type {number}
@@ -36,93 +34,7 @@ class TileRange {
*/ */
this.maxY = maxY; this.maxY = maxY;
} };
/**
* @param {module:ol/tilecoord~TileCoord} tileCoord Tile coordinate.
* @return {boolean} Contains tile coordinate.
*/
contains(tileCoord) {
return this.containsXY(tileCoord[1], tileCoord[2]);
}
/**
* @param {module:ol/TileRange} tileRange Tile range.
* @return {boolean} Contains.
*/
containsTileRange(tileRange) {
return this.minX <= tileRange.minX && tileRange.maxX <= this.maxX &&
this.minY <= tileRange.minY && tileRange.maxY <= this.maxY;
}
/**
* @param {number} x Tile coordinate x.
* @param {number} y Tile coordinate y.
* @return {boolean} Contains coordinate.
*/
containsXY(x, y) {
return this.minX <= x && x <= this.maxX && this.minY <= y && y <= this.maxY;
}
/**
* @param {module:ol/TileRange} tileRange Tile range.
* @return {boolean} Equals.
*/
equals(tileRange) {
return this.minX == tileRange.minX && this.minY == tileRange.minY &&
this.maxX == tileRange.maxX && this.maxY == tileRange.maxY;
}
/**
* @param {module:ol/TileRange} tileRange Tile range.
*/
extend(tileRange) {
if (tileRange.minX < this.minX) {
this.minX = tileRange.minX;
}
if (tileRange.maxX > this.maxX) {
this.maxX = tileRange.maxX;
}
if (tileRange.minY < this.minY) {
this.minY = tileRange.minY;
}
if (tileRange.maxY > this.maxY) {
this.maxY = tileRange.maxY;
}
}
/**
* @return {number} Height.
*/
getHeight() {
return this.maxY - this.minY + 1;
}
/**
* @return {module:ol/size~Size} Size.
*/
getSize() {
return [this.getWidth(), this.getHeight()];
}
/**
* @return {number} Width.
*/
getWidth() {
return this.maxX - this.minX + 1;
}
/**
* @param {module:ol/TileRange} tileRange Tile range.
* @return {boolean} Intersects.
*/
intersects(tileRange) {
return this.minX <= tileRange.maxX &&
this.maxX >= tileRange.minX &&
this.minY <= tileRange.maxY &&
this.maxY >= tileRange.minY;
}
}
/** /**
@@ -146,4 +58,96 @@ export function createOrUpdate(minX, maxX, minY, maxY, tileRange) {
} }
/**
* @param {module:ol/tilecoord~TileCoord} tileCoord Tile coordinate.
* @return {boolean} Contains tile coordinate.
*/
TileRange.prototype.contains = function(tileCoord) {
return this.containsXY(tileCoord[1], tileCoord[2]);
};
/**
* @param {module:ol/TileRange} tileRange Tile range.
* @return {boolean} Contains.
*/
TileRange.prototype.containsTileRange = function(tileRange) {
return this.minX <= tileRange.minX && tileRange.maxX <= this.maxX &&
this.minY <= tileRange.minY && tileRange.maxY <= this.maxY;
};
/**
* @param {number} x Tile coordinate x.
* @param {number} y Tile coordinate y.
* @return {boolean} Contains coordinate.
*/
TileRange.prototype.containsXY = function(x, y) {
return this.minX <= x && x <= this.maxX && this.minY <= y && y <= this.maxY;
};
/**
* @param {module:ol/TileRange} tileRange Tile range.
* @return {boolean} Equals.
*/
TileRange.prototype.equals = function(tileRange) {
return this.minX == tileRange.minX && this.minY == tileRange.minY &&
this.maxX == tileRange.maxX && this.maxY == tileRange.maxY;
};
/**
* @param {module:ol/TileRange} tileRange Tile range.
*/
TileRange.prototype.extend = function(tileRange) {
if (tileRange.minX < this.minX) {
this.minX = tileRange.minX;
}
if (tileRange.maxX > this.maxX) {
this.maxX = tileRange.maxX;
}
if (tileRange.minY < this.minY) {
this.minY = tileRange.minY;
}
if (tileRange.maxY > this.maxY) {
this.maxY = tileRange.maxY;
}
};
/**
* @return {number} Height.
*/
TileRange.prototype.getHeight = function() {
return this.maxY - this.minY + 1;
};
/**
* @return {module:ol/size~Size} Size.
*/
TileRange.prototype.getSize = function() {
return [this.getWidth(), this.getHeight()];
};
/**
* @return {number} Width.
*/
TileRange.prototype.getWidth = function() {
return this.maxX - this.minX + 1;
};
/**
* @param {module:ol/TileRange} tileRange Tile range.
* @return {boolean} Intersects.
*/
TileRange.prototype.intersects = function(tileRange) {
return this.minX <= tileRange.maxX &&
this.maxX >= tileRange.minX &&
this.minY <= tileRange.maxY &&
this.maxY >= tileRange.minY;
};
export default TileRange; export default TileRange;

Some files were not shown because too many files have changed in this diff Show More