Compare commits
415 Commits
v4.1.1
...
v4.3.0-bet
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
3279d5634b | ||
|
|
5b75666755 | ||
|
|
1c8734b150 | ||
|
|
ff9ef481db | ||
|
|
02cc7d643a | ||
|
|
efee061251 | ||
|
|
3551679a7c | ||
|
|
86eacefe19 | ||
|
|
7d260c54d3 | ||
|
|
25dca1ea3b | ||
|
|
6fd844d24c | ||
|
|
9f6839c87b | ||
|
|
e9611e6a6b | ||
|
|
b9089c00e3 | ||
|
|
388e2a93cb | ||
|
|
ac13dbccf1 | ||
|
|
1795a86f7f | ||
|
|
66da6fc150 | ||
|
|
e0eec51eb3 | ||
|
|
4b4d711dbc | ||
|
|
bb405e2919 | ||
|
|
f133f4fc3c | ||
|
|
35f22fb52c | ||
|
|
617151c8ff | ||
|
|
25e1e11550 | ||
|
|
67aa1a6dc9 | ||
|
|
3290039b32 | ||
|
|
e52ca96dc3 | ||
|
|
25b851e7cb | ||
|
|
9cbbc30ce1 | ||
|
|
2392f87113 | ||
|
|
63b14f5f32 | ||
|
|
ee7795e31d | ||
|
|
aba1045304 | ||
|
|
83c35758c8 | ||
|
|
d4d371a4c2 | ||
|
|
b3be7e7ba9 | ||
|
|
60f9c4be2d | ||
|
|
22dfe93f8b | ||
|
|
1bbcdea9bd | ||
|
|
e91ad26ac9 | ||
|
|
0fc3b0f58e | ||
|
|
afe0c10f45 | ||
|
|
d5fd215632 | ||
|
|
d9c49092e4 | ||
|
|
9fdce0f2b1 | ||
|
|
007d8c2d5e | ||
|
|
68f6b61217 | ||
|
|
1b46f38696 | ||
|
|
c6b942f185 | ||
|
|
2258c00fca | ||
|
|
f01e5d3eaf | ||
|
|
52a9ca6518 | ||
|
|
0d0f3cadc8 | ||
|
|
e454d3220e | ||
|
|
9b90ec099c | ||
|
|
fad485069b | ||
|
|
9ee1f6df98 | ||
|
|
b0b68983f7 | ||
|
|
8dbbe3ba5d | ||
|
|
e94b660b04 | ||
|
|
6cf3a3ca28 | ||
|
|
7782870522 | ||
|
|
648cd0ca61 | ||
|
|
b9b70ea3ec | ||
|
|
2f1bfc42ca | ||
|
|
2c358387a2 | ||
|
|
70af444b98 | ||
|
|
707bc4a708 | ||
|
|
ac48af204e | ||
|
|
fd7272ab1e | ||
|
|
ecadb6b685 | ||
|
|
fa41c0bad6 | ||
|
|
dd878e2a4c | ||
|
|
8666c8fee8 | ||
|
|
dd914ef635 | ||
|
|
719abf7265 | ||
|
|
c86d13f032 | ||
|
|
1b34dd945e | ||
|
|
cc13641216 | ||
|
|
13a0ca5ca1 | ||
|
|
704cd03d96 | ||
|
|
e79a4dd006 | ||
|
|
4bb2f6c1f5 | ||
|
|
89ec2dacad | ||
|
|
b97439cf8e | ||
|
|
f61bd6352d | ||
|
|
b7b2ee0c57 | ||
|
|
fe39b5da1b | ||
|
|
bc0bc3f8a9 | ||
|
|
9c0d0c5681 | ||
|
|
b97daf844b | ||
|
|
f8237c9cd2 | ||
|
|
b317a4474e | ||
|
|
b1772dae44 | ||
|
|
c33383d248 | ||
|
|
645e359cde | ||
|
|
fa71593a2a | ||
|
|
2e903c0293 | ||
|
|
aced192bcd | ||
|
|
19b0b956f7 | ||
|
|
9f9355ac46 | ||
|
|
f28e6c2d95 | ||
|
|
e633380221 | ||
|
|
5f6f757bd0 | ||
|
|
b29fc52842 | ||
|
|
791ffaabeb | ||
|
|
c31d67fe57 | ||
|
|
a1710be335 | ||
|
|
2260d92436 | ||
|
|
4d0e106d98 | ||
|
|
2be40953a8 | ||
|
|
8bc4bde5c3 | ||
|
|
429e2982d0 | ||
|
|
23f8540b4c | ||
|
|
59d8d749e3 | ||
|
|
cff9ef5e63 | ||
|
|
e6e0109a1b | ||
|
|
7739239e89 | ||
|
|
eb8d5bcade | ||
|
|
ff242ef28c | ||
|
|
4a0f97ac6a | ||
|
|
a0e0e76995 | ||
|
|
b5f9b88d0e | ||
|
|
339f048826 | ||
|
|
8db49fa981 | ||
|
|
4f0bfbc1db | ||
|
|
77273321b7 | ||
|
|
db63cc1b23 | ||
|
|
f88d8b8a7d | ||
|
|
991328904d | ||
|
|
9d3539b3cb | ||
|
|
bd143c0ad1 | ||
|
|
970265acb0 | ||
|
|
36c80f61bc | ||
|
|
d86c7c22dc | ||
|
|
71b334d49c | ||
|
|
ee0eb8b1a0 | ||
|
|
cd4ed759ed | ||
|
|
c0e4da6d8c | ||
|
|
72f5ff917f | ||
|
|
4c9c9fa719 | ||
|
|
163e01a2dc | ||
|
|
79862ca8c2 | ||
|
|
aa8d7b0b36 | ||
|
|
8d0857fd7a | ||
|
|
67f69a32bb | ||
|
|
382674975e | ||
|
|
eaaa895b0a | ||
|
|
70b971d3a4 | ||
|
|
3ddb8712a3 | ||
|
|
533ca8b9fe | ||
|
|
0fc710bc48 | ||
|
|
fe18636ff9 | ||
|
|
c299bfcd0f | ||
|
|
3f5a6bca26 | ||
|
|
a6b35e7d8a | ||
|
|
619e85e737 | ||
|
|
b3407b0554 | ||
|
|
a4c421e699 | ||
|
|
a3a443324d | ||
|
|
7b9833fdce | ||
|
|
bd87ec7c83 | ||
|
|
26bfa7a172 | ||
|
|
f82bc15013 | ||
|
|
da60b96445 | ||
|
|
2ed5abed07 | ||
|
|
49dcda7794 | ||
|
|
9fc0fb5e74 | ||
|
|
d32006b324 | ||
|
|
feabb6440d | ||
|
|
87e9c9ad46 | ||
|
|
7d6929c710 | ||
|
|
887642e69c | ||
|
|
b9e6619b2d | ||
|
|
78b5fe5f8c | ||
|
|
72e9b74b3e | ||
|
|
c6aeda1511 | ||
|
|
eb501e1244 | ||
|
|
1f51c14e7e | ||
|
|
dee3ebdc54 | ||
|
|
d0ef05977b | ||
|
|
a17db4f45c | ||
|
|
20974fea55 | ||
|
|
416df98505 | ||
|
|
fb5891cd48 | ||
|
|
1d4a482c1a | ||
|
|
8d57a879ce | ||
|
|
3e7aecd094 | ||
|
|
c46bc1f02a | ||
|
|
0d0ed6c130 | ||
|
|
0045bed6e7 | ||
|
|
0982dc0551 | ||
|
|
e38efc7cbe | ||
|
|
ea4e5f2293 | ||
|
|
29d1590bc6 | ||
|
|
e14ee2ea72 | ||
|
|
68ca4b3c2a | ||
|
|
4ad85e52e2 | ||
|
|
4255e81b93 | ||
|
|
81e8cdc7ab | ||
|
|
b1b5b54fd0 | ||
|
|
109362f147 | ||
|
|
b5038c18e2 | ||
|
|
87d889f96c | ||
|
|
9b41ea4017 | ||
|
|
51658a0d7c | ||
|
|
2f45e14bea | ||
|
|
aa56afdab7 | ||
|
|
9fda131d37 | ||
|
|
b3ddcd4ed9 | ||
|
|
107792635d | ||
|
|
7ea8cf5fb3 | ||
|
|
1d6ce6db35 | ||
|
|
4e44a09072 | ||
|
|
dc6d0c091a | ||
|
|
af6aaf4bab | ||
|
|
e822731f8c | ||
|
|
a23246aca1 | ||
|
|
f31e45d7d2 | ||
|
|
34e61da366 | ||
|
|
451aef200f | ||
|
|
bb8a1b061c | ||
|
|
d4367cdd7d | ||
|
|
3b15bb80b9 | ||
|
|
399e11edf7 | ||
|
|
f97f370e5b | ||
|
|
070f2e181c | ||
|
|
9d9da4feb9 | ||
|
|
ce858a80ed | ||
|
|
4898c83590 | ||
|
|
d8ed2eb1be | ||
|
|
00c8a5845e | ||
|
|
d8dba61b0a | ||
|
|
b8117b3931 | ||
|
|
aface2f43e | ||
|
|
9691130b83 | ||
|
|
1fbf3caa50 | ||
|
|
e3128c204e | ||
|
|
1e6b27d42a | ||
|
|
c24bd209e6 | ||
|
|
df96cc6e56 | ||
|
|
641549c9ed | ||
|
|
66e0308028 | ||
|
|
22939abb0d | ||
|
|
dfc4bff579 | ||
|
|
588223915c | ||
|
|
5702670bd3 | ||
|
|
d79760e9dd | ||
|
|
21011d00ea | ||
|
|
23cb98272c | ||
|
|
b8b2712f73 | ||
|
|
8b6a29decf | ||
|
|
5475841ca0 | ||
|
|
e8a2ad1d1b | ||
|
|
54a62ea78d | ||
|
|
bcda41b508 | ||
|
|
c0fac0f5ca | ||
|
|
0faf0dd2a1 | ||
|
|
9a698ce1e8 | ||
|
|
a7683c60c9 | ||
|
|
9412b770bf | ||
|
|
29a6473c3d | ||
|
|
7ceed1f42d | ||
|
|
959367629e | ||
|
|
aeed1f79bb | ||
|
|
278d3a0313 | ||
|
|
5af9f71d38 | ||
|
|
b6f446e909 | ||
|
|
7804a2db86 | ||
|
|
0e4d2b50b4 | ||
|
|
b594cf0d74 | ||
|
|
074fdeb212 | ||
|
|
a1355ee766 | ||
|
|
c3e1bb40f4 | ||
|
|
661410a96e | ||
|
|
e272eced94 | ||
|
|
4ab901ed43 | ||
|
|
c1abe4a550 | ||
|
|
3fc76f9c10 | ||
|
|
1e304f56cb | ||
|
|
5929826c5f | ||
|
|
9dad36b117 | ||
|
|
8b9f994cea | ||
|
|
7ecb2c0185 | ||
|
|
342c49f0bb | ||
|
|
bb220b5c3b | ||
|
|
3455f00d23 | ||
|
|
992ab7120c | ||
|
|
5215722c78 | ||
|
|
56b3203fa9 | ||
|
|
3cc4a0c6e3 | ||
|
|
556ede5960 | ||
|
|
46c610f35e | ||
|
|
18357be938 | ||
|
|
a9f369479f | ||
|
|
8c00bbc91d | ||
|
|
9af01c515f | ||
|
|
567cc304ed | ||
|
|
98a1654b47 | ||
|
|
ddbe1986ad | ||
|
|
ac19d4d19c | ||
|
|
142f16afe4 | ||
|
|
07810818cc | ||
|
|
4664a19718 | ||
|
|
46f59acdce | ||
|
|
c61189121e | ||
|
|
8c14262efc | ||
|
|
fa398766d9 | ||
|
|
026fcc66c9 | ||
|
|
7c5a3ae311 | ||
|
|
feacf7614e | ||
|
|
8609e65fc2 | ||
|
|
3ff33699c8 | ||
|
|
df72d7b20f | ||
|
|
1d7144564c | ||
|
|
aced2e4e94 | ||
|
|
9b9ac03760 | ||
|
|
c052de2bbc | ||
|
|
85d0e9797c | ||
|
|
f975319d02 | ||
|
|
b8164df349 | ||
|
|
1458d77844 | ||
|
|
052f2ac321 | ||
|
|
4a6945ac17 | ||
|
|
c9ca9737a7 | ||
|
|
2e1495fc07 | ||
|
|
55de3020d3 | ||
|
|
366bf46ca1 | ||
|
|
50615557d9 | ||
|
|
1c0f891427 | ||
|
|
0c6c0ef6d5 | ||
|
|
ff91974345 | ||
|
|
e7dc09cf9f | ||
|
|
fcf9649ef9 | ||
|
|
55e3746554 | ||
|
|
a59a147dbd | ||
|
|
355ce9f679 | ||
|
|
785e7135a7 | ||
|
|
735ab45480 | ||
|
|
55c2adc503 | ||
|
|
2486b25e5e | ||
|
|
020a8da9bb | ||
|
|
d559037f31 | ||
|
|
cce81bcefb | ||
|
|
fc73c4b1fd | ||
|
|
588efb1427 | ||
|
|
2d46c83149 | ||
|
|
3c62396533 | ||
|
|
22f55a7aeb | ||
|
|
3d7bd00abf | ||
|
|
7b1ed14e4e | ||
|
|
3c88e04d4c | ||
|
|
9adab910f4 | ||
|
|
d7969931e8 | ||
|
|
94b6f27937 | ||
|
|
8690bb7c12 | ||
|
|
49b5bbc964 | ||
|
|
479d98212b | ||
|
|
3f973e6fa3 | ||
|
|
584d4f67bd | ||
|
|
642ed5f46e | ||
|
|
9a9e6e94ff | ||
|
|
88b028e4a5 | ||
|
|
fb07d2dad6 | ||
|
|
b4f68ef021 | ||
|
|
403214f569 | ||
|
|
944f0df981 | ||
|
|
97b3ff0499 | ||
|
|
4507fb9368 | ||
|
|
cdd44c4db8 | ||
|
|
983fe5e086 | ||
|
|
f4686adced | ||
|
|
25aeb58c87 | ||
|
|
dd73ac8892 | ||
|
|
16f97a74d7 | ||
|
|
242c55dcff | ||
|
|
1f87dcc6b8 | ||
|
|
dafe3a0811 | ||
|
|
9ac4d137ff | ||
|
|
3cb3113705 | ||
|
|
239f9e817d | ||
|
|
b9f42ddc0f | ||
|
|
c437afc15b | ||
|
|
41812172a7 | ||
|
|
11e682e061 | ||
|
|
821cf24c5b | ||
|
|
14f29e95a7 | ||
|
|
8aa30ee8f6 | ||
|
|
c9303f5889 | ||
|
|
b1f38ea0e8 | ||
|
|
3e9cbade45 | ||
|
|
52af66e0f9 | ||
|
|
c1911994ea | ||
|
|
af62ef736d | ||
|
|
4a6f427df7 | ||
|
|
00a2d7b1cb | ||
|
|
e2af6b9d04 | ||
|
|
4955097a52 | ||
|
|
870bc51ad9 | ||
|
|
ea54543602 | ||
|
|
bb278df881 | ||
|
|
46fde0e439 | ||
|
|
e3d895be4c | ||
|
|
dd8d4b5ad8 | ||
|
|
d956a3bdb3 | ||
|
|
66930ab303 | ||
|
|
0f032a1388 | ||
|
|
5ce54c9e0d | ||
|
|
b86950da6f | ||
|
|
f7c71bdaac | ||
|
|
ee2aa91d97 | ||
|
|
c353455b83 | ||
|
|
530419a839 | ||
|
|
c027b4d127 |
@@ -1,2 +1,3 @@
|
||||
examples/Jugl.js
|
||||
examples/resources/
|
||||
build/package/**/*webgl*
|
||||
|
||||
7
.github/ISSUE_TEMPLATE.md
vendored
Normal file
7
.github/ISSUE_TEMPLATE.md
vendored
Normal file
@@ -0,0 +1,7 @@
|
||||
This issue tracker is for reporting bugs or feature requests, not for asking questions. For usage questions, refer to the (documentation)[http://openlayers.org/en/latest/doc/].
|
||||
|
||||
Ready to submit your bug or feature request? Make sure these boxes are checked before submitting your issue. Thank you!
|
||||
|
||||
- [ ] I have searched GitHub to see if a similar bug or feature request has already been reported.
|
||||
- [ ] If reporting a bug, I have tried with 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.
|
||||
5
.github/PULL_REQUEST_TEMPLATE.md
vendored
Normal file
5
.github/PULL_REQUEST_TEMPLATE.md
vendored
Normal file
@@ -0,0 +1,5 @@
|
||||
Make sure these boxes are checked before submitting your pull request. Thank you!
|
||||
|
||||
- [ ] This pull request addresses an issue that has been marked with the 'Pull request accepted' label.
|
||||
- [ ] It contains one or more small, incremental, logically separate commits, with no merge commits.
|
||||
- [ ] I have used clear commit messages.
|
||||
5
Makefile
5
Makefile
@@ -86,7 +86,7 @@ check-deps:
|
||||
done ;\
|
||||
|
||||
.PHONY: ci
|
||||
ci: lint build test test-rendering compile-examples check-examples apidoc
|
||||
ci: lint build test test-rendering package compile-examples check-examples apidoc
|
||||
|
||||
.PHONY: compile-examples
|
||||
compile-examples: build/compiled-examples/all.combined.js
|
||||
@@ -253,7 +253,7 @@ build/timestamps/eslint-timestamp: $(SRC_JS) $(SPEC_JS) $(SPEC_RENDERING_JS) \
|
||||
build/timestamps/node-modules-timestamp
|
||||
@mkdir -p $(@D)
|
||||
@echo "Running eslint..."
|
||||
@./node_modules/.bin/eslint --quiet tasks test test_rendering src examples
|
||||
@./node_modules/.bin/eslint tasks test test_rendering src examples
|
||||
@touch $@
|
||||
|
||||
build/timestamps/node-modules-timestamp: package.json
|
||||
@@ -310,3 +310,4 @@ package:
|
||||
@rm build/package/typedefs.js
|
||||
@cp css/ol.css build/package
|
||||
./node_modules/.bin/jscodeshift --transform transforms/module.js build/package
|
||||
npm run lint-package
|
||||
|
||||
@@ -9,9 +9,13 @@
|
||||
|
||||
## Getting Started
|
||||
|
||||
Use one of the following methods to use OpenLayers in your project:
|
||||
|
||||
- For use with mainstream bundlers and minifiers, install the [ol](https://www.npmjs.com/package/ol) npm package: `npm install ol`
|
||||
- Use `ol.js` and `ol.css` from (cdnjs)[https://cdnjs.com/libraries/openlayers]
|
||||
- Download the [latest release](https://openlayers.org/download/)
|
||||
- Install with npm: `npm install openlayers`
|
||||
- Clone the repo: `git clone git@github.com:openlayers/openlayers.git`
|
||||
- For use with Closure Library, install the [openlayers](https://npmjs.com/package/openlayers) npm package and read the [tutorial](http://openlayers.org/en/latest/doc/tutorials/closure.html).
|
||||
|
||||
## Supported Browsers
|
||||
|
||||
@@ -33,4 +37,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)
|
||||
- Follow [@openlayers](https://twitter.com/openlayers) on Twitter
|
||||
- Discuss with openlayers users on IRC in `#openlayers` at `chat.freenode`
|
||||
|
||||
@@ -2,6 +2,60 @@
|
||||
|
||||
### Next release
|
||||
|
||||
#### `ol.interaction.Modify` deletes with `alt` key only
|
||||
|
||||
To delete features with the modify interaction, press the `alt` key while clicking on an existing vertex. If you want to configure the modify interaction with a different delete condition, use the `deleteCondition` option. For example, to allow deletion on a single click with no modifier keys, configure the interaction like this:
|
||||
```js
|
||||
var interaction = new ol.interaction.Modify({
|
||||
source: source,
|
||||
deleteCondition: function(event) {
|
||||
return ol.events.condition.noModifierKeys(event) && ol.events.condition.singleClick(event);
|
||||
}
|
||||
});
|
||||
```
|
||||
|
||||
The motivation for this change is to make the modify, draw, and snap interactions all work well together. Previously, the use of these interactions with the default configuration would make it so you couldn't reliably add new vertices (click with no modifier) and delete existing vertices (click with no modifier).
|
||||
|
||||
#### `ol.source.VectorTile` no longer has a `tilePixelRatio` option
|
||||
|
||||
The `tilePixelRatio` option was only used for tiles in projections with `tile-pixels` as units. For tiles read with `ol.format.MVT` and the default tile loader, or tiles with the default pixel size of 4096 pixels, no changes are necessary. For the very rare cases that do not fall under these categories, a custom `tileLoadFunction` now needs to be configured on the `ol.source.VectorTile`. In addition to calling `tile.setFeatures()` and `tile.setProjection()`, it also needs to contain code like the following:
|
||||
```js
|
||||
var extent = tile.getFormat() instanceof ol.format.MVT ?
|
||||
tile.getLastExtent() :
|
||||
[0, 0, tilePixelRatio * tileSize, tilePixelRatio * tileSize];
|
||||
tile.setExtent(extent);
|
||||
```
|
||||
|
||||
#### `ol.animate` now takes the shortest arc for rotation animation
|
||||
|
||||
Usually rotation animations should animate along the shortest arc. There are rare occasions where a spinning animation effect is desired. So if you previously had something like
|
||||
```js
|
||||
map.getView().animate({
|
||||
rotation: 2 * Math.PI,
|
||||
duration: 2000
|
||||
});
|
||||
```
|
||||
we recommend to split the animation into two parts and use different easing functions. The code below results in the same effect as the snippet above did with previous versions:
|
||||
```js
|
||||
map.getView().animate({
|
||||
rotation: Math.PI,
|
||||
easing: ol.easing.easeIn
|
||||
}, {
|
||||
rotation: 2 * Math.PI,
|
||||
easing: ol.easing.easeOut
|
||||
});
|
||||
```
|
||||
|
||||
### v4.2.0
|
||||
|
||||
#### Return values of two `ol.style.RegularShape` getters have changed
|
||||
|
||||
To provide a more consistent behaviour the following getters now return the same value that was given to constructor:
|
||||
|
||||
`ol.style.RegularShape#getPoints` does not return the double amount of points anymore if a radius2 is set.
|
||||
|
||||
`ol.style.RegularShape#getRadius2` will return `undefined` if no radius2 is set.
|
||||
|
||||
### v4.1.0
|
||||
|
||||
#### Adding duplicate layers to a map throws
|
||||
|
||||
151
changelog/v4.2.0.md
Normal file
151
changelog/v4.2.0.md
Normal file
@@ -0,0 +1,151 @@
|
||||
# 4.2.0
|
||||
|
||||
## Summary
|
||||
|
||||
The v4.2.0 release includes features and fixes from 87 pull requests.
|
||||
|
||||
#### New `movestart` event on `ol.Map`
|
||||
|
||||
The map now has a `movestart` event, as countarpart to the already existing `moveend` event.
|
||||
|
||||
#### New `moveTolerance` option in `ol.Map`
|
||||
|
||||
Some touch devices do not play well with OpenLayers's way of detecting clicks. To overcome this, a new `moveTolerance` option was introduced, so users can override the 1 pixel threshold above which a touch-release sequence won't be considered a click any more.
|
||||
|
||||
#### Support for multiple layers in `ol.format.TopoJSON`
|
||||
|
||||
With the new `layerName` and `layers` options, applications can extract the layer as additional attribute for vector features from `ol.format.TopoJSON`. This can especially be useful for styling vector tile layers.
|
||||
|
||||
#### New `tileJSON` option for `ol.source.TileJSON`
|
||||
|
||||
Like `ol.source.TileUTFGrid`, `ol.source.TileJSON` now also has a `tileJSON` option to configue it with inline TileJSON instead of a TileJSON URL.
|
||||
|
||||
#### New `ol.format.filter.during` filter
|
||||
|
||||
Although OpenLayers has no support for WFS v2.0, we added `ol.format.filter.during` for the `During` temporal operator.
|
||||
|
||||
#### Improved vector tile rendering at non-native resolutions
|
||||
|
||||
The vector tile renderer now uses an internal tile grid for all resolutions to cache pre-rendered tiles, even if the tile source does not have tiles for the viewed resolution. This improves rendering quality and performance.
|
||||
|
||||
#### New `insertVertexCondition` for `ol.interaction.Modify`
|
||||
|
||||
Applications can now control whether a vertex will be inserted into the modified geometry. This makes it easier to modify custom geometries.
|
||||
|
||||
#### New `callback` option for `ol.View#fit()`
|
||||
|
||||
To allow applications to perform custom actions when an animation associated with `ol.View#fit()` is completed, that method now has a new `callback` option.
|
||||
|
||||
#### New `ol.View#getInteracting()` getter
|
||||
|
||||
Like `ol.View#getAnimating()` returns `true` during a view animation, `ol.View#getInteracting()` returns `true` while users are interacting with the view.
|
||||
|
||||
#### New `hasZ` option for `ol.format.WFS#writeTransaction()`
|
||||
|
||||
When the new `hasZ` option is set to `true`, 3D coordinates will be preserved and encoded when writing a WFS transaction.
|
||||
|
||||
#### New `wrapX` option for `ol.source.Stamen`
|
||||
|
||||
Like other tile sources, `ol.source.Stamen` now also has a `wrapX` option, which allows applications to turn off wrapping the world in x direction.
|
||||
|
||||
#### Label support for `ol.Graticule`
|
||||
|
||||
The `ol.Graticule` component has several new options to add and control the output of labels. To turn on labelling, configure `ol.Graticule` with `showLabels: true`. The new options to control label formatting are `lonLabelFormatter`, `latLabelFormatter`, `lonLabelPosition` and `latLabelPosition`.
|
||||
|
||||
#### Return values of two `ol.style.RegularShape` getters have changed
|
||||
|
||||
To provide a more consistent behaviour the following getters now return the same value that was given to constructor:
|
||||
|
||||
`ol.style.RegularShape#getPoints` does not return the double amount of points anymore if a radius2 is set.
|
||||
|
||||
`ol.style.RegularShape#getRadius2` will return `undefined` if no radius2 is set.
|
||||
|
||||
## Detailed changes
|
||||
|
||||
* [#6912](https://github.com/openlayers/openlayers/pull/6912) - Use class instead of style for Translate cursor ([@ahocevar](https://github.com/ahocevar))
|
||||
* [#6858](https://github.com/openlayers/openlayers/pull/6858) - Webgl vector improvements ([@GaborFarkas](https://github.com/GaborFarkas))
|
||||
* [#6890](https://github.com/openlayers/openlayers/pull/6890) - Add a movestart event ([@ahocevar](https://github.com/ahocevar))
|
||||
* [#6910](https://github.com/openlayers/openlayers/pull/6910) - Avoid duplicates in Observables list ([@ahocevar](https://github.com/ahocevar))
|
||||
* [#6902](https://github.com/openlayers/openlayers/pull/6902) - Require minimum duration for kinetic animation ([@ahocevar](https://github.com/ahocevar))
|
||||
* [#6904](https://github.com/openlayers/openlayers/pull/6904) - chore(package): update sinon to version 2.3.4 ([@openlayers](https://github.com/openlayers))
|
||||
* [#6901](https://github.com/openlayers/openlayers/pull/6901) - Added release note for changed methods of ol.style.regularShape ([@KlausBenndorf](https://github.com/KlausBenndorf))
|
||||
* [#6886](https://github.com/openlayers/openlayers/pull/6886) - Make ol.source.Cluster extensible ([@gberaudo](https://github.com/gberaudo))
|
||||
* [#6887](https://github.com/openlayers/openlayers/pull/6887) - Disable rotation for views with enableRotation: false ([@ahocevar](https://github.com/ahocevar))
|
||||
* [#6900](https://github.com/openlayers/openlayers/pull/6900) - Update clean-css-cli to the latest version 🚀 ([@openlayers](https://github.com/openlayers))
|
||||
* [#6897](https://github.com/openlayers/openlayers/pull/6897) - ProjectionLike in proj.getPointResolution ([@probins](https://github.com/probins))
|
||||
* [#6888](https://github.com/openlayers/openlayers/pull/6888) - Add note about custom functions to getPointResolution ([@probins](https://github.com/probins))
|
||||
* [#6893](https://github.com/openlayers/openlayers/pull/6893) - Fix decimals options when writing features ([@tchandelle](https://github.com/tchandelle))
|
||||
* [#6759](https://github.com/openlayers/openlayers/pull/6759) - Regular shape points ([@KlausBenndorf](https://github.com/KlausBenndorf))
|
||||
* [#6892](https://github.com/openlayers/openlayers/pull/6892) - Accept a ol.ProjectionLike instead of ol.proj.Projection ([@fredj](https://github.com/fredj))
|
||||
* [#6883](https://github.com/openlayers/openlayers/pull/6883) - Remove unused ol.pointer.EventSource#getMapping function ([@fredj](https://github.com/fredj))
|
||||
* [#6870](https://github.com/openlayers/openlayers/pull/6870) - Center map on proper earth, not one to the left ([@kannes](https://github.com/kannes))
|
||||
* [#6872](https://github.com/openlayers/openlayers/pull/6872) - Update rollup to the latest version 🚀 ([@openlayers](https://github.com/openlayers))
|
||||
* [#6876](https://github.com/openlayers/openlayers/pull/6876) - Only test ol.interaction.DragAndDrop if FileReader is supported ([@fredj](https://github.com/fredj))
|
||||
* [#6874](https://github.com/openlayers/openlayers/pull/6874) - Remove unused var from ol.proj ([@probins](https://github.com/probins))
|
||||
* [#6875](https://github.com/openlayers/openlayers/pull/6875) - chore(package): update sinon to version 2.3.2 ([@openlayers](https://github.com/openlayers))
|
||||
* [#6867](https://github.com/openlayers/openlayers/pull/6867) - add getArea to api ([@cs09g](https://github.com/cs09g))
|
||||
* [#6863](https://github.com/openlayers/openlayers/pull/6863) - change size to optional ([@cs09g](https://github.com/cs09g))
|
||||
* [#6864](https://github.com/openlayers/openlayers/pull/6864) - fix(package): update closure-util to version 1.21.0 ([@openlayers](https://github.com/openlayers))
|
||||
* [#6834](https://github.com/openlayers/openlayers/pull/6834) - Move tolerance option ([@notnotse](https://github.com/notnotse))
|
||||
* [#6856](https://github.com/openlayers/openlayers/pull/6856) - Fix creation of new URL in readSharedStyle_ and readSharedStyleMap_ ([@oterral](https://github.com/oterral))
|
||||
* [#6852](https://github.com/openlayers/openlayers/pull/6852) - Update mocha to the latest version 🚀 ([@openlayers](https://github.com/openlayers))
|
||||
* [#6851](https://github.com/openlayers/openlayers/pull/6851) - Register/unregister listeners in setActive ([@ahocevar](https://github.com/ahocevar))
|
||||
* [#6832](https://github.com/openlayers/openlayers/pull/6832) - Force state of error tiles when usInterimTilesOnError is false ([@oterral](https://github.com/oterral))
|
||||
* [#6849](https://github.com/openlayers/openlayers/pull/6849) - Create URL object only when we can ([@oterral](https://github.com/oterral))
|
||||
* [#6845](https://github.com/openlayers/openlayers/pull/6845) - Snap on circles ([@tchandelle](https://github.com/tchandelle))
|
||||
* [#6842](https://github.com/openlayers/openlayers/pull/6842) - add condition to check if active ([@cs09g](https://github.com/cs09g))
|
||||
* [#6844](https://github.com/openlayers/openlayers/pull/6844) - Update sinon to the latest version 🚀 ([@openlayers](https://github.com/openlayers))
|
||||
* [#6841](https://github.com/openlayers/openlayers/pull/6841) - Update sinon to the latest version 🚀 ([@openlayers](https://github.com/openlayers))
|
||||
* [#6839](https://github.com/openlayers/openlayers/pull/6839) - Update async to the latest version 🚀 ([@openlayers](https://github.com/openlayers))
|
||||
* [#6838](https://github.com/openlayers/openlayers/pull/6838) - fix(package): update handlebars to version 4.0.10 ([@openlayers](https://github.com/openlayers))
|
||||
* [#6817](https://github.com/openlayers/openlayers/pull/6817) - Multiple layers in TopoJSON vector tiles ([@ahocevar](https://github.com/ahocevar))
|
||||
* [#6833](https://github.com/openlayers/openlayers/pull/6833) - Fix geojson-vt example for line and point geometries ([@oterral](https://github.com/oterral))
|
||||
* [#6829](https://github.com/openlayers/openlayers/pull/6829) - Update clean-css-cli to the latest version 🚀 ([@openlayers](https://github.com/openlayers))
|
||||
* [#6819](https://github.com/openlayers/openlayers/pull/6819) - Adjust/fix API for working with vector tile features ([@ahocevar](https://github.com/ahocevar))
|
||||
* [#6818](https://github.com/openlayers/openlayers/pull/6818) - Add tileJSON option to ol.source.TileJSON ([@ahocevar](https://github.com/ahocevar))
|
||||
* [#6805](https://github.com/openlayers/openlayers/pull/6805) - Display country name on click select ([@fredj](https://github.com/fredj))
|
||||
* [#6813](https://github.com/openlayers/openlayers/pull/6813) - Prepend the version with a v ([@tschaub](https://github.com/tschaub))
|
||||
* [#6814](https://github.com/openlayers/openlayers/pull/6814) - Re-add ol.render.Feature#getGeometry() ([@ahocevar](https://github.com/ahocevar))
|
||||
* [#6812](https://github.com/openlayers/openlayers/pull/6812) - Update mocha to the latest version 🚀 ([@openlayers](https://github.com/openlayers))
|
||||
* [#6786](https://github.com/openlayers/openlayers/pull/6786) - Add ol.format.filter.during ([@fredj](https://github.com/fredj))
|
||||
* [#6806](https://github.com/openlayers/openlayers/pull/6806) - Add note about features with the same id ([@drnextgis](https://github.com/drnextgis))
|
||||
* [#6802](https://github.com/openlayers/openlayers/pull/6802) - Remove unused setFeatures and getFormat methods ([@ahocevar](https://github.com/ahocevar))
|
||||
* [#6801](https://github.com/openlayers/openlayers/pull/6801) - Add getId method for ol.render.Feature ([@ahocevar](https://github.com/ahocevar))
|
||||
* [#6778](https://github.com/openlayers/openlayers/pull/6778) - Add a small tolerance when testing pointer event positions ([@fredj](https://github.com/fredj))
|
||||
* [#6796](https://github.com/openlayers/openlayers/pull/6796) - Re-add accidently dropped condition ([@ahocevar](https://github.com/ahocevar))
|
||||
* [#6798](https://github.com/openlayers/openlayers/pull/6798) - chore(package): update clean-css-cli to version 4.1.2 ([@openlayers](https://github.com/openlayers))
|
||||
* [#6795](https://github.com/openlayers/openlayers/pull/6795) - Fix ol.DrawGeometryFunctionType coordinates argument type ([@fredj](https://github.com/fredj))
|
||||
* [#6797](https://github.com/openlayers/openlayers/pull/6797) - Update clean-css-cli to the latest version 🚀 ([@openlayers](https://github.com/openlayers))
|
||||
* [#6779](https://github.com/openlayers/openlayers/pull/6779) - Decouple source and rendered tile grid of vector tile sources ([@ahocevar](https://github.com/ahocevar))
|
||||
* [#6785](https://github.com/openlayers/openlayers/pull/6785) - Add insertVertexCondition to ol.interaction.Modify options ([@fredj](https://github.com/fredj))
|
||||
* [#6792](https://github.com/openlayers/openlayers/pull/6792) - Create intermediate canvas when resolutions have changed ([@ahocevar](https://github.com/ahocevar))
|
||||
* [#6790](https://github.com/openlayers/openlayers/pull/6790) - Update resemblejs to the latest version 🚀 ([@openlayers](https://github.com/openlayers))
|
||||
* [#6784](https://github.com/openlayers/openlayers/pull/6784) - chore(package): update clean-css-cli to version 4.1.0 ([@openlayers](https://github.com/openlayers))
|
||||
* [#6556](https://github.com/openlayers/openlayers/pull/6556) - Reading kml xunits/yunits insetPixels ([@KlausBenndorf](https://github.com/KlausBenndorf))
|
||||
* [#6775](https://github.com/openlayers/openlayers/pull/6775) - Update closure-util to the latest version 🚀 ([@openlayers](https://github.com/openlayers))
|
||||
* [#6774](https://github.com/openlayers/openlayers/pull/6774) - Update fs-extra to the latest version 🚀 ([@openlayers](https://github.com/openlayers))
|
||||
* [#6770](https://github.com/openlayers/openlayers/pull/6770) - Enforce the "no missing requires" rule ([@tschaub](https://github.com/tschaub))
|
||||
* [#6772](https://github.com/openlayers/openlayers/pull/6772) - Remove html tag from shortdesc ([@fredj](https://github.com/fredj))
|
||||
* [#6769](https://github.com/openlayers/openlayers/pull/6769) - Update handlebars to the latest version 🚀 ([@openlayers](https://github.com/openlayers))
|
||||
* [#6757](https://github.com/openlayers/openlayers/pull/6757) - Fix crashing on creation of snap-interaction, if Circle is among the features to snap to. ([@hajjimurad](https://github.com/hajjimurad))
|
||||
* [#6766](https://github.com/openlayers/openlayers/pull/6766) - Update sinon to the latest version 🚀 ([@openlayers](https://github.com/openlayers))
|
||||
* [#6765](https://github.com/openlayers/openlayers/pull/6765) - Add new callback function to view.FitOptions ([@fredj](https://github.com/fredj))
|
||||
* [#6764](https://github.com/openlayers/openlayers/pull/6764) - Added View#getInteracting() to the api ([@mblinsitu](https://github.com/mblinsitu))
|
||||
* [#6760](https://github.com/openlayers/openlayers/pull/6760) - Update handlebars to the latest version 🚀 ([@openlayers](https://github.com/openlayers))
|
||||
* [#6761](https://github.com/openlayers/openlayers/pull/6761) - Update async to the latest version 🚀 ([@openlayers](https://github.com/openlayers))
|
||||
* [#6755](https://github.com/openlayers/openlayers/pull/6755) - Add missing goog.require ([@fredj](https://github.com/fredj))
|
||||
* [#6751](https://github.com/openlayers/openlayers/pull/6751) - Update coveralls to the latest version 🚀 ([@openlayers](https://github.com/openlayers))
|
||||
* [#6750](https://github.com/openlayers/openlayers/pull/6750) - Update fs-extra to the latest version 🚀 ([@openlayers](https://github.com/openlayers))
|
||||
* [#6741](https://github.com/openlayers/openlayers/pull/6741) - Allow user selection in overlay container ([@fredj](https://github.com/fredj))
|
||||
* [#6744](https://github.com/openlayers/openlayers/pull/6744) - Update mocha to the latest version 🚀 ([@openlayers](https://github.com/openlayers))
|
||||
* [#6737](https://github.com/openlayers/openlayers/pull/6737) - Graticule labels ([@ahocevar](https://github.com/ahocevar))
|
||||
* [#6740](https://github.com/openlayers/openlayers/pull/6740) - Fix spelling ([@fredj](https://github.com/fredj))
|
||||
* [#6730](https://github.com/openlayers/openlayers/pull/6730) - Update metalsmith-layouts to the latest version 🚀 ([@openlayers](https://github.com/openlayers))
|
||||
* [#6732](https://github.com/openlayers/openlayers/pull/6732) - Use firefox < 53 in travis ([@fredj](https://github.com/fredj))
|
||||
* [#6677](https://github.com/openlayers/openlayers/pull/6677) - Add an option to writeTransaction to support 3D geometries ([@Jenselme](https://github.com/Jenselme))
|
||||
* [#6524](https://github.com/openlayers/openlayers/pull/6524) - Don't append feature prefix twice in WFS requests ([@Jenselme](https://github.com/Jenselme))
|
||||
* [#6727](https://github.com/openlayers/openlayers/pull/6727) - Add default value in doc for the hitTolerance option ([@fredj](https://github.com/fredj))
|
||||
* [#6724](https://github.com/openlayers/openlayers/pull/6724) - Add wrapX option to Stamen source ([@fredj](https://github.com/fredj))
|
||||
* [#6728](https://github.com/openlayers/openlayers/pull/6728) - Fix tissot examples docs ([@fredj](https://github.com/fredj))
|
||||
* [#6725](https://github.com/openlayers/openlayers/pull/6725) - Update dependencies to enable Greenkeeper 🌴 ([@openlayers](https://github.com/openlayers))
|
||||
* [#6711](https://github.com/openlayers/openlayers/pull/6711) - Correct path to cleancss ([@tschaub](https://github.com/tschaub))
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"opts": {
|
||||
"recurse": true,
|
||||
"template": "config/jsdoc/api/template"
|
||||
"template": "../../config/jsdoc/api/template"
|
||||
},
|
||||
"tags": {
|
||||
"allowUnknownTags": true
|
||||
@@ -16,12 +16,12 @@
|
||||
]
|
||||
},
|
||||
"plugins": [
|
||||
"node_modules/jsdoc/plugins/markdown",
|
||||
"config/jsdoc/api/plugins/inheritdoc",
|
||||
"config/jsdoc/api/plugins/typedefs",
|
||||
"config/jsdoc/api/plugins/events",
|
||||
"config/jsdoc/api/plugins/observable",
|
||||
"config/jsdoc/api/plugins/api"
|
||||
"plugins/markdown",
|
||||
"../../config/jsdoc/api/plugins/inheritdoc",
|
||||
"../../config/jsdoc/api/plugins/typedefs",
|
||||
"../../config/jsdoc/api/plugins/events",
|
||||
"../../config/jsdoc/api/plugins/observable",
|
||||
"../../config/jsdoc/api/plugins/api"
|
||||
],
|
||||
"markdown": {
|
||||
"parser": "gfm"
|
||||
|
||||
@@ -41,7 +41,7 @@ exports.handlers = {
|
||||
cls.observables = [];
|
||||
}
|
||||
observable = observables[doclet.observable];
|
||||
if (cls.observables.indexOf(observable) == -1) {
|
||||
if (observable.type && cls.observables.indexOf(observable) == -1) {
|
||||
cls.observables.push(observable);
|
||||
}
|
||||
if (!cls.fires) {
|
||||
|
||||
@@ -16,8 +16,10 @@
|
||||
<tbody>
|
||||
<?js
|
||||
var self = this;
|
||||
var propsByName = {};
|
||||
props.forEach(function(prop) {
|
||||
if (!prop) { return; }
|
||||
if (!prop || propsByName[prop.name]) { return; }
|
||||
propsByName[prop.name] = prop;
|
||||
var setter = prop.readonly ? 'no' : 'yes';
|
||||
?>
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"opts": {
|
||||
"recurse": true,
|
||||
"template": "config/jsdoc/info"
|
||||
"template": "../../config/jsdoc/info"
|
||||
},
|
||||
"tags": {
|
||||
"allowUnknownTags": true
|
||||
@@ -10,8 +10,8 @@
|
||||
"includePattern": "\\.js$"
|
||||
},
|
||||
"plugins": [
|
||||
"config/jsdoc/info/api-plugin",
|
||||
"config/jsdoc/info/define-plugin",
|
||||
"config/jsdoc/info/virtual-plugin"
|
||||
"../../config/jsdoc/info/api-plugin",
|
||||
"../../config/jsdoc/info/define-plugin",
|
||||
"../../config/jsdoc/info/virtual-plugin"
|
||||
]
|
||||
}
|
||||
|
||||
@@ -3,7 +3,6 @@
|
||||
* an api tag) and boolean defines (with a define tag and a default value).
|
||||
*/
|
||||
var assert = require('assert');
|
||||
var fs = require('fs');
|
||||
var path = require('path');
|
||||
|
||||
|
||||
@@ -89,7 +88,6 @@ exports.publish = function(data, opts) {
|
||||
types: getTypes(doc.type.names)
|
||||
});
|
||||
} else {
|
||||
var types;
|
||||
var symbol = {
|
||||
name: doc.longname,
|
||||
kind: doc.kind,
|
||||
@@ -169,13 +167,15 @@ exports.publish = function(data, opts) {
|
||||
return (symbol.name in augments || symbol.virtual);
|
||||
});
|
||||
|
||||
process.stdout.write(
|
||||
JSON.stringify({
|
||||
symbols: symbols,
|
||||
defines: defines,
|
||||
typedefs: typedefs,
|
||||
externs: externs,
|
||||
base: base
|
||||
}, null, 2));
|
||||
return new Promise(function(resolve, reject) {
|
||||
process.stdout.write(
|
||||
JSON.stringify({
|
||||
symbols: symbols,
|
||||
defines: defines,
|
||||
typedefs: typedefs,
|
||||
externs: externs,
|
||||
base: base
|
||||
}, null, 2));
|
||||
});
|
||||
|
||||
};
|
||||
|
||||
13
css/ol.css
13
css/ol.css
@@ -49,6 +49,17 @@
|
||||
-ms-user-select: auto;
|
||||
user-select: auto;
|
||||
}
|
||||
.ol-grabbing {
|
||||
cursor: -webkit-grabbing;
|
||||
cursor: -moz-grabbing;
|
||||
cursor: grabbing;
|
||||
}
|
||||
.ol-grab {
|
||||
cursor: move;
|
||||
cursor: -webkit-grab;
|
||||
cursor: -moz-grab;
|
||||
cursor: grab;
|
||||
}
|
||||
.ol-control {
|
||||
position: absolute;
|
||||
background-color: rgba(255,255,255,0.4);
|
||||
@@ -247,4 +258,4 @@
|
||||
|
||||
.ol-overviewmap .ol-overviewmap-box:hover {
|
||||
cursor: move;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -11,7 +11,7 @@ For a more in-depth overview of OpenLayers core concepts, check out the [tutoria
|
||||
|
||||
Make sure to also check out the [OpenLayers workshop](/workshop/).
|
||||
|
||||
Find additional reference material in the [API docs](../apidoc).
|
||||
Find additional reference material in the [API docs](../apidoc) and [examples](../examples).
|
||||
|
||||
# Frequently Asked Questions (FAQ)
|
||||
|
||||
@@ -19,4 +19,4 @@ We have put together a document that lists [Frequently Asked Questions (FAQ)](fa
|
||||
|
||||
# More questions?
|
||||
|
||||
If you cannot find an answer in the documentation or the FAQ, you can ask your question on [Stack Overflow using the tag 'openlayers'](http://stackoverflow.com/questions/tagged/openlayers).
|
||||
If you cannot find an answer in the documentation or the FAQ, you can search [Stack Overflow](http://stackoverflow.com/questions/tagged/openlayers). If you cannot find an answer there, ask a new question there, using the tag 'openlayers'.
|
||||
|
||||
@@ -5,57 +5,56 @@ 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.
|
||||
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
|
||||
[compiling your own code together with OpenLayers](closure.html).
|
||||
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.
|
||||
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.
|
||||
|
||||
At this point you can ask NPM to add required dependencies by running
|
||||
`npm install --save-dev openlayers browserify watchify uglify-js`. Watchify and
|
||||
Uglify will be used to monitor for changes and to build into a minified
|
||||
bundle.
|
||||
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
|
||||
var ol = require('openlayers');
|
||||
|
||||
var map = new ol.Map({
|
||||
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()
|
||||
new ol_layer_Tile({
|
||||
source: new ol_source_OSM()
|
||||
})
|
||||
],
|
||||
view: new ol.View({
|
||||
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:
|
||||
You will also need an `ìndex.html` file that will use your bundle. Here is a simple example:
|
||||
|
||||
```html
|
||||
<!doctype html>
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<title>Using Browserify with OpenLayers</title>
|
||||
<link rel="stylesheet" href="node_modules/openlayers/dist/ol.css" type="text/css">
|
||||
<style>
|
||||
#map {
|
||||
width: 400px;
|
||||
@@ -72,18 +71,17 @@ example:
|
||||
|
||||
## 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`:
|
||||
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 --outfile bundle.js",
|
||||
"build": "browserify index.js | uglifyjs --compress --output bundle.js"
|
||||
"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, in this case the official full build of OpenLayers.
|
||||
If you only need parts of OpenLayers you can create
|
||||
[custom builds](../../builder).
|
||||
Note that `bundle.js` will contain your application code and all dependencies used in your application. From OpenLayers, it only contains the required components.
|
||||
|
||||
@@ -5,11 +5,15 @@ layout: doc.hbs
|
||||
|
||||
# Compiling Application with Closure Compiler
|
||||
|
||||
**Note**: When building an application with dependencies that are available as [npm](https://npmjs.com/) packages, it will probably be easier to use the [ol](https://npmjs.com/package/ol) package and follow the instructions there.
|
||||
|
||||
The OpenLayers code uses the Closure Library, and it is compiled with the
|
||||
Closure Compiler. Using OpenLayers in an application does not require using
|
||||
Closure. But using Closure in an OpenLayers application is possible. And this
|
||||
is what this tutorial is about.
|
||||
|
||||
When you want to include OpenLayers as separate script without bundling with your application, follow the [Creating custom builds](./custom-builds.html) tutorial instead.
|
||||
|
||||
This tutorial will teach you how to set up an OpenLayers application based on
|
||||
the [`closure-util`](https://github.com/openlayers/closure-util) node package,
|
||||
which provides utilities for working with Closure. Using `closure-util` is one
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
goog.require('ol.Map');
|
||||
goog.require('ol.View');
|
||||
goog.require('ol.easing');
|
||||
goog.require('ol.layer.Tile');
|
||||
goog.require('ol.proj');
|
||||
goog.require('ol.source.OSM');
|
||||
@@ -73,9 +74,16 @@ onClick('rotate-right', function() {
|
||||
});
|
||||
|
||||
onClick('rotate-around-rome', function() {
|
||||
// Rotation animation takes the shortest arc, so animate in two parts
|
||||
var rotation = view.getRotation();
|
||||
view.animate({
|
||||
rotation: view.getRotation() + 2 * Math.PI,
|
||||
anchor: rome
|
||||
rotation: rotation + Math.PI,
|
||||
anchor: rome,
|
||||
easing: ol.easing.easeIn
|
||||
}, {
|
||||
rotation: rotation + 2 * Math.PI,
|
||||
anchor: rome,
|
||||
easing: ol.easing.easeOut
|
||||
});
|
||||
});
|
||||
|
||||
@@ -103,10 +111,19 @@ onClick('bounce-to-istanbul', function() {
|
||||
});
|
||||
|
||||
onClick('spin-to-rome', function() {
|
||||
// Rotation animation takes the shortest arc, so animate in two parts
|
||||
var center = view.getCenter();
|
||||
view.animate({
|
||||
center: [
|
||||
center[0] + (rome[0] - center[0]) / 2,
|
||||
center[1] + (rome[1] - center[1]) / 2
|
||||
],
|
||||
rotation: Math.PI,
|
||||
easing: ol.easing.easeIn
|
||||
}, {
|
||||
center: rome,
|
||||
rotation: 2 * Math.PI,
|
||||
duration: 2000
|
||||
easing: ol.easing.easeOut
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
@@ -12,7 +12,8 @@ cloak:
|
||||
<select id="layer-select">
|
||||
<option value="Aerial">Aerial</option>
|
||||
<option value="AerialWithLabels" selected>Aerial with labels</option>
|
||||
<option value="Road">Road</option>
|
||||
<option value="Road">Road (static)</option>
|
||||
<option value="RoadOnDemand">Road (dynamic)</option>
|
||||
<option value="collinsBart">Collins Bart</option>
|
||||
<option value="ordnanceSurvey">Ordnance Survey</option>
|
||||
</select>
|
||||
|
||||
@@ -6,6 +6,7 @@ goog.require('ol.source.BingMaps');
|
||||
|
||||
var styles = [
|
||||
'Road',
|
||||
'RoadOnDemand',
|
||||
'Aerial',
|
||||
'AerialWithLabels',
|
||||
'collinsBart',
|
||||
|
||||
@@ -45,29 +45,29 @@ var dragBox = new ol.interaction.DragBox({
|
||||
|
||||
map.addInteraction(dragBox);
|
||||
|
||||
var infoBox = document.getElementById('info');
|
||||
|
||||
dragBox.on('boxend', function() {
|
||||
// features that intersect the box are added to the collection of
|
||||
// selected features, and their names are displayed in the "info"
|
||||
// div
|
||||
var info = [];
|
||||
// selected features
|
||||
var extent = dragBox.getGeometry().getExtent();
|
||||
vectorSource.forEachFeatureIntersectingExtent(extent, function(feature) {
|
||||
selectedFeatures.push(feature);
|
||||
info.push(feature.get('name'));
|
||||
});
|
||||
if (info.length > 0) {
|
||||
infoBox.innerHTML = info.join(', ');
|
||||
}
|
||||
});
|
||||
|
||||
// clear selection when drawing a new box and when clicking on the map
|
||||
dragBox.on('boxstart', function() {
|
||||
selectedFeatures.clear();
|
||||
infoBox.innerHTML = ' ';
|
||||
});
|
||||
map.on('click', function() {
|
||||
selectedFeatures.clear();
|
||||
infoBox.innerHTML = ' ';
|
||||
|
||||
var infoBox = document.getElementById('info');
|
||||
|
||||
selectedFeatures.on(['add', 'remove'], function() {
|
||||
var names = selectedFeatures.getArray().map(function(feature) {
|
||||
return feature.get('name');
|
||||
});
|
||||
if (names.length > 0) {
|
||||
infoBox.innerHTML = names.join(', ');
|
||||
} else {
|
||||
infoBox.innerHTML = 'No countries selected';
|
||||
}
|
||||
});
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
---
|
||||
layout: example.html
|
||||
title: Clustered Features
|
||||
shortdesc: Example of using <code>ol.source.Cluster</code>.
|
||||
shortdesc: Example of using ol.source.Cluster.
|
||||
docs: >
|
||||
This example shows how to do clustering on point features.
|
||||
tags: "cluster, vector"
|
||||
|
||||
@@ -97,7 +97,7 @@ function rgb2xyz(x) {
|
||||
|
||||
function xyz2rgb(x) {
|
||||
return 255 * (x <= 0.0031308 ?
|
||||
12.92 * x : 1.055 * Math.pow(x, 1 / 2.4) - 0.055);
|
||||
12.92 * x : 1.055 * Math.pow(x, 1 / 2.4) - 0.055);
|
||||
}
|
||||
|
||||
var raster = new ol.source.Raster({
|
||||
|
||||
@@ -142,7 +142,7 @@ var lineFeature = new ol.Feature(
|
||||
|
||||
var polygonFeature = new ol.Feature(
|
||||
new ol.geom.Polygon([[[-3e6, -1e6], [-3e6, 1e6],
|
||||
[-1e6, 1e6], [-1e6, -1e6], [-3e6, -1e6]]]));
|
||||
[-1e6, 1e6], [-1e6, -1e6], [-3e6, -1e6]]]));
|
||||
|
||||
|
||||
var map = new ol.Map({
|
||||
|
||||
@@ -1,9 +1,8 @@
|
||||
goog.require('ol.Collection');
|
||||
goog.require('ol.Map');
|
||||
goog.require('ol.View');
|
||||
goog.require('ol.events.condition');
|
||||
goog.require('ol.interaction.Draw');
|
||||
goog.require('ol.interaction.Modify');
|
||||
goog.require('ol.interaction.Snap');
|
||||
goog.require('ol.layer.Tile');
|
||||
goog.require('ol.layer.Vector');
|
||||
goog.require('ol.source.OSM');
|
||||
@@ -17,18 +16,9 @@ var raster = new ol.layer.Tile({
|
||||
source: new ol.source.OSM()
|
||||
});
|
||||
|
||||
var map = new ol.Map({
|
||||
layers: [raster],
|
||||
target: 'map',
|
||||
view: new ol.View({
|
||||
center: [-11000000, 4600000],
|
||||
zoom: 4
|
||||
})
|
||||
});
|
||||
|
||||
var features = new ol.Collection();
|
||||
var featureOverlay = new ol.layer.Vector({
|
||||
source: new ol.source.Vector({features: features}),
|
||||
var source = new ol.source.Vector();
|
||||
var vector = new ol.layer.Vector({
|
||||
source: source,
|
||||
style: new ol.style.Style({
|
||||
fill: new ol.style.Fill({
|
||||
color: 'rgba(255, 255, 255, 0.2)'
|
||||
@@ -45,38 +35,40 @@ var featureOverlay = new ol.layer.Vector({
|
||||
})
|
||||
})
|
||||
});
|
||||
featureOverlay.setMap(map);
|
||||
|
||||
var modify = new ol.interaction.Modify({
|
||||
features: features,
|
||||
// the SHIFT key must be pressed to delete vertices, so
|
||||
// that new vertices can be drawn at the same position
|
||||
// of existing vertices
|
||||
deleteCondition: function(event) {
|
||||
return ol.events.condition.shiftKeyOnly(event) &&
|
||||
ol.events.condition.singleClick(event);
|
||||
}
|
||||
var map = new ol.Map({
|
||||
layers: [raster, vector],
|
||||
target: 'map',
|
||||
view: new ol.View({
|
||||
center: [-11000000, 4600000],
|
||||
zoom: 4
|
||||
})
|
||||
});
|
||||
|
||||
var modify = new ol.interaction.Modify({source: source});
|
||||
map.addInteraction(modify);
|
||||
|
||||
var draw; // global so we can remove it later
|
||||
var draw, snap; // global so we can remove them later
|
||||
var typeSelect = document.getElementById('type');
|
||||
|
||||
function addInteraction() {
|
||||
function addInteractions() {
|
||||
draw = new ol.interaction.Draw({
|
||||
features: features,
|
||||
source: source,
|
||||
type: /** @type {ol.geom.GeometryType} */ (typeSelect.value)
|
||||
});
|
||||
map.addInteraction(draw);
|
||||
}
|
||||
snap = new ol.interaction.Snap({source: source});
|
||||
map.addInteraction(snap);
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Handle change event.
|
||||
*/
|
||||
typeSelect.onchange = function() {
|
||||
map.removeInteraction(draw);
|
||||
addInteraction();
|
||||
map.removeInteraction(snap);
|
||||
addInteractions();
|
||||
};
|
||||
|
||||
addInteraction();
|
||||
addInteractions();
|
||||
|
||||
@@ -144,7 +144,7 @@ var map = new ol.Map({
|
||||
layers: [raster, vector],
|
||||
interactions: ol.interaction.defaults().extend([new ol.interaction.Select({
|
||||
condition: function(evt) {
|
||||
return evt.originalEvent.type == 'mousemove' ||
|
||||
return evt.type == 'pointermove' ||
|
||||
evt.type == 'singleclick';
|
||||
},
|
||||
style: selectStyleFunction
|
||||
|
||||
@@ -198,7 +198,7 @@ function stopAnimation(ended) {
|
||||
// if animation cancelled set the marker at the beginning
|
||||
var coord = ended ? routeCoords[routeLength - 1] : routeCoords[0];
|
||||
/** @type {ol.geom.Point} */ (geoMarker.getGeometry())
|
||||
.setCoordinates(coord);
|
||||
.setCoordinates(coord);
|
||||
//remove listener
|
||||
map.un('postcompose', moveFeature);
|
||||
}
|
||||
|
||||
@@ -17,18 +17,30 @@ var replacer = function(key, value) {
|
||||
var geometry = value.geometry;
|
||||
|
||||
if (rawType === 1) {
|
||||
type = geometry.length === 1 ? 'Point' : 'MultiPoint';
|
||||
type = 'MultiPoint';
|
||||
if (geometry.length == 1) {
|
||||
type = 'Point';
|
||||
geometry = geometry[0];
|
||||
}
|
||||
} else if (rawType === 2) {
|
||||
type = geometry.length === 1 ? 'LineString' : 'MultiLineString';
|
||||
type = 'MultiLineString';
|
||||
if (geometry.length == 1) {
|
||||
type = 'LineString';
|
||||
geometry = geometry[0];
|
||||
}
|
||||
} else if (rawType === 3) {
|
||||
type = geometry.length === 1 ? 'Polygon' : 'MultiPolygon';
|
||||
type = 'Polygon';
|
||||
if (geometry.length > 1) {
|
||||
type = 'MultiPolygon';
|
||||
geometry = [geometry];
|
||||
}
|
||||
}
|
||||
|
||||
return {
|
||||
'type': 'Feature',
|
||||
'geometry': {
|
||||
'type': type,
|
||||
'coordinates': geometry.length == 1 ? geometry : [geometry]
|
||||
'coordinates': geometry
|
||||
},
|
||||
'properties': value.tags
|
||||
};
|
||||
@@ -66,17 +78,16 @@ fetch(url).then(function(response) {
|
||||
var vectorSource = new ol.source.VectorTile({
|
||||
format: new ol.format.GeoJSON(),
|
||||
tileGrid: ol.tilegrid.createXYZ(),
|
||||
tilePixelRatio: 16,
|
||||
tileLoadFunction: function(tile) {
|
||||
var format = tile.getFormat();
|
||||
var tileCoord = tile.getTileCoord();
|
||||
var data = tileIndex.getTile(tileCoord[0], tileCoord[1], -tileCoord[2] - 1);
|
||||
|
||||
var features = format.readFeatures(
|
||||
JSON.stringify({
|
||||
type: 'FeatureCollection',
|
||||
features: data ? data.features : []
|
||||
}, replacer));
|
||||
JSON.stringify({
|
||||
type: 'FeatureCollection',
|
||||
features: data ? data.features : []
|
||||
}, replacer));
|
||||
tile.setLoader(function() {
|
||||
tile.setFeatures(features);
|
||||
tile.setProjection(tilePixels);
|
||||
|
||||
@@ -83,7 +83,7 @@ positionFeature.setStyle(new ol.style.Style({
|
||||
geolocation.on('change:position', function() {
|
||||
var coordinates = geolocation.getPosition();
|
||||
positionFeature.setGeometry(coordinates ?
|
||||
new ol.geom.Point(coordinates) : null);
|
||||
new ol.geom.Point(coordinates) : null);
|
||||
});
|
||||
|
||||
new ol.layer.Vector({
|
||||
|
||||
@@ -27,6 +27,8 @@ var graticule = new ol.Graticule({
|
||||
color: 'rgba(255,120,0,0.9)',
|
||||
width: 2,
|
||||
lineDash: [0.5, 4]
|
||||
})
|
||||
}),
|
||||
showLabels: true
|
||||
});
|
||||
|
||||
graticule.setMap(map);
|
||||
|
||||
@@ -81,11 +81,11 @@ var map = new ol.Map({
|
||||
|
||||
function createUrl(tpl, layerDesc) {
|
||||
return tpl
|
||||
.replace('{base}', layerDesc.base)
|
||||
.replace('{type}', layerDesc.type)
|
||||
.replace('{scheme}', layerDesc.scheme)
|
||||
.replace('{app_id}', layerDesc.app_id)
|
||||
.replace('{app_code}', layerDesc.app_code);
|
||||
.replace('{base}', layerDesc.base)
|
||||
.replace('{type}', layerDesc.type)
|
||||
.replace('{scheme}', layerDesc.scheme)
|
||||
.replace('{app_id}', layerDesc.app_id)
|
||||
.replace('{app_code}', layerDesc.app_code);
|
||||
}
|
||||
|
||||
var select = document.getElementById('layer-select');
|
||||
|
||||
@@ -3,7 +3,7 @@ layout: example.html
|
||||
title: Advanced Mapbox Vector Tiles
|
||||
shortdesc: Example of a Mapbox vector tiles map with custom tile grid.
|
||||
docs: >
|
||||
A vector tiles map which reuses the same tiles for subsequent zoom levels to save bandwith on mobile devices. **Note**: No map will be visible when the access token has expired.
|
||||
A vector tiles map which reuses the same source tiles for subsequent zoom levels to save bandwidth on mobile devices. **Note**: No map will be visible when the access token has expired.
|
||||
tags: "mapbox, vector, tiles, mobile"
|
||||
resources:
|
||||
- resources/mapbox-streets-v6-style.js
|
||||
|
||||
@@ -15,25 +15,16 @@ goog.require('ol.tilegrid.TileGrid');
|
||||
|
||||
var key = 'pk.eyJ1IjoiYWhvY2V2YXIiLCJhIjoiRk1kMWZaSSJ9.E5BkluenyWQMsBLsuByrmg';
|
||||
|
||||
// For how many zoom levels do we want to use the same vector tiles?
|
||||
// 1 means "use tiles from all zoom levels". 2 means "use the same tiles for 2
|
||||
// subsequent zoom levels".
|
||||
var reuseZoomLevels = 2;
|
||||
|
||||
// Offset of loaded tiles from web mercator zoom level 0.
|
||||
// 0 means "At map zoom level 0, use tiles from zoom level 0". 1 means "At map
|
||||
// zoom level 0, use tiles from zoom level 1".
|
||||
var zoomOffset = 1;
|
||||
|
||||
// Calculation of tile urls
|
||||
// Calculation of resolutions that match zoom levels 1, 3, 5, 7, 9, 11, 13, 15.
|
||||
var resolutions = [];
|
||||
for (var z = zoomOffset / reuseZoomLevels; z <= 22 / reuseZoomLevels; ++z) {
|
||||
resolutions.push(156543.03392804097 / Math.pow(2, z * reuseZoomLevels));
|
||||
for (var i = 0; i <= 8; ++i) {
|
||||
resolutions.push(156543.03392804097 / Math.pow(2, i * 2));
|
||||
}
|
||||
// Calculation of tile urls for zoom levels 1, 3, 5, 7, 9, 11, 13, 15.
|
||||
function tileUrlFunction(tileCoord) {
|
||||
return ('https://{a-d}.tiles.mapbox.com/v4/mapbox.mapbox-streets-v6/' +
|
||||
'{z}/{x}/{y}.vector.pbf?access_token=' + key)
|
||||
.replace('{z}', String(tileCoord[0] * reuseZoomLevels + zoomOffset))
|
||||
.replace('{z}', String(tileCoord[0] * 2 - 1))
|
||||
.replace('{x}', String(tileCoord[1]))
|
||||
.replace('{y}', String(-tileCoord[2] - 1))
|
||||
.replace('{a-d}', 'abcd'.substr(
|
||||
@@ -43,8 +34,6 @@ function tileUrlFunction(tileCoord) {
|
||||
var map = new ol.Map({
|
||||
layers: [
|
||||
new ol.layer.VectorTile({
|
||||
renderMode: 'vector',
|
||||
preload: Infinity,
|
||||
source: new ol.source.VectorTile({
|
||||
attributions: '© <a href="https://www.mapbox.com/map-feedback/">Mapbox</a> ' +
|
||||
'© <a href="https://www.openstreetmap.org/copyright">' +
|
||||
@@ -52,9 +41,9 @@ var map = new ol.Map({
|
||||
format: new ol.format.MVT(),
|
||||
tileGrid: new ol.tilegrid.TileGrid({
|
||||
extent: ol.proj.get('EPSG:3857').getExtent(),
|
||||
resolutions: resolutions
|
||||
resolutions: resolutions,
|
||||
tileSize: 512
|
||||
}),
|
||||
tilePixelRatio: 16,
|
||||
tileUrlFunction: tileUrlFunction
|
||||
}),
|
||||
style: createMapboxStreetsV6Style()
|
||||
|
||||
@@ -23,8 +23,7 @@ var map = new ol.Map({
|
||||
'© <a href="https://www.openstreetmap.org/copyright">' +
|
||||
'OpenStreetMap contributors</a>',
|
||||
format: new ol.format.MVT(),
|
||||
tileGrid: ol.tilegrid.createXYZ({maxZoom: 22}),
|
||||
tilePixelRatio: 16,
|
||||
tileGrid: ol.tilegrid.createXYZ({tileSize: 512, maxZoom: 22}),
|
||||
url: 'https://{a-d}.tiles.mapbox.com/v4/mapbox.mapbox-streets-v6/' +
|
||||
'{z}/{x}/{y}.vector.pbf?access_token=' + key
|
||||
}),
|
||||
|
||||
@@ -96,8 +96,8 @@ var geojsonObject = {
|
||||
'geometry': {
|
||||
'type': 'Polygon',
|
||||
'coordinates': [[[-5e6, -1e6], [-4e6, 1e6],
|
||||
[-3e6, -1e6], [-5e6, -1e6]], [[-4.5e6, -0.5e6],
|
||||
[-3.5e6, -0.5e6], [-4e6, 0.5e6], [-4.5e6, -0.5e6]]]
|
||||
[-3e6, -1e6], [-5e6, -1e6]], [[-4.5e6, -0.5e6],
|
||||
[-3.5e6, -0.5e6], [-4e6, 0.5e6], [-4.5e6, -0.5e6]]]
|
||||
}
|
||||
}, {
|
||||
'type': 'Feature',
|
||||
@@ -117,11 +117,11 @@ var geojsonObject = {
|
||||
'type': 'MultiPolygon',
|
||||
'coordinates': [
|
||||
[[[-5e6, 6e6], [-5e6, 8e6], [-3e6, 8e6],
|
||||
[-3e6, 6e6], [-5e6, 6e6]]],
|
||||
[-3e6, 6e6], [-5e6, 6e6]]],
|
||||
[[[-3e6, 6e6], [-2e6, 8e6], [0, 8e6],
|
||||
[0, 6e6], [-3e6, 6e6]]],
|
||||
[0, 6e6], [-3e6, 6e6]]],
|
||||
[[[1e6, 6e6], [1e6, 8e6], [3e6, 8e6],
|
||||
[3e6, 6e6], [1e6, 6e6]]]
|
||||
[3e6, 6e6], [1e6, 6e6]]]
|
||||
]
|
||||
}
|
||||
}, {
|
||||
@@ -222,7 +222,13 @@ var select = new ol.interaction.Select({
|
||||
|
||||
var modify = new ol.interaction.Modify({
|
||||
features: select.getFeatures(),
|
||||
style: overlayStyle
|
||||
style: overlayStyle,
|
||||
insertVertexCondition: function() {
|
||||
// prevent new vertices to be added to the polygons
|
||||
return !this.features_.getArray().every(function(feature) {
|
||||
return feature.getGeometry().getType().match(/Polygon/);
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
var map = new ol.Map({
|
||||
|
||||
@@ -4,7 +4,6 @@ goog.require('ol.control');
|
||||
goog.require('ol.control.MousePosition');
|
||||
goog.require('ol.coordinate');
|
||||
goog.require('ol.layer.Tile');
|
||||
goog.require('ol.proj');
|
||||
goog.require('ol.source.OSM');
|
||||
|
||||
var mousePositionControl = new ol.control.MousePosition({
|
||||
@@ -37,7 +36,7 @@ var map = new ol.Map({
|
||||
|
||||
var projectionSelect = document.getElementById('projection');
|
||||
projectionSelect.addEventListener('change', function(event) {
|
||||
mousePositionControl.setProjection(ol.proj.get(event.target.value));
|
||||
mousePositionControl.setProjection(event.target.value);
|
||||
});
|
||||
|
||||
var precisionInput = document.getElementById('precision');
|
||||
|
||||
@@ -3,7 +3,7 @@ layout: example.html
|
||||
title: OSM Vector Tiles
|
||||
shortdesc: Using OpenStreetMap vector tiles.
|
||||
docs: >
|
||||
A simple vector tiles map with Mapzen vector tiles. **Note**: TopoJSON vector tiles are not optimized for rendering - they might clip geometries exactly at the tile boundary instead of adding a buffer, and use geographic coordinates instead of tile relative pixel coordinates in view projection.
|
||||
A simple vector tiles map with Mapzen vector tiles. This example uses the TopoJSON format's `layerName` option to determine the layer ("water", "roads", "buildings") for styling. **Note**: [`ol.format.MVT`](../apidoc/ol.format.MVT.html) is an even more efficient format for vector tiles.
|
||||
tags: "vector, tiles, osm, mapzen"
|
||||
cloak:
|
||||
vector-tiles-5eJz6JX: Your Mapzen API key from https://mapzen.com/developers
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
goog.require('ol.Attribution');
|
||||
goog.require('ol.Map');
|
||||
goog.require('ol.View');
|
||||
goog.require('ol.format.TopoJSON');
|
||||
@@ -13,11 +12,6 @@ goog.require('ol.tilegrid');
|
||||
|
||||
var key = 'vector-tiles-5eJz6JX';
|
||||
|
||||
var attribution = [new ol.Attribution({
|
||||
html: '© OpenStreetMap contributors, Who’s On First, Natural Earth, and openstreetmapdata.com'
|
||||
})];
|
||||
var format = new ol.format.TopoJSON();
|
||||
var tileGrid = ol.tilegrid.createXYZ({maxZoom: 19});
|
||||
var roadStyleCache = {};
|
||||
var roadColor = {
|
||||
'major_road': '#776',
|
||||
@@ -34,65 +28,58 @@ var buildingStyle = new ol.style.Style({
|
||||
width: 1
|
||||
})
|
||||
});
|
||||
var waterStyle = new ol.style.Style({
|
||||
fill: new ol.style.Fill({
|
||||
color: '#9db9e8'
|
||||
})
|
||||
});
|
||||
var roadStyle = function(feature) {
|
||||
var kind = feature.get('kind');
|
||||
var railway = feature.get('railway');
|
||||
var sort_key = feature.get('sort_key');
|
||||
var styleKey = kind + '/' + railway + '/' + sort_key;
|
||||
var style = roadStyleCache[styleKey];
|
||||
if (!style) {
|
||||
var color, width;
|
||||
if (railway) {
|
||||
color = '#7de';
|
||||
width = 1;
|
||||
} else {
|
||||
color = roadColor[kind];
|
||||
width = kind == 'highway' ? 1.5 : 1;
|
||||
}
|
||||
style = new ol.style.Style({
|
||||
stroke: new ol.style.Stroke({
|
||||
color: color,
|
||||
width: width
|
||||
}),
|
||||
zIndex: sort_key
|
||||
});
|
||||
roadStyleCache[styleKey] = style;
|
||||
}
|
||||
return style;
|
||||
};
|
||||
|
||||
var map = new ol.Map({
|
||||
layers: [
|
||||
new ol.layer.VectorTile({
|
||||
source: new ol.source.VectorTile({
|
||||
attributions: attribution,
|
||||
format: format,
|
||||
tileGrid: tileGrid,
|
||||
url: 'https://tile.mapzen.com/mapzen/vector/v1/water/{z}/{x}/{y}.topojson?api_key=' + key
|
||||
attributions: '© OpenStreetMap contributors, Who’s On First, ' +
|
||||
'Natural Earth, and openstreetmapdata.com',
|
||||
format: new ol.format.TopoJSON({
|
||||
layerName: 'layer',
|
||||
layers: ['water', 'roads', 'buildings']
|
||||
}),
|
||||
tileGrid: ol.tilegrid.createXYZ({tileSize: 512, maxZoom: 19}),
|
||||
url: 'https://tile.mapzen.com/mapzen/vector/v1/all/{z}/{x}/{y}.topojson?api_key=' + key
|
||||
}),
|
||||
style: new ol.style.Style({
|
||||
fill: new ol.style.Fill({
|
||||
color: '#9db9e8'
|
||||
})
|
||||
})
|
||||
}),
|
||||
new ol.layer.VectorTile({
|
||||
source: new ol.source.VectorTile({
|
||||
attributions: attribution,
|
||||
format: format,
|
||||
tileGrid: tileGrid,
|
||||
url: 'https://tile.mapzen.com/mapzen/vector/v1/roads/{z}/{x}/{y}.topojson?api_key=' + key
|
||||
}),
|
||||
style: function(feature) {
|
||||
var kind = feature.get('kind');
|
||||
var railway = feature.get('railway');
|
||||
var sort_key = feature.get('sort_key');
|
||||
var styleKey = kind + '/' + railway + '/' + sort_key;
|
||||
var style = roadStyleCache[styleKey];
|
||||
if (!style) {
|
||||
var color, width;
|
||||
if (railway) {
|
||||
color = '#7de';
|
||||
width = 1;
|
||||
} else {
|
||||
color = roadColor[kind];
|
||||
width = kind == 'highway' ? 1.5 : 1;
|
||||
}
|
||||
style = new ol.style.Style({
|
||||
stroke: new ol.style.Stroke({
|
||||
color: color,
|
||||
width: width
|
||||
}),
|
||||
zIndex: sort_key
|
||||
});
|
||||
roadStyleCache[styleKey] = style;
|
||||
style: function(feature, resolution) {
|
||||
switch (feature.get('layer')) {
|
||||
case 'water': return waterStyle;
|
||||
case 'roads': return roadStyle(feature);
|
||||
case 'buildings': return (resolution < 10) ? buildingStyle : null;
|
||||
default: return null;
|
||||
}
|
||||
return style;
|
||||
}
|
||||
}),
|
||||
new ol.layer.VectorTile({
|
||||
source: new ol.source.VectorTile({
|
||||
attributions: attribution,
|
||||
format: format,
|
||||
tileGrid: tileGrid,
|
||||
url: 'https://tile.mapzen.com/mapzen/vector/v1/buildings/{z}/{x}/{y}.topojson?api_key=' + key
|
||||
}),
|
||||
style: function(f, resolution) {
|
||||
return (resolution < 10) ? buildingStyle : null;
|
||||
}
|
||||
})
|
||||
],
|
||||
|
||||
@@ -54,28 +54,28 @@ var geojsonObject = {
|
||||
'geometry': {
|
||||
'type': 'Polygon',
|
||||
'coordinates': [[[-5e6, 6e6], [-5e6, 8e6], [-3e6, 8e6],
|
||||
[-3e6, 6e6], [-5e6, 6e6]]]
|
||||
[-3e6, 6e6], [-5e6, 6e6]]]
|
||||
}
|
||||
}, {
|
||||
'type': 'Feature',
|
||||
'geometry': {
|
||||
'type': 'Polygon',
|
||||
'coordinates': [[[-2e6, 6e6], [-2e6, 8e6], [0, 8e6],
|
||||
[0, 6e6], [-2e6, 6e6]]]
|
||||
[0, 6e6], [-2e6, 6e6]]]
|
||||
}
|
||||
}, {
|
||||
'type': 'Feature',
|
||||
'geometry': {
|
||||
'type': 'Polygon',
|
||||
'coordinates': [[[1e6, 6e6], [1e6, 8e6], [3e6, 8e6],
|
||||
[3e6, 6e6], [1e6, 6e6]]]
|
||||
[3e6, 6e6], [1e6, 6e6]]]
|
||||
}
|
||||
}, {
|
||||
'type': 'Feature',
|
||||
'geometry': {
|
||||
'type': 'Polygon',
|
||||
'coordinates': [[[-2e6, -1e6], [-1e6, 1e6],
|
||||
[0, -1e6], [-2e6, -1e6]]]
|
||||
[0, -1e6], [-2e6, -1e6]]]
|
||||
}
|
||||
}]
|
||||
};
|
||||
|
||||
@@ -162,13 +162,13 @@ function plot(resolution, counts, threshold) {
|
||||
var value = counts.min + (index * counts.delta);
|
||||
return 'bar' + (value >= threshold ? ' selected' : '');
|
||||
})
|
||||
.attr('width', barWidth - 2);
|
||||
.attr('width', barWidth - 2);
|
||||
|
||||
bar.transition().attr('transform', function(value, index) {
|
||||
return 'translate(' + (index * barWidth) + ', ' +
|
||||
(plotHeight - yScale(value)) + ')';
|
||||
})
|
||||
.attr('height', yScale);
|
||||
.attr('height', yScale);
|
||||
|
||||
bar.on('mousemove', function(count, index) {
|
||||
var threshold = counts.min + (index * counts.delta);
|
||||
|
||||
@@ -177,7 +177,7 @@ function updateViewProjection() {
|
||||
});
|
||||
map.setView(newView);
|
||||
|
||||
// Example how to prevent double occurence of map by limiting layer extent
|
||||
// Example how to prevent double occurrence of map by limiting layer extent
|
||||
if (newProj == ol.proj.get('EPSG:3857')) {
|
||||
layers['bng'].setExtent([-1057216, 6405988, 404315, 8759696]);
|
||||
} else {
|
||||
|
||||
@@ -18,7 +18,7 @@ var map = new ol.Map({
|
||||
})
|
||||
}),
|
||||
view: new ol.View({
|
||||
center: [-25860000, 4130000],
|
||||
center: [14200000, 4130000],
|
||||
rotation: Math.PI / 6,
|
||||
zoom: 10
|
||||
})
|
||||
|
||||
@@ -29,6 +29,7 @@ tags: "draw, edit, modify, vector, snap"
|
||||
<option value="Point">Point</option>
|
||||
<option value="LineString">LineString</option>
|
||||
<option value="Polygon">Polygon</option>
|
||||
<option value="Circle">Circle</option>
|
||||
</select>
|
||||
</div>
|
||||
</form>
|
||||
|
||||
@@ -81,6 +81,8 @@ var Draw = {
|
||||
this.LineString.setActive(false);
|
||||
map.addInteraction(this.Polygon);
|
||||
this.Polygon.setActive(false);
|
||||
map.addInteraction(this.Circle);
|
||||
this.Circle.setActive(false);
|
||||
},
|
||||
Point: new ol.interaction.Draw({
|
||||
source: vector.getSource(),
|
||||
@@ -94,6 +96,10 @@ var Draw = {
|
||||
source: vector.getSource(),
|
||||
type: /** @type {ol.geom.GeometryType} */ ('Polygon')
|
||||
}),
|
||||
Circle: new ol.interaction.Draw({
|
||||
source: vector.getSource(),
|
||||
type: /** @type {ol.geom.GeometryType} */ ('Circle')
|
||||
}),
|
||||
getActive: function() {
|
||||
return this.activeType ? this[this.activeType].getActive() : false;
|
||||
},
|
||||
|
||||
17
examples/street-labels.html
Normal file
17
examples/street-labels.html
Normal file
@@ -0,0 +1,17 @@
|
||||
---
|
||||
layout: example.html
|
||||
title: Street Labels
|
||||
shortdesc: Render street names with a custom render.
|
||||
docs: >
|
||||
Example showing the use of a custom renderer to render text along a path. [Labelgun](https://github.com/Geovation/labelgun) is used to avoid label collisions. [label-segment](https://github.com/ahocevar/label-segment) makes sure that labels are placed on suitable street segments. [textpath](https://github.com/ahocevar/textpath) arranges the letters of a label along the geometry. The data is fetched from OSM using the [Overpass API](https://overpass-api.de).
|
||||
tags: "vector, label, collision detection, labelgun, linelabel, overpass"
|
||||
resources:
|
||||
- https://cdn.polyfill.io/v2/polyfill.min.js?features=Set"
|
||||
- https://unpkg.com/rbush@2.0.1/rbush.min.js
|
||||
- https://unpkg.com/labelgun@0.1.1/lib/labelgun.min.js
|
||||
- https://unpkg.com/textpath@1.0.1/dist/textpath.js
|
||||
- https://unpkg.com/label-segment@1.0.0/dist/label-segment.js
|
||||
cloak:
|
||||
As1HiMj1PvLPlqc_gtM7AqZfBL8ZL3VrjaS3zIb22Uvb9WKhuJObROC-qUpa81U5: Your Bing Maps Key from http://www.bingmapsportal.com/ here
|
||||
---
|
||||
<div id="map" class="map"></div>
|
||||
115
examples/street-labels.js
Normal file
115
examples/street-labels.js
Normal file
@@ -0,0 +1,115 @@
|
||||
// NOCOMPILE
|
||||
/* global labelgun, labelSegment, textPath */
|
||||
goog.require('ol.Map');
|
||||
goog.require('ol.View');
|
||||
goog.require('ol.extent');
|
||||
goog.require('ol.format.OSMXML');
|
||||
goog.require('ol.layer.Tile');
|
||||
goog.require('ol.layer.Vector');
|
||||
goog.require('ol.source.BingMaps');
|
||||
goog.require('ol.source.Vector');
|
||||
goog.require('ol.style.Style');
|
||||
|
||||
var emptyFn = function() {};
|
||||
var labelEngine = new labelgun['default'](emptyFn, emptyFn);
|
||||
|
||||
var context, pixelRatio; // Will be set in the map's postcompose listener
|
||||
function measureText(text) {
|
||||
return context.measureText(text).width * pixelRatio;
|
||||
}
|
||||
|
||||
var extent, letters; // Will be set in the style's renderer function
|
||||
function collectDrawData(letter, x, y, angle) {
|
||||
ol.extent.extend(extent, [x, y, x, y]);
|
||||
letters.push([x, y, angle, letter]);
|
||||
}
|
||||
|
||||
var style = new ol.style.Style({
|
||||
renderer: function(coords, context) {
|
||||
var feature = context.feature;
|
||||
var text = feature.get('name');
|
||||
// Only create label when geometry has a long and straight segment
|
||||
var path = labelSegment(coords, Math.PI / 8, measureText(text));
|
||||
if (path) {
|
||||
extent = ol.extent.createEmpty();
|
||||
letters = [];
|
||||
textPath(text, path, measureText, collectDrawData);
|
||||
ol.extent.buffer(extent, 5 * pixelRatio, extent);
|
||||
var bounds = {
|
||||
bottomLeft: ol.extent.getBottomLeft(extent),
|
||||
topRight: ol.extent.getTopRight(extent)
|
||||
};
|
||||
labelEngine.ingestLabel(bounds, feature.getId(), 1, letters, text, false);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
var rasterLayer = new ol.layer.Tile({
|
||||
source: new ol.source.BingMaps({
|
||||
key: 'As1HiMj1PvLPlqc_gtM7AqZfBL8ZL3VrjaS3zIb22Uvb9WKhuJObROC-qUpa81U5',
|
||||
imagerySet: 'Aerial'
|
||||
})
|
||||
});
|
||||
|
||||
var source = new ol.source.Vector();
|
||||
// Request streets from OSM, using the Overpass API
|
||||
fetch('https://overpass-api.de/api/interpreter', {
|
||||
method: 'POST',
|
||||
body: '(way["highway"](48.19642,16.32580,48.22050,16.41986));(._;>;);out meta;'
|
||||
}).then(function(response) {
|
||||
return response.text();
|
||||
}).then(function(responseText) {
|
||||
var features = new ol.format.OSMXML().readFeatures(responseText, {
|
||||
featureProjection: 'EPSG:3857'
|
||||
});
|
||||
source.addFeatures(features);
|
||||
});
|
||||
|
||||
var vectorLayer = new ol.layer.Vector({
|
||||
source: source,
|
||||
style: function(feature) {
|
||||
if (feature.getGeometry().getType() == 'LineString' && feature.get('name')) {
|
||||
return style;
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
var viewExtent = [1817379, 6139595, 1827851, 6143616];
|
||||
var map = new ol.Map({
|
||||
layers: [rasterLayer, vectorLayer],
|
||||
target: 'map',
|
||||
view: new ol.View({
|
||||
extent: viewExtent,
|
||||
center: ol.extent.getCenter(viewExtent),
|
||||
zoom: 17,
|
||||
minZoom: 14
|
||||
})
|
||||
});
|
||||
|
||||
vectorLayer.on('precompose', function() {
|
||||
labelEngine.destroy();
|
||||
});
|
||||
vectorLayer.on('postcompose', function(e) {
|
||||
context = e.context;
|
||||
pixelRatio = e.frameState.pixelRatio;
|
||||
context.save();
|
||||
context.font = 'normal 11px "Open Sans", "Arial Unicode MS"';
|
||||
context.fillStyle = 'white';
|
||||
context.textBaseline = 'middle';
|
||||
context.textAlign = 'center';
|
||||
var labels = labelEngine.getShown();
|
||||
for (var i = 0, ii = labels.length; i < ii; ++i) {
|
||||
// Render label letter by letter
|
||||
var letters = labels[i].labelObject;
|
||||
for (var j = 0, jj = letters.length; j < jj; ++j) {
|
||||
var labelData = letters[j];
|
||||
context.save();
|
||||
context.translate(labelData[0], labelData[1]);
|
||||
context.rotate(labelData[2]);
|
||||
context.scale(pixelRatio, pixelRatio);
|
||||
context.fillText(labelData[3], 0, 0);
|
||||
context.restore();
|
||||
}
|
||||
}
|
||||
context.restore();
|
||||
});
|
||||
@@ -29,13 +29,14 @@ var style = new ol.style.Style({
|
||||
var vector = new ol.layer.Vector({
|
||||
source: new ol.source.Vector({
|
||||
url: 'data/topojson/world-110m.json',
|
||||
format: new ol.format.TopoJSON(),
|
||||
format: new ol.format.TopoJSON({
|
||||
// don't want to render the full world polygon (stored as 'land' layer),
|
||||
// which repeats all countries
|
||||
layers: ['countries']
|
||||
}),
|
||||
overlaps: false
|
||||
}),
|
||||
style: function(feature) {
|
||||
// don't want to render the full world polygon, which repeats all countries
|
||||
return feature.getId() !== undefined ? style : null;
|
||||
}
|
||||
style: style
|
||||
});
|
||||
|
||||
var map = new ol.Map({
|
||||
|
||||
13
examples/vector-label-decluttering.html
Normal file
13
examples/vector-label-decluttering.html
Normal file
@@ -0,0 +1,13 @@
|
||||
---
|
||||
layout: example.html
|
||||
title: Vector Label Decluttering
|
||||
shortdesc: Label decluttering with a custom renderer.
|
||||
resources:
|
||||
- https://cdn.polyfill.io/v2/polyfill.min.js?features=Set"
|
||||
- https://unpkg.com/rbush@2.0.1/rbush.min.js
|
||||
- https://unpkg.com/labelgun@0.1.1/lib/labelgun.min.js
|
||||
docs: >
|
||||
A custom `renderer` function is used instead of an `ol.style.Text` to label the countries of the world. Only texts that are not wider than their country's bounding box are considered and handed over to [Labelgun](https://github.com/Geovation/labelgun) for decluttering.
|
||||
tags: "vector, renderer, labelgun, label"
|
||||
---
|
||||
<div id="map" class="map"></div>
|
||||
125
examples/vector-label-decluttering.js
Normal file
125
examples/vector-label-decluttering.js
Normal file
@@ -0,0 +1,125 @@
|
||||
// NOCOMPILE
|
||||
/* global labelgun */
|
||||
goog.require('ol.Map');
|
||||
goog.require('ol.View');
|
||||
goog.require('ol.extent');
|
||||
goog.require('ol.format.GeoJSON');
|
||||
goog.require('ol.layer.Vector');
|
||||
goog.require('ol.source.Vector');
|
||||
goog.require('ol.style.Fill');
|
||||
goog.require('ol.style.Stroke');
|
||||
goog.require('ol.style.Style');
|
||||
|
||||
// Style for labels
|
||||
function setStyle(context) {
|
||||
context.font = '12px Calibri,sans-serif';
|
||||
context.fillStyle = '#000';
|
||||
context.strokeStyle = '#fff';
|
||||
context.lineWidth = 3;
|
||||
context.textBaseline = 'hanging';
|
||||
context.textAlign = 'start';
|
||||
}
|
||||
|
||||
// A separate canvas context for measuring label width and height.
|
||||
var textMeasureContext = document.createElement('CANVAS').getContext('2d');
|
||||
setStyle(textMeasureContext);
|
||||
|
||||
// The label height is approximated by the width of the text 'WI'.
|
||||
var height = textMeasureContext.measureText('WI').width;
|
||||
|
||||
// A cache for reusing label images once they have been created.
|
||||
var textCache = {};
|
||||
|
||||
var map = new ol.Map({
|
||||
target: 'map',
|
||||
view: new ol.View({
|
||||
center: [0, 0],
|
||||
zoom: 1
|
||||
})
|
||||
});
|
||||
|
||||
var emptyFn = function() {};
|
||||
var labelEngine = new labelgun['default'](emptyFn, emptyFn);
|
||||
|
||||
function createLabel(canvas, text, coord) {
|
||||
var halfWidth = canvas.width / 2;
|
||||
var halfHeight = canvas.height / 2;
|
||||
var bounds = {
|
||||
bottomLeft: [Math.round(coord[0] - halfWidth), Math.round(coord[1] - halfHeight)],
|
||||
topRight: [Math.round(coord[0] + halfWidth), Math.round(coord[1] + halfHeight)]
|
||||
};
|
||||
labelEngine.ingestLabel(bounds, coord.toString(), 1, canvas, text, false);
|
||||
}
|
||||
|
||||
// For multi-polygons, we only label the widest polygon. This is done by sorting
|
||||
// by extent width in descending order, and take the first from the array.
|
||||
function sortByWidth(a, b) {
|
||||
return ol.extent.getWidth(b.getExtent()) - ol.extent.getWidth(a.getExtent());
|
||||
}
|
||||
|
||||
var labelStyle = new ol.style.Style({
|
||||
renderer: function(coords, state) {
|
||||
var text = state.feature.get('name');
|
||||
createLabel(textCache[text], text, coords);
|
||||
}
|
||||
});
|
||||
var countryStyle = new ol.style.Style({
|
||||
fill: new ol.style.Fill({
|
||||
color: 'rgba(255, 255, 255, 0.6)'
|
||||
}),
|
||||
stroke: new ol.style.Stroke({
|
||||
color: '#319FD3',
|
||||
width: 1
|
||||
})
|
||||
});
|
||||
var styleWithLabel = [countryStyle, labelStyle];
|
||||
var styleWithoutLabel = [countryStyle];
|
||||
|
||||
var pixelRatio; // This is set by the map's precompose listener
|
||||
var vectorLayer = new ol.layer.Vector({
|
||||
source: new ol.source.Vector({
|
||||
url: 'data/geojson/countries.geojson',
|
||||
format: new ol.format.GeoJSON()
|
||||
}),
|
||||
style: function(feature, resolution) {
|
||||
var text = feature.get('name');
|
||||
var width = textMeasureContext.measureText(text).width;
|
||||
var geometry = feature.getGeometry();
|
||||
if (geometry.getType() == 'MultiPolygon') {
|
||||
geometry = geometry.getPolygons().sort(sortByWidth)[0];
|
||||
}
|
||||
var extentWidth = ol.extent.getWidth(geometry.getExtent());
|
||||
if (extentWidth / resolution > width) {
|
||||
// Only consider label when it fits its geometry's extent
|
||||
if (!(text in textCache)) {
|
||||
// Draw the label to its own canvas and cache it.
|
||||
var canvas = textCache[text] = document.createElement('CANVAS');
|
||||
canvas.width = width * pixelRatio;
|
||||
canvas.height = height * pixelRatio;
|
||||
var context = canvas.getContext('2d');
|
||||
context.scale(pixelRatio, pixelRatio);
|
||||
setStyle(context);
|
||||
context.strokeText(text, 0, 0);
|
||||
context.fillText(text, 0, 0);
|
||||
}
|
||||
labelStyle.setGeometry(geometry.getInteriorPoint());
|
||||
return styleWithLabel;
|
||||
} else {
|
||||
return styleWithoutLabel;
|
||||
}
|
||||
}
|
||||
});
|
||||
vectorLayer.on('precompose', function(e) {
|
||||
pixelRatio = e.frameState.pixelRatio;
|
||||
labelEngine.destroy();
|
||||
});
|
||||
vectorLayer.on('postcompose', function(e) {
|
||||
var labels = labelEngine.getShown();
|
||||
for (var i = 0, ii = labels.length; i < ii; ++i) {
|
||||
var label = labels[i];
|
||||
// Draw label to the map canvas
|
||||
e.context.drawImage(label.labelObject, label.minX, label.minY);
|
||||
}
|
||||
});
|
||||
|
||||
map.addLayer(vectorLayer);
|
||||
@@ -47,8 +47,8 @@ var featureRequest = new ol.format.WFS().writeGetFeature({
|
||||
featureTypes: ['water_areas'],
|
||||
outputFormat: 'application/json',
|
||||
filter: ol.format.filter.and(
|
||||
ol.format.filter.like('name', 'Mississippi*'),
|
||||
ol.format.filter.equalTo('waterway', 'riverbank')
|
||||
ol.format.filter.like('name', 'Mississippi*'),
|
||||
ol.format.filter.equalTo('waterway', 'riverbank')
|
||||
)
|
||||
});
|
||||
|
||||
|
||||
@@ -3,7 +3,7 @@ layout: example.html
|
||||
title: WMS Time
|
||||
shortdesc: Example of smooth tile transitions when changing the time dimension of a tiled WMS layer.
|
||||
docs: >
|
||||
Demonstrates smooth reloading of layers when changing the time dimension continously. Data shown: IEM generated CONUS composite of NWS NEXRAD WSR-88D level III base reflectivity.
|
||||
Demonstrates smooth reloading of layers when changing the time dimension continuously. Data shown: IEM generated CONUS composite of NWS NEXRAD WSR-88D level III base reflectivity.
|
||||
tags: "wms, time, dimensions, transition, nexrad"
|
||||
---
|
||||
<div id="map" class="map"></div>
|
||||
|
||||
@@ -3,7 +3,7 @@ layout: example.html
|
||||
title: WMTS Tile Transitions
|
||||
shortdesc: Example of smooth tile transitions when changing the dimension of a WMTS layer.
|
||||
docs: >
|
||||
Demonstrates smooth reloading of layers when changing a dimension continously. The demonstration layer is a global sea-level computation (flooding computation from <a href="http://scalgo.com">SCALGO</a>, underlying data from <a href="http://www.cgiar-csi.org/data/srtm-90m-digital-elevation-database-v4-1">CGIAR-CSI SRTM</a>) where cells that are flooded if the sea-level rises to more than <em>x</em> m are colored blue. The user selects the sea-level dimension using a slider.
|
||||
Demonstrates smooth reloading of layers when changing a dimension continuously. The demonstration layer is a global sea-level computation (flooding computation from <a href="http://scalgo.com">SCALGO</a>, underlying data from <a href="http://www.cgiar-csi.org/data/srtm-90m-digital-elevation-database-v4-1">CGIAR-CSI SRTM</a>) where cells that are flooded if the sea-level rises to more than <em>x</em> m are colored blue. The user selects the sea-level dimension using a slider.
|
||||
tags: "wmts, parameter, transition"
|
||||
---
|
||||
<div id="map" class="map"></div>
|
||||
|
||||
@@ -28,8 +28,8 @@ var map = new ol.Map({
|
||||
tileSize: tileSize,
|
||||
tileUrlFunction: function(tileCoord) {
|
||||
return urlTemplate.replace('{z}', (tileCoord[0] - 1).toString())
|
||||
.replace('{x}', tileCoord[1].toString())
|
||||
.replace('{y}', (-tileCoord[2] - 1).toString());
|
||||
.replace('{x}', tileCoord[1].toString())
|
||||
.replace('{y}', (-tileCoord[2] - 1).toString());
|
||||
},
|
||||
wrapX: true
|
||||
})
|
||||
|
||||
@@ -91,6 +91,17 @@ oli.DrawEvent = function() {};
|
||||
oli.DrawEvent.prototype.feature;
|
||||
|
||||
|
||||
/**
|
||||
* @interface
|
||||
*/
|
||||
oli.ExtentEvent = function() {};
|
||||
|
||||
|
||||
/**
|
||||
* @type {ol.Extent}
|
||||
*/
|
||||
oli.ExtentEvent.prototype.extent;
|
||||
|
||||
/**
|
||||
* @interface
|
||||
*/
|
||||
|
||||
404
externs/olx.js
404
externs/olx.js
@@ -112,7 +112,14 @@ olx.LogoOptions.prototype.src;
|
||||
* @typedef {{map: (ol.Map|undefined),
|
||||
* maxLines: (number|undefined),
|
||||
* strokeStyle: (ol.style.Stroke|undefined),
|
||||
* targetSize: (number|undefined)}}
|
||||
* targetSize: (number|undefined),
|
||||
* showLabels: (boolean|undefined),
|
||||
* lonLabelFormatter: (undefined|function(number):string),
|
||||
* latLabelFormatter: (undefined|function(number):string),
|
||||
* lonLabelPosition: (number|undefined),
|
||||
* latLabelPosition: (number|undefined),
|
||||
* lonLabelStyle: (ol.style.Text|undefined),
|
||||
* latLabelStyle: (ol.style.Text|undefined)}}
|
||||
*/
|
||||
olx.GraticuleOptions;
|
||||
|
||||
@@ -157,6 +164,106 @@ olx.GraticuleOptions.prototype.strokeStyle;
|
||||
olx.GraticuleOptions.prototype.targetSize;
|
||||
|
||||
|
||||
/**
|
||||
* Render a label with the respective latitude/longitude for each graticule
|
||||
* line. Default is false.
|
||||
*
|
||||
* @type {boolean|undefined}
|
||||
* @api
|
||||
*/
|
||||
olx.GraticuleOptions.prototype.showLabels;
|
||||
|
||||
|
||||
/**
|
||||
* Label formatter for longitudes. This function is called with the longitude as
|
||||
* argument, and should return a formatted string representing the longitude.
|
||||
* By default, labels are formatted as degrees, minutes, seconds and hemisphere.
|
||||
*
|
||||
* @type {undefined|function(number):string}
|
||||
* @api
|
||||
*/
|
||||
olx.GraticuleOptions.prototype.lonLabelFormatter;
|
||||
|
||||
|
||||
/**
|
||||
* Label formatter for latitudes. This function is called with the latitude as
|
||||
* argument, and should return a formatted string representing the latitude.
|
||||
* By default, labels are formatted as degrees, minutes, seconds and hemisphere.
|
||||
*
|
||||
* @type {undefined|function(number):string}
|
||||
* @api
|
||||
*/
|
||||
olx.GraticuleOptions.prototype.latLabelFormatter;
|
||||
|
||||
|
||||
/**
|
||||
* Longitude label position in fractions (0..1) of view extent. 0 means at the
|
||||
* bottom of the viewport, 1 means at the top. Default is 0.
|
||||
* @type {number|undefined}
|
||||
* @api
|
||||
*/
|
||||
olx.GraticuleOptions.prototype.lonLabelPosition;
|
||||
|
||||
|
||||
/**
|
||||
* Latitude label position in fractions (0..1) of view extent. 0 means at the
|
||||
* left of the viewport, 1 means at the right. Default is 1.
|
||||
* @type {number|undefined}
|
||||
* @api
|
||||
*/
|
||||
olx.GraticuleOptions.prototype.latLabelPosition;
|
||||
|
||||
|
||||
/**
|
||||
* Longitude label text style. The default is
|
||||
* ```js
|
||||
* new ol.style.Text({
|
||||
* font: '12px Calibri,sans-serif',
|
||||
* textBaseline: 'bottom',
|
||||
* fill: new ol.style.Fill({
|
||||
* color: 'rgba(0,0,0,1)'
|
||||
* }),
|
||||
* stroke: new ol.style.Stroke({
|
||||
* color: 'rgba(255,255,255,1)',
|
||||
* width: 3
|
||||
* })
|
||||
* });
|
||||
* ```
|
||||
* Note that the default's `textBaseline` configuration will not work well for
|
||||
* `lonLabelPosition` configurations that position labels close to the top of
|
||||
* the viewport.
|
||||
*
|
||||
* @type {ol.style.Text|undefined}
|
||||
* @api
|
||||
*/
|
||||
olx.GraticuleOptions.prototype.lonLabelStyle;
|
||||
|
||||
|
||||
/**
|
||||
* Latitude label text style. The default is
|
||||
* ```js
|
||||
* new ol.style.Text({
|
||||
* font: '12px Calibri,sans-serif',
|
||||
* textAlign: 'end',
|
||||
* fill: new ol.style.Fill({
|
||||
* color: 'rgba(0,0,0,1)'
|
||||
* }),
|
||||
* stroke: new ol.style.Stroke({
|
||||
* color: 'rgba(255,255,255,1)',
|
||||
* width: 3
|
||||
* })
|
||||
* });
|
||||
* ```
|
||||
* Note that the default's `textAlign` configuration will not work well for
|
||||
* `latLabelPosition` configurations that position labels close to the left of
|
||||
* the viewport.
|
||||
*
|
||||
* @type {ol.style.Text|undefined}
|
||||
* @api
|
||||
*/
|
||||
olx.GraticuleOptions.prototype.latLabelStyle;
|
||||
|
||||
|
||||
/**
|
||||
* Object literal with config options for interactions.
|
||||
* @typedef {{handleEvent: function(ol.MapBrowserEvent):boolean}}
|
||||
@@ -185,6 +292,7 @@ olx.interaction.InteractionOptions.prototype.handleEvent;
|
||||
* loadTilesWhileAnimating: (boolean|undefined),
|
||||
* loadTilesWhileInteracting: (boolean|undefined),
|
||||
* logo: (boolean|string|olx.LogoOptions|Element|undefined),
|
||||
* moveTolerance: (number|undefined),
|
||||
* overlays: (ol.Collection.<ol.Overlay>|Array.<ol.Overlay>|undefined),
|
||||
* renderer: (ol.renderer.Type|Array.<ol.renderer.Type>|undefined),
|
||||
* target: (Element|string|undefined),
|
||||
@@ -278,6 +386,17 @@ olx.MapOptions.prototype.loadTilesWhileInteracting;
|
||||
olx.MapOptions.prototype.logo;
|
||||
|
||||
|
||||
/**
|
||||
* The minimum distance in pixels the cursor must move to be detected
|
||||
* as a map move event instead of a click. Increasing this value can make it
|
||||
* easier to click on the map.
|
||||
* Default is `1`.
|
||||
* @type {number|undefined}
|
||||
* @api
|
||||
*/
|
||||
olx.MapOptions.prototype.moveTolerance;
|
||||
|
||||
|
||||
/**
|
||||
* Overlays initially added to the map. By default, no overlays are added.
|
||||
* @type {ol.Collection.<ol.Overlay>|Array.<ol.Overlay>|undefined}
|
||||
@@ -561,7 +680,8 @@ olx.ProjectionOptions.prototype.worldExtent;
|
||||
/**
|
||||
* Function to determine resolution at a point. The function is called with a
|
||||
* `{number}` view resolution and an `{ol.Coordinate}` as arguments, and returns
|
||||
* the `{number}` resolution at the passed coordinate.
|
||||
* the `{number}` resolution at the passed coordinate. If this is `undefined`,
|
||||
* the default {@link ol.proj#getPointResolution} function will be used.
|
||||
* @type {(function(number, ol.Coordinate):number|undefined)}
|
||||
* @api
|
||||
*/
|
||||
@@ -1874,9 +1994,9 @@ olx.format.MVTOptions;
|
||||
* {@link ol.Feature} to get full editing and geometry support at the cost of
|
||||
* decreased rendering performance. The default is {@link ol.render.Feature},
|
||||
* which is optimized for rendering and hit detection.
|
||||
* @type {undefined|function((ol.geom.Geometry|Object.<string, *>)=)|
|
||||
* @type {undefined|function((ol.geom.Geometry|Object.<string,*>)=)|
|
||||
* function(ol.geom.GeometryType,Array.<number>,
|
||||
* (Array.<number>|Array.<Array.<number>>),Object.<string, *>)}
|
||||
* (Array.<number>|Array.<Array.<number>>),Object.<string,*>,number)}
|
||||
* @api
|
||||
*/
|
||||
olx.format.MVTOptions.prototype.featureClass;
|
||||
@@ -1933,7 +2053,11 @@ olx.format.PolylineOptions.prototype.geometryLayout;
|
||||
|
||||
|
||||
/**
|
||||
* @typedef {{defaultDataProjection: ol.ProjectionLike}}
|
||||
* @typedef {{
|
||||
* defaultDataProjection: ol.ProjectionLike,
|
||||
* layerName: (string|undefined),
|
||||
* layers: (Array.<string>|undefined)
|
||||
* }}
|
||||
*/
|
||||
olx.format.TopoJSONOptions;
|
||||
|
||||
@@ -1946,6 +2070,38 @@ olx.format.TopoJSONOptions;
|
||||
olx.format.TopoJSONOptions.prototype.defaultDataProjection;
|
||||
|
||||
|
||||
/**
|
||||
* Set the name of the TopoJSON topology `objects`'s children as feature
|
||||
* property with the specified name. This means that when set to `'layer'`, a
|
||||
* topology like
|
||||
* ```
|
||||
* {
|
||||
* "type": "Topology",
|
||||
* "objects": {
|
||||
* "example": {
|
||||
* "type": "GeometryCollection",
|
||||
* "geometries": []
|
||||
* }
|
||||
* }
|
||||
* }
|
||||
* ```
|
||||
* will result in features that have a property `'layer'` set to `'example'`.
|
||||
* When not set, no property will be added to features.
|
||||
* @type {string|undefined}
|
||||
* @api
|
||||
*/
|
||||
olx.format.TopoJSONOptions.prototype.layerName;
|
||||
|
||||
|
||||
/**
|
||||
* Names of the TopoJSON topology's `objects`'s children to read features from.
|
||||
* If not provided, features will be read from all children.
|
||||
* @type {Array.<string>|undefined}
|
||||
* @api
|
||||
*/
|
||||
olx.format.TopoJSONOptions.prototype.layers;
|
||||
|
||||
|
||||
/**
|
||||
* @typedef {{altitudeMode: (ol.format.IGCZ|undefined)}}
|
||||
*/
|
||||
@@ -2299,6 +2455,7 @@ olx.format.WFSWriteGetFeatureOptions.prototype.resultType;
|
||||
* featureType: string,
|
||||
* srsName: (string|undefined),
|
||||
* handle: (string|undefined),
|
||||
* hasZ: (boolean|undefined),
|
||||
* nativeElements: Array.<Object>,
|
||||
* gmlOptions: (olx.format.GMLOptions|undefined),
|
||||
* version: (string|undefined)}}
|
||||
@@ -2347,6 +2504,15 @@ olx.format.WFSWriteTransactionOptions.prototype.srsName;
|
||||
olx.format.WFSWriteTransactionOptions.prototype.handle;
|
||||
|
||||
|
||||
/**
|
||||
* Must be set to true if the transaction is for a 3D layer. This will allow
|
||||
* the Z coordinate to be included in the transaction.
|
||||
* @type {boolean|undefined}
|
||||
* @api
|
||||
*/
|
||||
olx.format.WFSWriteTransactionOptions.prototype.hasZ;
|
||||
|
||||
|
||||
/**
|
||||
* Native elements. Currently not supported.
|
||||
* @type {Array.<Object>}
|
||||
@@ -2905,7 +3071,7 @@ olx.interaction.DrawOptions.prototype.wrapX;
|
||||
olx.interaction.ExtentOptions;
|
||||
|
||||
/**
|
||||
* Initial extent. Defaults to no inital extent
|
||||
* Initial extent. Defaults to no initial extent
|
||||
* @type {ol.Extent|undefined}
|
||||
* @api
|
||||
*/
|
||||
@@ -2970,7 +3136,7 @@ olx.interaction.TranslateOptions.prototype.layers;
|
||||
/**
|
||||
* Hit-detection tolerance. Pixels inside the radius around the given position
|
||||
* will be checked for features. This only works for the canvas renderer and
|
||||
* not for WebGL.
|
||||
* not for WebGL. Default is `0`.
|
||||
* @type {number|undefined}
|
||||
* @api
|
||||
*/
|
||||
@@ -3047,12 +3213,16 @@ olx.interaction.KeyboardZoomOptions.prototype.delta;
|
||||
|
||||
|
||||
/**
|
||||
* @typedef {{condition: (ol.EventsConditionType|undefined),
|
||||
* @typedef {{
|
||||
* condition: (ol.EventsConditionType|undefined),
|
||||
* deleteCondition: (ol.EventsConditionType|undefined),
|
||||
* insertVertexCondition: (ol.EventsConditionType|undefined),
|
||||
* pixelTolerance: (number|undefined),
|
||||
* style: (ol.style.Style|Array.<ol.style.Style>|ol.StyleFunction|undefined),
|
||||
* features: ol.Collection.<ol.Feature>,
|
||||
* wrapX: (boolean|undefined)}}
|
||||
* source: (ol.source.Vector|undefined),
|
||||
* features: (ol.Collection.<ol.Feature>|undefined),
|
||||
* wrapX: (boolean|undefined)
|
||||
* }}
|
||||
*/
|
||||
olx.interaction.ModifyOptions;
|
||||
|
||||
@@ -3079,6 +3249,16 @@ olx.interaction.ModifyOptions.prototype.condition;
|
||||
olx.interaction.ModifyOptions.prototype.deleteCondition;
|
||||
|
||||
|
||||
/**
|
||||
* A function that takes an {@link ol.MapBrowserEvent} and returns a boolean
|
||||
* to indicate whether a new vertex can be added to the sketch features.
|
||||
* Default is {@link ol.events.condition.always}
|
||||
* @type {ol.EventsConditionType|undefined}
|
||||
* @api
|
||||
*/
|
||||
olx.interaction.ModifyOptions.prototype.insertVertexCondition;
|
||||
|
||||
|
||||
/**
|
||||
* Pixel tolerance for considering the pointer close enough to a segment or
|
||||
* vertex for editing. Default is `10`.
|
||||
@@ -3098,8 +3278,18 @@ olx.interaction.ModifyOptions.prototype.style;
|
||||
|
||||
|
||||
/**
|
||||
* The features the interaction works on.
|
||||
* @type {ol.Collection.<ol.Feature>}
|
||||
* The vector source with features to modify. If a vector source is not
|
||||
* provided, a feature collection must be provided with the features option.
|
||||
* @type {ol.source.Vector|undefined}
|
||||
* @api
|
||||
*/
|
||||
olx.interaction.ModifyOptions.prototype.source;
|
||||
|
||||
|
||||
/**
|
||||
* The features the interaction works on. If a feature collection is not
|
||||
* provided, a vector source must be provided with the source option.
|
||||
* @type {ol.Collection.<ol.Feature>|undefined}
|
||||
* @api
|
||||
*/
|
||||
olx.interaction.ModifyOptions.prototype.features;
|
||||
@@ -3391,7 +3581,7 @@ olx.interaction.SelectOptions.prototype.wrapX;
|
||||
/**
|
||||
* Hit-detection tolerance. Pixels inside the radius around the given position
|
||||
* will be checked for features. This only works for the canvas renderer and
|
||||
* not for WebGL.
|
||||
* not for WebGL. Default is `0`.
|
||||
* @type {number|undefined}
|
||||
* @api
|
||||
*/
|
||||
@@ -3672,7 +3862,8 @@ olx.layer.GroupOptions.prototype.layers;
|
||||
* maxResolution: (number|undefined),
|
||||
* opacity: (number|undefined),
|
||||
* source: (ol.source.Vector|undefined),
|
||||
* visible: (boolean|undefined)}}
|
||||
* visible: (boolean|undefined),
|
||||
* zIndex: (number|undefined)}}
|
||||
*/
|
||||
olx.layer.HeatmapOptions;
|
||||
|
||||
@@ -3769,6 +3960,15 @@ olx.layer.HeatmapOptions.prototype.source;
|
||||
olx.layer.HeatmapOptions.prototype.visible;
|
||||
|
||||
|
||||
/**
|
||||
* The z-index for layer rendering. At rendering time, the layers will be
|
||||
* ordered, first by Z-index and then by position. The default Z-index is 0.
|
||||
* @type {number|undefined}
|
||||
* @api
|
||||
*/
|
||||
olx.layer.HeatmapOptions.prototype.zIndex;
|
||||
|
||||
|
||||
/**
|
||||
* @typedef {{opacity: (number|undefined),
|
||||
* map: (ol.Map|undefined),
|
||||
@@ -3776,7 +3976,8 @@ olx.layer.HeatmapOptions.prototype.visible;
|
||||
* visible: (boolean|undefined),
|
||||
* extent: (ol.Extent|undefined),
|
||||
* minResolution: (number|undefined),
|
||||
* maxResolution: (number|undefined)}}
|
||||
* maxResolution: (number|undefined),
|
||||
* zIndex: (number|undefined)}}
|
||||
*/
|
||||
olx.layer.ImageOptions;
|
||||
|
||||
@@ -3841,6 +4042,15 @@ olx.layer.ImageOptions.prototype.minResolution;
|
||||
olx.layer.ImageOptions.prototype.maxResolution;
|
||||
|
||||
|
||||
/**
|
||||
* The z-index for layer rendering. At rendering time, the layers will be
|
||||
* ordered, first by Z-index and then by position. The default Z-index is 0.
|
||||
* @type {number|undefined}
|
||||
* @api
|
||||
*/
|
||||
olx.layer.ImageOptions.prototype.zIndex;
|
||||
|
||||
|
||||
/**
|
||||
* @typedef {{opacity: (number|undefined),
|
||||
* preload: (number|undefined),
|
||||
@@ -3850,7 +4060,8 @@ olx.layer.ImageOptions.prototype.maxResolution;
|
||||
* extent: (ol.Extent|undefined),
|
||||
* minResolution: (number|undefined),
|
||||
* maxResolution: (number|undefined),
|
||||
* useInterimTilesOnError: (boolean|undefined)}}
|
||||
* useInterimTilesOnError: (boolean|undefined),
|
||||
* zIndex: (number|undefined)}}
|
||||
*/
|
||||
olx.layer.TileOptions;
|
||||
|
||||
@@ -3932,6 +4143,15 @@ olx.layer.TileOptions.prototype.maxResolution;
|
||||
olx.layer.TileOptions.prototype.useInterimTilesOnError;
|
||||
|
||||
|
||||
/**
|
||||
* The z-index for layer rendering. At rendering time, the layers will be
|
||||
* ordered, first by Z-index and then by position. The default Z-index is 0.
|
||||
* @type {number|undefined}
|
||||
* @api
|
||||
*/
|
||||
olx.layer.TileOptions.prototype.zIndex;
|
||||
|
||||
|
||||
/**
|
||||
* @typedef {{renderOrder: (ol.RenderOrderFunction|null|undefined),
|
||||
* minResolution: (number|undefined),
|
||||
@@ -3943,7 +4163,8 @@ olx.layer.TileOptions.prototype.useInterimTilesOnError;
|
||||
* style: (ol.style.Style|Array.<ol.style.Style>|ol.StyleFunction|undefined),
|
||||
* updateWhileAnimating: (boolean|undefined),
|
||||
* updateWhileInteracting: (boolean|undefined),
|
||||
* visible: (boolean|undefined)}}
|
||||
* visible: (boolean|undefined),
|
||||
* zIndex: (number|undefined)}}
|
||||
*/
|
||||
olx.layer.VectorOptions;
|
||||
|
||||
@@ -4058,6 +4279,15 @@ olx.layer.VectorOptions.prototype.updateWhileInteracting;
|
||||
olx.layer.VectorOptions.prototype.visible;
|
||||
|
||||
|
||||
/**
|
||||
* The z-index for layer rendering. At rendering time, the layers will be
|
||||
* ordered, first by Z-index and then by position. The default Z-index is 0.
|
||||
* @type {number|undefined}
|
||||
* @api
|
||||
*/
|
||||
olx.layer.VectorOptions.prototype.zIndex;
|
||||
|
||||
|
||||
/**
|
||||
* @typedef {{extent: (ol.Extent|undefined),
|
||||
* map: (ol.Map|undefined),
|
||||
@@ -4072,7 +4302,8 @@ olx.layer.VectorOptions.prototype.visible;
|
||||
* style: (ol.style.Style|Array.<ol.style.Style>|ol.StyleFunction|undefined),
|
||||
* updateWhileAnimating: (boolean|undefined),
|
||||
* updateWhileInteracting: (boolean|undefined),
|
||||
* visible: (boolean|undefined)}}
|
||||
* visible: (boolean|undefined),
|
||||
* zIndex: (number|undefined)}}
|
||||
*/
|
||||
olx.layer.VectorTileOptions;
|
||||
|
||||
@@ -4214,6 +4445,15 @@ olx.layer.VectorTileOptions.prototype.updateWhileInteracting;
|
||||
olx.layer.VectorTileOptions.prototype.visible;
|
||||
|
||||
|
||||
/**
|
||||
* The z-index for layer rendering. At rendering time, the layers will be
|
||||
* ordered, first by Z-index and then by position. The default Z-index is 0.
|
||||
* @type {number|undefined}
|
||||
* @api
|
||||
*/
|
||||
olx.layer.VectorOptions.prototype.zIndex;
|
||||
|
||||
|
||||
/**
|
||||
* Namespace.
|
||||
* @type {Object}
|
||||
@@ -4221,6 +4461,50 @@ olx.layer.VectorTileOptions.prototype.visible;
|
||||
olx.render;
|
||||
|
||||
|
||||
/**
|
||||
* @typedef {{context: CanvasRenderingContext2D,
|
||||
* feature: (ol.Feature|ol.render.Feature),
|
||||
* geometry: ol.geom.SimpleGeometry,
|
||||
* pixelRatio: number,
|
||||
* resolution: number,
|
||||
* rotation: number}}
|
||||
*/
|
||||
olx.render.State;
|
||||
|
||||
|
||||
/**
|
||||
* Canvas context that the layer is being rendered to.
|
||||
* @type {CanvasRenderingContext2D}
|
||||
* @api
|
||||
*/
|
||||
olx.render.State.prototype.context;
|
||||
|
||||
|
||||
/**
|
||||
* Pixel ratio used by the layer renderer.
|
||||
* @type {number}
|
||||
* @api
|
||||
*/
|
||||
olx.render.State.prototype.pixelRatio;
|
||||
|
||||
|
||||
/**
|
||||
* Resolution that the render batch was created and optimized for. This is
|
||||
* not the view's resolution that is being rendered.
|
||||
* @type {number}
|
||||
* @api
|
||||
*/
|
||||
olx.render.State.prototype.resolution;
|
||||
|
||||
|
||||
/**
|
||||
* Rotation of the rendered layer in radians.
|
||||
* @type {number}
|
||||
* @api
|
||||
*/
|
||||
olx.render.State.prototype.rotation;
|
||||
|
||||
|
||||
/**
|
||||
* @typedef {{size: (ol.Size|undefined),
|
||||
* pixelRatio: (number|undefined)}}
|
||||
@@ -4677,7 +4961,6 @@ olx.source.TileImageOptions.prototype.wrapX;
|
||||
* ol.TileLoadFunctionType)|undefined),
|
||||
* tileGrid: (ol.tilegrid.TileGrid|undefined),
|
||||
* tileLoadFunction: (ol.TileLoadFunctionType|undefined),
|
||||
* tilePixelRatio: (number|undefined),
|
||||
* tileUrlFunction: (ol.TileUrlFunctionType|undefined),
|
||||
* url: (string|undefined),
|
||||
* urls: (Array.<string>|undefined),
|
||||
@@ -4747,7 +5030,7 @@ olx.source.VectorTileOptions.prototype.state;
|
||||
|
||||
|
||||
/**
|
||||
* Class used to instantiate image tiles. Default is {@link ol.VectorTile}.
|
||||
* Class used to instantiate vector tiles. Default is {@link ol.VectorTile}.
|
||||
* @type {function(new: ol.VectorTile, ol.TileCoord,
|
||||
* ol.TileState, string, ol.format.Feature,
|
||||
* ol.TileLoadFunctionType)|undefined}
|
||||
@@ -4773,6 +5056,8 @@ olx.source.VectorTileOptions.prototype.tileGrid;
|
||||
* var format = tile.getFormat();
|
||||
* tile.setFeatures(format.readFeatures(data));
|
||||
* tile.setProjection(format.readProjection(data));
|
||||
* // uncomment the line below for ol.format.MVT only
|
||||
* //tile.setExtent(format.getLastExtent());
|
||||
* };
|
||||
* });
|
||||
* ```
|
||||
@@ -4782,17 +5067,6 @@ olx.source.VectorTileOptions.prototype.tileGrid;
|
||||
olx.source.VectorTileOptions.prototype.tileLoadFunction;
|
||||
|
||||
|
||||
/**
|
||||
* The pixel ratio used by the tile service. For example, if the tile
|
||||
* service advertizes 256px by 256px tiles but actually sends 512px
|
||||
* by 512px tiles (for retina/hidpi devices) then `tilePixelRatio`
|
||||
* should be set to `2`. Default is `1`.
|
||||
* @type {number|undefined}
|
||||
* @api
|
||||
*/
|
||||
olx.source.VectorTileOptions.prototype.tilePixelRatio;
|
||||
|
||||
|
||||
/**
|
||||
* Optional function to get tile URL given a tile coordinate and the projection.
|
||||
* @type {ol.TileUrlFunctionType|undefined}
|
||||
@@ -5558,14 +5832,17 @@ olx.source.ImageWMSOptions.prototype.url;
|
||||
|
||||
|
||||
/**
|
||||
* @typedef {{cacheSize: (number|undefined),
|
||||
* @typedef {{
|
||||
* cacheSize: (number|undefined),
|
||||
* layer: string,
|
||||
* minZoom: (number|undefined),
|
||||
* maxZoom: (number|undefined),
|
||||
* opaque: (boolean|undefined),
|
||||
* reprojectionErrorThreshold: (number|undefined),
|
||||
* tileLoadFunction: (ol.TileLoadFunctionType|undefined),
|
||||
* url: (string|undefined)}}
|
||||
* url: (string|undefined),
|
||||
* wrapX: (boolean|undefined)
|
||||
* }}
|
||||
*/
|
||||
olx.source.StamenOptions;
|
||||
|
||||
@@ -5639,6 +5916,14 @@ olx.source.StamenOptions.prototype.tileLoadFunction;
|
||||
olx.source.StamenOptions.prototype.url;
|
||||
|
||||
|
||||
/**
|
||||
* Whether to wrap the world horizontally. Default is `true`.
|
||||
* @type {boolean|undefined}
|
||||
* @api
|
||||
*/
|
||||
olx.source.StamenOptions.prototype.wrapX;
|
||||
|
||||
|
||||
/**
|
||||
* @typedef {{attributions: (ol.AttributionLike|undefined),
|
||||
* crossOrigin: (null|string|undefined),
|
||||
@@ -5863,8 +6148,9 @@ olx.source.TileArcGISRestOptions.prototype.urls;
|
||||
* crossOrigin: (null|string|undefined),
|
||||
* jsonp: (boolean|undefined),
|
||||
* reprojectionErrorThreshold: (number|undefined),
|
||||
* tileJSON: (TileJSON|undefined),
|
||||
* tileLoadFunction: (ol.TileLoadFunctionType|undefined),
|
||||
* url: string,
|
||||
* url: (string|undefined),
|
||||
* wrapX: (boolean|undefined)}}
|
||||
*/
|
||||
olx.source.TileJSONOptions;
|
||||
@@ -5918,6 +6204,15 @@ olx.source.TileJSONOptions.prototype.jsonp;
|
||||
olx.source.TileJSONOptions.prototype.reprojectionErrorThreshold;
|
||||
|
||||
|
||||
/**
|
||||
* TileJSON configuration for this source. If not provided, `url` must be
|
||||
* configured.
|
||||
* @type {TileJSON|undefined}
|
||||
* @api
|
||||
*/
|
||||
olx.source.TileJSONOptions.prototype.tileJSON;
|
||||
|
||||
|
||||
/**
|
||||
* Optional function to load a tile given a URL. The default is
|
||||
* ```js
|
||||
@@ -5932,8 +6227,8 @@ olx.source.TileJSONOptions.prototype.tileLoadFunction;
|
||||
|
||||
|
||||
/**
|
||||
* URL to the TileJSON file.
|
||||
* @type {string}
|
||||
* URL to the TileJSON file. If not provided, `tileJSON` must be configured.
|
||||
* @type {string|undefined}
|
||||
* @api
|
||||
*/
|
||||
olx.source.TileJSONOptions.prototype.url;
|
||||
@@ -5955,6 +6250,9 @@ olx.source.TileJSONOptions.prototype.wrapX;
|
||||
* gutter: (number|undefined),
|
||||
* hidpi: (boolean|undefined),
|
||||
* logo: (string|olx.LogoOptions|undefined),
|
||||
* tileClass: (function(new: ol.ImageTile, ol.TileCoord,
|
||||
* ol.TileState, string, ?string,
|
||||
* ol.TileLoadFunctionType)|undefined),
|
||||
* tileGrid: (ol.tilegrid.TileGrid|undefined),
|
||||
* projection: ol.ProjectionLike,
|
||||
* reprojectionErrorThreshold: (number|undefined),
|
||||
@@ -6037,6 +6335,16 @@ olx.source.TileWMSOptions.prototype.hidpi;
|
||||
olx.source.TileWMSOptions.prototype.logo;
|
||||
|
||||
|
||||
/**
|
||||
* Class used to instantiate image tiles. Default is {@link ol.ImageTile}.
|
||||
* @type {function(new: ol.ImageTile, ol.TileCoord,
|
||||
* ol.TileState, string, ?string,
|
||||
* ol.TileLoadFunctionType)|undefined}
|
||||
* @api
|
||||
*/
|
||||
olx.source.TileWMSOptions.prototype.tileClass;
|
||||
|
||||
|
||||
/**
|
||||
* Tile grid. Base this on the resolutions, tilesize and extent supported by the
|
||||
* server.
|
||||
@@ -7408,6 +7716,7 @@ olx.style.TextOptions.prototype.stroke;
|
||||
* @typedef {{geometry: (undefined|string|ol.geom.Geometry|ol.StyleGeometryFunction),
|
||||
* fill: (ol.style.Fill|undefined),
|
||||
* image: (ol.style.Image|undefined),
|
||||
* renderer: (ol.StyleRenderFunction|undefined),
|
||||
* stroke: (ol.style.Stroke|undefined),
|
||||
* text: (ol.style.Text|undefined),
|
||||
* zIndex: (number|undefined)}}
|
||||
@@ -7440,6 +7749,16 @@ olx.style.StyleOptions.prototype.fill;
|
||||
olx.style.StyleOptions.prototype.image;
|
||||
|
||||
|
||||
/**
|
||||
* Custom renderer. When configured, `fill`, `stroke` and `image` will be
|
||||
* ignored, and the provided function will be called with each render frame for
|
||||
* each geometry.
|
||||
*
|
||||
* @type {ol.StyleRenderFunction|undefined}
|
||||
*/
|
||||
olx.style.StyleOptions.prototype.renderer;
|
||||
|
||||
|
||||
/**
|
||||
* Stroke style.
|
||||
* @type {ol.style.Stroke|undefined}
|
||||
@@ -7721,7 +8040,8 @@ olx.view;
|
||||
* maxZoom: (number|undefined),
|
||||
* minResolution: (number|undefined),
|
||||
* duration: (number|undefined),
|
||||
* easing: (undefined|function(number):number)
|
||||
* easing: (undefined|function(number):number),
|
||||
* callback: (undefined|function(boolean))
|
||||
* }}
|
||||
*/
|
||||
olx.view.FitOptions;
|
||||
@@ -7799,6 +8119,16 @@ olx.view.FitOptions.prototype.duration;
|
||||
olx.view.FitOptions.prototype.easing;
|
||||
|
||||
|
||||
/**
|
||||
* Optional function called when the view is in it's final position. The callback will be
|
||||
* called with `true` if the animation series completed on its own or `false`
|
||||
* if it was cancelled.
|
||||
* @type {undefined|function(boolean)}
|
||||
* @api
|
||||
*/
|
||||
olx.view.FitOptions.prototype.callback;
|
||||
|
||||
|
||||
/* typedefs for object literals exposed by the library */
|
||||
|
||||
|
||||
|
||||
@@ -5,7 +5,6 @@
|
||||
*/
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* @constructor
|
||||
*/
|
||||
|
||||
76
package.json
76
package.json
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "openlayers",
|
||||
"version": "4.1.1",
|
||||
"version": "4.3.0-beta.3",
|
||||
"description": "Build tools and sources for developing OpenLayers based mapping applications",
|
||||
"keywords": [
|
||||
"map",
|
||||
@@ -13,6 +13,7 @@
|
||||
"postinstall": "closure-util update",
|
||||
"start": "node tasks/serve.js",
|
||||
"pretest": "eslint tasks test test_rendering src examples",
|
||||
"lint-package": "eslint --fix build/package",
|
||||
"test": "node tasks/test.js",
|
||||
"debug-server": "node tasks/serve-lib.js"
|
||||
},
|
||||
@@ -30,45 +31,47 @@
|
||||
"css/ol.css"
|
||||
],
|
||||
"dependencies": {
|
||||
"async": "2.3.0",
|
||||
"browserify": "14.3.0",
|
||||
"closure-util": "1.18.0",
|
||||
"derequire": "2.0.6",
|
||||
"fs-extra": "2.1.2",
|
||||
"glob": "7.1.1",
|
||||
"handlebars": "4.0.6",
|
||||
"jsdoc": "3.4.3",
|
||||
"marked": "0.3.6",
|
||||
"metalsmith": "2.3.0",
|
||||
"metalsmith-layouts": "1.8.0",
|
||||
"async": "2.5.0",
|
||||
"closure-util": "1.22.0",
|
||||
"fs-extra": "4.0.1",
|
||||
"jsdoc": "3.5.4",
|
||||
"nomnom": "1.8.1",
|
||||
"pbf": "3.0.5",
|
||||
"pixelworks": "1.1.0",
|
||||
"rbush": "2.0.1",
|
||||
"rollup": "^0.45.0",
|
||||
"rollup-plugin-cleanup": "^1.0.0",
|
||||
"rollup-plugin-commonjs": "^8.0.2",
|
||||
"rollup-plugin-node-resolve": "^3.0.0",
|
||||
"temp": "0.8.3",
|
||||
"vector-tile": "1.3.0",
|
||||
"@mapbox/vector-tile": "1.3.0",
|
||||
"walk": "2.3.9"
|
||||
},
|
||||
"devDependencies": {
|
||||
"clean-css-cli": "4.0.12",
|
||||
"coveralls": "2.13.0",
|
||||
"clean-css-cli": "4.1.6",
|
||||
"coveralls": "2.13.1",
|
||||
"debounce": "^1.0.0",
|
||||
"eslint": "3.18.0",
|
||||
"eslint": "4.4.1",
|
||||
"eslint-config-openlayers": "7.0.0",
|
||||
"eslint-plugin-openlayers-internal": "^3.1.0",
|
||||
"expect.js": "0.3.1",
|
||||
"gaze": "^1.0.0",
|
||||
"glob": "7.1.1",
|
||||
"handlebars": "4.0.10",
|
||||
"istanbul": "0.4.5",
|
||||
"jquery": "3.2.1",
|
||||
"jscodeshift": "^0.3.30",
|
||||
"mocha": "3.2.0",
|
||||
"marked": "0.3.6",
|
||||
"metalsmith": "2.3.0",
|
||||
"metalsmith-layouts": "1.8.1",
|
||||
"mocha": "3.5.0",
|
||||
"mocha-phantomjs-core": "^2.1.0",
|
||||
"mustache": "2.3.0",
|
||||
"phantomjs-prebuilt": "2.1.14",
|
||||
"proj4": "2.4.3",
|
||||
"resemblejs": "2.2.3",
|
||||
"resemblejs": "2.2.4",
|
||||
"serve-files": "1.0.1",
|
||||
"sinon": "2.1.0",
|
||||
"sinon": "3.1.0",
|
||||
"slimerjs": "0.10.3"
|
||||
},
|
||||
"eslintConfig": {
|
||||
@@ -91,31 +94,50 @@
|
||||
"no-constant-condition": 0,
|
||||
"openlayers-internal/enum": 2,
|
||||
"openlayers-internal/no-duplicate-requires": 2,
|
||||
"openlayers-internal/no-missing-requires": 1,
|
||||
"openlayers-internal/no-missing-requires": 2,
|
||||
"openlayers-internal/no-unused-requires": 2,
|
||||
"openlayers-internal/one-provide": 2,
|
||||
"openlayers-internal/requires-first": 2,
|
||||
"openlayers-internal/valid-provide": 2,
|
||||
"openlayers-internal/valid-requires": 2
|
||||
"openlayers-internal/valid-requires": 2,
|
||||
"indent": [
|
||||
2,
|
||||
2,
|
||||
{
|
||||
"VariableDeclarator": 2,
|
||||
"SwitchCase": 1,
|
||||
"MemberExpression": 2,
|
||||
"FunctionDeclaration": {
|
||||
"parameters": 2,
|
||||
"body": 1
|
||||
},
|
||||
"FunctionExpression": {
|
||||
"parameters": 2,
|
||||
"body": 1
|
||||
},
|
||||
"CallExpression": {
|
||||
"arguments": 2
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
"ext": [
|
||||
{
|
||||
"module": "rbush",
|
||||
"browserify": true
|
||||
"module": "rbush"
|
||||
},
|
||||
{
|
||||
"module": "pbf",
|
||||
"browserify": true
|
||||
"name": "PBF"
|
||||
},
|
||||
{
|
||||
"module": "pixelworks",
|
||||
"browserify": true
|
||||
"import": "Processor"
|
||||
},
|
||||
{
|
||||
"module": "vector-tile",
|
||||
"module": "@mapbox/vector-tile",
|
||||
"name": "vectortile",
|
||||
"browserify": true
|
||||
"import": "VectorTile"
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
5
package/.eslintrc
Normal file
5
package/.eslintrc
Normal file
@@ -0,0 +1,5 @@
|
||||
{
|
||||
"parserOptions": {
|
||||
"sourceType": "module"
|
||||
}
|
||||
}
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "ol",
|
||||
"version": "4.1.1",
|
||||
"version": "4.2.0",
|
||||
"description": "OpenLayers as ES2015 modules",
|
||||
"main": "index.js",
|
||||
"module": "index.js",
|
||||
@@ -9,7 +9,7 @@
|
||||
"pbf": "3.0.5",
|
||||
"pixelworks": "1.1.0",
|
||||
"rbush": "2.0.1",
|
||||
"vector-tile": "1.3.0"
|
||||
"@mapbox/vector-tile": "1.3.0"
|
||||
},
|
||||
"browserify": {
|
||||
"transform": [
|
||||
|
||||
@@ -9,20 +9,20 @@ goog.require('ol.math');
|
||||
*/
|
||||
ol.CenterConstraint.createExtent = function(extent) {
|
||||
return (
|
||||
/**
|
||||
* @param {ol.Coordinate|undefined} center Center.
|
||||
* @return {ol.Coordinate|undefined} Center.
|
||||
*/
|
||||
function(center) {
|
||||
if (center) {
|
||||
return [
|
||||
ol.math.clamp(center[0], extent[0], extent[2]),
|
||||
ol.math.clamp(center[1], extent[1], extent[3])
|
||||
];
|
||||
} else {
|
||||
return undefined;
|
||||
}
|
||||
});
|
||||
/**
|
||||
* @param {ol.Coordinate|undefined} center Center.
|
||||
* @return {ol.Coordinate|undefined} Center.
|
||||
*/
|
||||
function(center) {
|
||||
if (center) {
|
||||
return [
|
||||
ol.math.clamp(center[0], extent[0], extent[2]),
|
||||
ol.math.clamp(center[1], extent[1], extent[3])
|
||||
];
|
||||
} else {
|
||||
return undefined;
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
|
||||
|
||||
@@ -23,7 +23,7 @@ goog.require('ol.events.Event');
|
||||
* @constructor
|
||||
* @extends {ol.Object}
|
||||
* @fires ol.Collection.Event
|
||||
* @param {!Array.<T>=} opt_array Array.
|
||||
* @param {Array.<T>=} opt_array Array.
|
||||
* @param {olx.CollectionOptions=} opt_options Collection options.
|
||||
* @template T
|
||||
* @api
|
||||
@@ -95,7 +95,11 @@ ol.Collection.prototype.extend = function(arr) {
|
||||
* @api
|
||||
*/
|
||||
ol.Collection.prototype.forEach = function(f, opt_this) {
|
||||
this.array_.forEach(f, opt_this);
|
||||
var fn = (opt_this) ? f.bind(opt_this) : f;
|
||||
var array = this.array_;
|
||||
for (var i = 0, ii = array.length; i < ii; ++i) {
|
||||
fn(array[i], i, array);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
|
||||
@@ -72,56 +72,56 @@ ol.color.fromNamed = function(color) {
|
||||
* @return {ol.Color} Color.
|
||||
*/
|
||||
ol.color.fromString = (
|
||||
function() {
|
||||
function() {
|
||||
|
||||
// We maintain a small cache of parsed strings. To provide cheap LRU-like
|
||||
// semantics, whenever the cache grows too large we simply delete an
|
||||
// arbitrary 25% of the entries.
|
||||
// We maintain a small cache of parsed strings. To provide cheap LRU-like
|
||||
// semantics, whenever the cache grows too large we simply delete an
|
||||
// arbitrary 25% of the entries.
|
||||
|
||||
/**
|
||||
* @const
|
||||
* @type {number}
|
||||
*/
|
||||
var MAX_CACHE_SIZE = 1024;
|
||||
|
||||
/**
|
||||
* @type {Object.<string, ol.Color>}
|
||||
*/
|
||||
var cache = {};
|
||||
|
||||
/**
|
||||
* @type {number}
|
||||
*/
|
||||
var cacheSize = 0;
|
||||
|
||||
return (
|
||||
/**
|
||||
* @const
|
||||
* @type {number}
|
||||
* @param {string} s String.
|
||||
* @return {ol.Color} Color.
|
||||
*/
|
||||
var MAX_CACHE_SIZE = 1024;
|
||||
|
||||
/**
|
||||
* @type {Object.<string, ol.Color>}
|
||||
*/
|
||||
var cache = {};
|
||||
|
||||
/**
|
||||
* @type {number}
|
||||
*/
|
||||
var cacheSize = 0;
|
||||
|
||||
return (
|
||||
/**
|
||||
* @param {string} s String.
|
||||
* @return {ol.Color} Color.
|
||||
*/
|
||||
function(s) {
|
||||
var color;
|
||||
if (cache.hasOwnProperty(s)) {
|
||||
color = cache[s];
|
||||
} else {
|
||||
if (cacheSize >= MAX_CACHE_SIZE) {
|
||||
var i = 0;
|
||||
var key;
|
||||
for (key in cache) {
|
||||
if ((i++ & 3) === 0) {
|
||||
delete cache[key];
|
||||
--cacheSize;
|
||||
}
|
||||
}
|
||||
function(s) {
|
||||
var color;
|
||||
if (cache.hasOwnProperty(s)) {
|
||||
color = cache[s];
|
||||
} else {
|
||||
if (cacheSize >= MAX_CACHE_SIZE) {
|
||||
var i = 0;
|
||||
var key;
|
||||
for (key in cache) {
|
||||
if ((i++ & 3) === 0) {
|
||||
delete cache[key];
|
||||
--cacheSize;
|
||||
}
|
||||
color = ol.color.fromStringInternal_(s);
|
||||
cache[s] = color;
|
||||
++cacheSize;
|
||||
}
|
||||
return color;
|
||||
});
|
||||
}
|
||||
color = ol.color.fromStringInternal_(s);
|
||||
cache[s] = color;
|
||||
++cacheSize;
|
||||
}
|
||||
return color;
|
||||
});
|
||||
|
||||
})();
|
||||
})();
|
||||
|
||||
|
||||
/**
|
||||
|
||||
@@ -23,8 +23,8 @@ ol.colorlike.asColorLike = function(color) {
|
||||
*/
|
||||
ol.colorlike.isColorLike = function(color) {
|
||||
return (
|
||||
typeof color === 'string' ||
|
||||
color instanceof CanvasPattern ||
|
||||
color instanceof CanvasGradient
|
||||
typeof color === 'string' ||
|
||||
color instanceof CanvasPattern ||
|
||||
color instanceof CanvasGradient
|
||||
);
|
||||
};
|
||||
|
||||
@@ -1,29 +0,0 @@
|
||||
goog.provide('ol.Constraints');
|
||||
|
||||
|
||||
/**
|
||||
* @constructor
|
||||
* @param {ol.CenterConstraintType} centerConstraint Center constraint.
|
||||
* @param {ol.ResolutionConstraintType} resolutionConstraint
|
||||
* Resolution constraint.
|
||||
* @param {ol.RotationConstraintType} rotationConstraint
|
||||
* Rotation constraint.
|
||||
*/
|
||||
ol.Constraints = function(centerConstraint, resolutionConstraint, rotationConstraint) {
|
||||
|
||||
/**
|
||||
* @type {ol.CenterConstraintType}
|
||||
*/
|
||||
this.center = centerConstraint;
|
||||
|
||||
/**
|
||||
* @type {ol.ResolutionConstraintType}
|
||||
*/
|
||||
this.resolution = resolutionConstraint;
|
||||
|
||||
/**
|
||||
* @type {ol.RotationConstraintType}
|
||||
*/
|
||||
this.rotation = rotationConstraint;
|
||||
|
||||
};
|
||||
@@ -35,7 +35,7 @@ ol.control.defaults = function(opt_options) {
|
||||
}
|
||||
|
||||
var attributionControl = options.attribution !== undefined ?
|
||||
options.attribution : true;
|
||||
options.attribution : true;
|
||||
if (attributionControl) {
|
||||
controls.push(new ol.control.Attribution(options.attributionOptions));
|
||||
}
|
||||
|
||||
@@ -53,7 +53,7 @@ ol.control.Attribution = function(opt_options) {
|
||||
* @type {boolean}
|
||||
*/
|
||||
this.collapsible_ = options.collapsible !== undefined ?
|
||||
options.collapsible : true;
|
||||
options.collapsible : true;
|
||||
|
||||
if (!this.collapsible_) {
|
||||
this.collapsed_ = false;
|
||||
@@ -91,7 +91,7 @@ ol.control.Attribution = function(opt_options) {
|
||||
|
||||
|
||||
var activeLabel = (this.collapsible_ && !this.collapsed_) ?
|
||||
this.collapseLabel_ : this.label_;
|
||||
this.collapseLabel_ : this.label_;
|
||||
var button = document.createElement('button');
|
||||
button.setAttribute('type', 'button');
|
||||
button.title = tipLabel;
|
||||
|
||||
@@ -115,7 +115,7 @@ ol.control.Control.prototype.setMap = function(map) {
|
||||
this.map_ = map;
|
||||
if (this.map_) {
|
||||
var target = this.target_ ?
|
||||
this.target_ : map.getOverlayContainerStopEvent();
|
||||
this.target_ : map.getOverlayContainerStopEvent();
|
||||
target.appendChild(this.element);
|
||||
if (this.render !== ol.nullFunction) {
|
||||
this.listenerKeys.push(ol.events.listen(map,
|
||||
|
||||
@@ -12,7 +12,7 @@ goog.require('ol.events.EventType');
|
||||
* @classdesc
|
||||
* Provides a button that when clicked fills up the full screen with the map.
|
||||
* The full screen source element is by default the element containing the map viewport unless
|
||||
* overriden by providing the `source` option. In which case, the dom
|
||||
* overridden by providing the `source` option. In which case, the dom
|
||||
* element introduced using this parameter will be displayed in full screen.
|
||||
*
|
||||
* When in full screen mode, a close button is shown to exit full screen mode.
|
||||
@@ -34,7 +34,7 @@ ol.control.FullScreen = function(opt_options) {
|
||||
* @type {string}
|
||||
*/
|
||||
this.cssClassName_ = options.className !== undefined ? options.className :
|
||||
'ol-full-screen';
|
||||
'ol-full-screen';
|
||||
|
||||
var label = options.label !== undefined ? options.label : '\u2922';
|
||||
|
||||
@@ -43,7 +43,7 @@ ol.control.FullScreen = function(opt_options) {
|
||||
* @type {Node}
|
||||
*/
|
||||
this.labelNode_ = typeof label === 'string' ?
|
||||
document.createTextNode(label) : label;
|
||||
document.createTextNode(label) : label;
|
||||
|
||||
var labelActive = options.labelActive !== undefined ? options.labelActive : '\u00d7';
|
||||
|
||||
@@ -52,7 +52,7 @@ ol.control.FullScreen = function(opt_options) {
|
||||
* @type {Node}
|
||||
*/
|
||||
this.labelActiveNode_ = typeof labelActive === 'string' ?
|
||||
document.createTextNode(labelActive) : labelActive;
|
||||
document.createTextNode(labelActive) : labelActive;
|
||||
|
||||
var tipLabel = options.tipLabel ? options.tipLabel : 'Toggle full-screen';
|
||||
var button = document.createElement('button');
|
||||
|
||||
@@ -31,7 +31,7 @@ ol.control.MousePosition = function(opt_options) {
|
||||
element.className = options.className !== undefined ? options.className : 'ol-mouse-position';
|
||||
|
||||
var render = options.render ?
|
||||
options.render : ol.control.MousePosition.render;
|
||||
options.render : ol.control.MousePosition.render;
|
||||
|
||||
ol.control.Control.call(this, {
|
||||
element: element,
|
||||
@@ -47,7 +47,7 @@ ol.control.MousePosition = function(opt_options) {
|
||||
this.setCoordinateFormat(options.coordinateFormat);
|
||||
}
|
||||
if (options.projection) {
|
||||
this.setProjection(ol.proj.get(options.projection));
|
||||
this.setProjection(options.projection);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -122,7 +122,7 @@ ol.control.MousePosition.prototype.handleProjectionChanged_ = function() {
|
||||
*/
|
||||
ol.control.MousePosition.prototype.getCoordinateFormat = function() {
|
||||
return /** @type {ol.CoordinateFormatType|undefined} */ (
|
||||
this.get(ol.control.MousePosition.Property_.COORDINATE_FORMAT));
|
||||
this.get(ol.control.MousePosition.Property_.COORDINATE_FORMAT));
|
||||
};
|
||||
|
||||
|
||||
@@ -135,7 +135,7 @@ ol.control.MousePosition.prototype.getCoordinateFormat = function() {
|
||||
*/
|
||||
ol.control.MousePosition.prototype.getProjection = function() {
|
||||
return /** @type {ol.proj.Projection|undefined} */ (
|
||||
this.get(ol.control.MousePosition.Property_.PROJECTION));
|
||||
this.get(ol.control.MousePosition.Property_.PROJECTION));
|
||||
};
|
||||
|
||||
|
||||
@@ -192,13 +192,13 @@ ol.control.MousePosition.prototype.setCoordinateFormat = function(format) {
|
||||
|
||||
/**
|
||||
* Set the projection that is used to report the mouse position.
|
||||
* @param {ol.proj.Projection} projection The projection to report mouse
|
||||
* @param {ol.ProjectionLike} projection The projection to report mouse
|
||||
* position in.
|
||||
* @observable
|
||||
* @api
|
||||
*/
|
||||
ol.control.MousePosition.prototype.setProjection = function(projection) {
|
||||
this.set(ol.control.MousePosition.Property_.PROJECTION, projection);
|
||||
this.set(ol.control.MousePosition.Property_.PROJECTION, ol.proj.get(projection));
|
||||
};
|
||||
|
||||
|
||||
|
||||
@@ -42,7 +42,7 @@ ol.control.OverviewMap = function(opt_options) {
|
||||
* @type {boolean}
|
||||
*/
|
||||
this.collapsible_ = options.collapsible !== undefined ?
|
||||
options.collapsible : true;
|
||||
options.collapsible : true;
|
||||
|
||||
if (!this.collapsible_) {
|
||||
this.collapsed_ = false;
|
||||
@@ -80,7 +80,7 @@ ol.control.OverviewMap = function(opt_options) {
|
||||
}
|
||||
|
||||
var activeLabel = (this.collapsible_ && !this.collapsed_) ?
|
||||
this.collapseLabel_ : this.label_;
|
||||
this.collapseLabel_ : this.label_;
|
||||
var button = document.createElement('button');
|
||||
button.setAttribute('type', 'button');
|
||||
button.title = tipLabel;
|
||||
|
||||
@@ -112,7 +112,7 @@ ol.control.ScaleLine.LEADING_DIGITS = [1, 2, 5];
|
||||
*/
|
||||
ol.control.ScaleLine.prototype.getUnits = function() {
|
||||
return /** @type {ol.control.ScaleLineUnits|undefined} */ (
|
||||
this.get(ol.control.ScaleLine.Property_.UNITS));
|
||||
this.get(ol.control.ScaleLine.Property_.UNITS));
|
||||
};
|
||||
|
||||
|
||||
@@ -168,17 +168,22 @@ ol.control.ScaleLine.prototype.updateElement_ = function() {
|
||||
|
||||
var center = viewState.center;
|
||||
var projection = viewState.projection;
|
||||
var metersPerUnit = projection.getMetersPerUnit();
|
||||
var units = this.getUnits();
|
||||
var pointResolutionUnits = units == ol.control.ScaleLineUnits.DEGREES ?
|
||||
ol.proj.Units.DEGREES :
|
||||
ol.proj.Units.METERS;
|
||||
var pointResolution =
|
||||
ol.proj.getPointResolution(projection, viewState.resolution, center) *
|
||||
metersPerUnit;
|
||||
ol.proj.getPointResolution(projection, viewState.resolution, center, pointResolutionUnits);
|
||||
|
||||
var nominalCount = this.minWidth_ * pointResolution;
|
||||
var suffix = '';
|
||||
var units = this.getUnits();
|
||||
if (units == ol.control.ScaleLineUnits.DEGREES) {
|
||||
var metersPerDegree = ol.proj.METERS_PER_UNIT[ol.proj.Units.DEGREES];
|
||||
pointResolution /= metersPerDegree;
|
||||
if (projection.getUnits() == ol.proj.Units.DEGREES) {
|
||||
nominalCount *= metersPerDegree;
|
||||
} else {
|
||||
pointResolution /= metersPerDegree;
|
||||
}
|
||||
if (nominalCount < metersPerDegree / 60) {
|
||||
suffix = '\u2033'; // seconds
|
||||
pointResolution *= 3600;
|
||||
|
||||
@@ -31,16 +31,16 @@ ol.control.Zoom = function(opt_options) {
|
||||
var zoomOutLabel = options.zoomOutLabel !== undefined ? options.zoomOutLabel : '\u2212';
|
||||
|
||||
var zoomInTipLabel = options.zoomInTipLabel !== undefined ?
|
||||
options.zoomInTipLabel : 'Zoom in';
|
||||
options.zoomInTipLabel : 'Zoom in';
|
||||
var zoomOutTipLabel = options.zoomOutTipLabel !== undefined ?
|
||||
options.zoomOutTipLabel : 'Zoom out';
|
||||
options.zoomOutTipLabel : 'Zoom out';
|
||||
|
||||
var inElement = document.createElement('button');
|
||||
inElement.className = className + '-in';
|
||||
inElement.setAttribute('type', 'button');
|
||||
inElement.title = zoomInTipLabel;
|
||||
inElement.appendChild(
|
||||
typeof zoomInLabel === 'string' ? document.createTextNode(zoomInLabel) : zoomInLabel
|
||||
typeof zoomInLabel === 'string' ? document.createTextNode(zoomInLabel) : zoomInLabel
|
||||
);
|
||||
|
||||
ol.events.listen(inElement, ol.events.EventType.CLICK,
|
||||
@@ -51,7 +51,7 @@ ol.control.Zoom = function(opt_options) {
|
||||
outElement.setAttribute('type', 'button');
|
||||
outElement.title = zoomOutTipLabel;
|
||||
outElement.appendChild(
|
||||
typeof zoomOutLabel === 'string' ? document.createTextNode(zoomOutLabel) : zoomOutLabel
|
||||
typeof zoomOutLabel === 'string' ? document.createTextNode(zoomOutLabel) : zoomOutLabel
|
||||
);
|
||||
|
||||
ol.events.listen(outElement, ol.events.EventType.CLICK,
|
||||
|
||||
@@ -27,16 +27,16 @@ ol.control.ZoomToExtent = function(opt_options) {
|
||||
this.extent_ = options.extent ? options.extent : null;
|
||||
|
||||
var className = options.className !== undefined ? options.className :
|
||||
'ol-zoom-extent';
|
||||
'ol-zoom-extent';
|
||||
|
||||
var label = options.label !== undefined ? options.label : 'E';
|
||||
var tipLabel = options.tipLabel !== undefined ?
|
||||
options.tipLabel : 'Fit to extent';
|
||||
options.tipLabel : 'Fit to extent';
|
||||
var button = document.createElement('button');
|
||||
button.setAttribute('type', 'button');
|
||||
button.title = tipLabel;
|
||||
button.appendChild(
|
||||
typeof label === 'string' ? document.createTextNode(label) : label
|
||||
typeof label === 'string' ? document.createTextNode(label) : label
|
||||
);
|
||||
|
||||
ol.events.listen(button, ol.events.EventType.CLICK,
|
||||
|
||||
@@ -26,6 +26,37 @@ ol.coordinate.add = function(coordinate, delta) {
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* Calculates the point closest to the passed coordinate on the passed circle.
|
||||
*
|
||||
* @param {ol.Coordinate} coordinate The coordinate.
|
||||
* @param {ol.geom.Circle} circle The circle.
|
||||
* @return {ol.Coordinate} Closest point on the circumference
|
||||
*/
|
||||
ol.coordinate.closestOnCircle = function(coordinate, circle) {
|
||||
var r = circle.getRadius();
|
||||
var center = circle.getCenter();
|
||||
var x0 = center[0];
|
||||
var y0 = center[1];
|
||||
var x1 = coordinate[0];
|
||||
var y1 = coordinate[1];
|
||||
|
||||
var dx = x1 - x0;
|
||||
var dy = y1 - y0;
|
||||
if (dx === 0 && dy === 0) {
|
||||
dx = 1;
|
||||
}
|
||||
var d = Math.sqrt(dx * dx + dy * dy);
|
||||
|
||||
var x, y;
|
||||
|
||||
x = x0 + r * dx / d;
|
||||
y = y0 + r * dy / d;
|
||||
|
||||
return [x, y];
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* Calculates the point closest to the passed coordinate on the passed segment.
|
||||
* This is the foot of the perpendicular of the coordinate to the segment when
|
||||
@@ -49,7 +80,7 @@ ol.coordinate.closestOnSegment = function(coordinate, segment) {
|
||||
var dx = x2 - x1;
|
||||
var dy = y2 - y1;
|
||||
var along = (dx === 0 && dy === 0) ? 0 :
|
||||
((dx * (x0 - x1)) + (dy * (y0 - y1))) / ((dx * dx + dy * dy) || 0);
|
||||
((dx * (x0 - x1)) + (dy * (y0 - y1))) / ((dx * dx + dy * dy) || 0);
|
||||
var x, y;
|
||||
if (along <= 0) {
|
||||
x = x1;
|
||||
@@ -90,25 +121,24 @@ ol.coordinate.closestOnSegment = function(coordinate, segment) {
|
||||
*/
|
||||
ol.coordinate.createStringXY = function(opt_fractionDigits) {
|
||||
return (
|
||||
/**
|
||||
* @param {ol.Coordinate|undefined} coordinate Coordinate.
|
||||
* @return {string} String XY.
|
||||
*/
|
||||
function(coordinate) {
|
||||
return ol.coordinate.toStringXY(coordinate, opt_fractionDigits);
|
||||
});
|
||||
/**
|
||||
* @param {ol.Coordinate|undefined} coordinate Coordinate.
|
||||
* @return {string} String XY.
|
||||
*/
|
||||
function(coordinate) {
|
||||
return ol.coordinate.toStringXY(coordinate, opt_fractionDigits);
|
||||
});
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* @private
|
||||
* @param {number} degrees Degrees.
|
||||
* @param {string} hemispheres Hemispheres.
|
||||
* @param {number} degrees Degrees.
|
||||
* @param {number=} opt_fractionDigits The number of digits to include
|
||||
* after the decimal point. Default is `0`.
|
||||
* @return {string} String.
|
||||
*/
|
||||
ol.coordinate.degreesToStringHDMS_ = function(degrees, hemispheres, opt_fractionDigits) {
|
||||
ol.coordinate.degreesToStringHDMS = function(hemispheres, degrees, opt_fractionDigits) {
|
||||
var normalizedDegrees = ol.math.modulo(degrees + 180, 360) - 180;
|
||||
var x = Math.abs(3600 * normalizedDegrees);
|
||||
var dflPrecision = opt_fractionDigits || 0;
|
||||
@@ -130,8 +160,8 @@ ol.coordinate.degreesToStringHDMS_ = function(degrees, hemispheres, opt_fraction
|
||||
}
|
||||
|
||||
return deg + '\u00b0 ' + ol.string.padNumber(min, 2) + '\u2032 ' +
|
||||
ol.string.padNumber(sec, 2, dflPrecision) + '\u2033 ' +
|
||||
hemispheres.charAt(normalizedDegrees < 0 ? 1 : 0);
|
||||
ol.string.padNumber(sec, 2, dflPrecision) + '\u2033' +
|
||||
(normalizedDegrees == 0 ? '' : ' ' + hemispheres.charAt(normalizedDegrees < 0 ? 1 : 0));
|
||||
};
|
||||
|
||||
|
||||
@@ -165,8 +195,8 @@ ol.coordinate.degreesToStringHDMS_ = function(degrees, hemispheres, opt_fraction
|
||||
ol.coordinate.format = function(coordinate, template, opt_fractionDigits) {
|
||||
if (coordinate) {
|
||||
return template
|
||||
.replace('{x}', coordinate[0].toFixed(opt_fractionDigits))
|
||||
.replace('{y}', coordinate[1].toFixed(opt_fractionDigits));
|
||||
.replace('{x}', coordinate[0].toFixed(opt_fractionDigits))
|
||||
.replace('{y}', coordinate[1].toFixed(opt_fractionDigits));
|
||||
} else {
|
||||
return '';
|
||||
}
|
||||
@@ -313,8 +343,8 @@ ol.coordinate.squaredDistanceToSegment = function(coordinate, segment) {
|
||||
*/
|
||||
ol.coordinate.toStringHDMS = function(coordinate, opt_fractionDigits) {
|
||||
if (coordinate) {
|
||||
return ol.coordinate.degreesToStringHDMS_(coordinate[1], 'NS', opt_fractionDigits) + ' ' +
|
||||
ol.coordinate.degreesToStringHDMS_(coordinate[0], 'EW', opt_fractionDigits);
|
||||
return ol.coordinate.degreesToStringHDMS('NS', coordinate[1], opt_fractionDigits) + ' ' +
|
||||
ol.coordinate.degreesToStringHDMS('EW', coordinate[0], opt_fractionDigits);
|
||||
} else {
|
||||
return '';
|
||||
}
|
||||
|
||||
@@ -132,7 +132,7 @@ ol.DeviceOrientation.prototype.orientationChange_ = function(originalEvent) {
|
||||
*/
|
||||
ol.DeviceOrientation.prototype.getAlpha = function() {
|
||||
return /** @type {number|undefined} */ (
|
||||
this.get(ol.DeviceOrientation.Property_.ALPHA));
|
||||
this.get(ol.DeviceOrientation.Property_.ALPHA));
|
||||
};
|
||||
|
||||
|
||||
@@ -145,7 +145,7 @@ ol.DeviceOrientation.prototype.getAlpha = function() {
|
||||
*/
|
||||
ol.DeviceOrientation.prototype.getBeta = function() {
|
||||
return /** @type {number|undefined} */ (
|
||||
this.get(ol.DeviceOrientation.Property_.BETA));
|
||||
this.get(ol.DeviceOrientation.Property_.BETA));
|
||||
};
|
||||
|
||||
|
||||
@@ -158,7 +158,7 @@ ol.DeviceOrientation.prototype.getBeta = function() {
|
||||
*/
|
||||
ol.DeviceOrientation.prototype.getGamma = function() {
|
||||
return /** @type {number|undefined} */ (
|
||||
this.get(ol.DeviceOrientation.Property_.GAMMA));
|
||||
this.get(ol.DeviceOrientation.Property_.GAMMA));
|
||||
};
|
||||
|
||||
|
||||
@@ -171,7 +171,7 @@ ol.DeviceOrientation.prototype.getGamma = function() {
|
||||
*/
|
||||
ol.DeviceOrientation.prototype.getHeading = function() {
|
||||
return /** @type {number|undefined} */ (
|
||||
this.get(ol.DeviceOrientation.Property_.HEADING));
|
||||
this.get(ol.DeviceOrientation.Property_.HEADING));
|
||||
};
|
||||
|
||||
|
||||
@@ -183,7 +183,7 @@ ol.DeviceOrientation.prototype.getHeading = function() {
|
||||
*/
|
||||
ol.DeviceOrientation.prototype.getTracking = function() {
|
||||
return /** @type {boolean} */ (
|
||||
this.get(ol.DeviceOrientation.Property_.TRACKING));
|
||||
this.get(ol.DeviceOrientation.Property_.TRACKING));
|
||||
};
|
||||
|
||||
|
||||
|
||||
@@ -17,7 +17,7 @@ goog.require('ol.has');
|
||||
ol.events.condition.altKeyOnly = function(mapBrowserEvent) {
|
||||
var originalEvent = mapBrowserEvent.originalEvent;
|
||||
return (
|
||||
originalEvent.altKey &&
|
||||
originalEvent.altKey &&
|
||||
!(originalEvent.metaKey || originalEvent.ctrlKey) &&
|
||||
!originalEvent.shiftKey);
|
||||
};
|
||||
@@ -34,7 +34,7 @@ ol.events.condition.altKeyOnly = function(mapBrowserEvent) {
|
||||
ol.events.condition.altShiftKeysOnly = function(mapBrowserEvent) {
|
||||
var originalEvent = mapBrowserEvent.originalEvent;
|
||||
return (
|
||||
originalEvent.altKey &&
|
||||
originalEvent.altKey &&
|
||||
!(originalEvent.metaKey || originalEvent.ctrlKey) &&
|
||||
originalEvent.shiftKey);
|
||||
};
|
||||
@@ -138,7 +138,7 @@ ol.events.condition.doubleClick = function(mapBrowserEvent) {
|
||||
ol.events.condition.noModifierKeys = function(mapBrowserEvent) {
|
||||
var originalEvent = mapBrowserEvent.originalEvent;
|
||||
return (
|
||||
!originalEvent.altKey &&
|
||||
!originalEvent.altKey &&
|
||||
!(originalEvent.metaKey || originalEvent.ctrlKey) &&
|
||||
!originalEvent.shiftKey);
|
||||
};
|
||||
@@ -156,7 +156,7 @@ ol.events.condition.noModifierKeys = function(mapBrowserEvent) {
|
||||
ol.events.condition.platformModifierKeyOnly = function(mapBrowserEvent) {
|
||||
var originalEvent = mapBrowserEvent.originalEvent;
|
||||
return (
|
||||
!originalEvent.altKey &&
|
||||
!originalEvent.altKey &&
|
||||
(ol.has.MAC ? originalEvent.metaKey : originalEvent.ctrlKey) &&
|
||||
!originalEvent.shiftKey);
|
||||
};
|
||||
@@ -173,7 +173,7 @@ ol.events.condition.platformModifierKeyOnly = function(mapBrowserEvent) {
|
||||
ol.events.condition.shiftKeyOnly = function(mapBrowserEvent) {
|
||||
var originalEvent = mapBrowserEvent.originalEvent;
|
||||
return (
|
||||
!originalEvent.altKey &&
|
||||
!originalEvent.altKey &&
|
||||
!(originalEvent.metaKey || originalEvent.ctrlKey) &&
|
||||
originalEvent.shiftKey);
|
||||
};
|
||||
@@ -191,7 +191,7 @@ ol.events.condition.targetNotEditable = function(mapBrowserEvent) {
|
||||
var target = mapBrowserEvent.originalEvent.target;
|
||||
var tagName = target.tagName;
|
||||
return (
|
||||
tagName !== 'INPUT' &&
|
||||
tagName !== 'INPUT' &&
|
||||
tagName !== 'SELECT' &&
|
||||
tagName !== 'TEXTAREA');
|
||||
};
|
||||
|
||||
@@ -47,15 +47,15 @@ ol.events.Event = function(type) {
|
||||
*/
|
||||
ol.events.Event.prototype.preventDefault =
|
||||
|
||||
/**
|
||||
* Stop event propagation.
|
||||
* @function
|
||||
* @override
|
||||
* @api
|
||||
*/
|
||||
ol.events.Event.prototype.stopPropagation = function() {
|
||||
this.propagationStopped = true;
|
||||
};
|
||||
/**
|
||||
* Stop event propagation.
|
||||
* @function
|
||||
* @override
|
||||
* @api
|
||||
*/
|
||||
ol.events.Event.prototype.stopPropagation = function() {
|
||||
this.propagationStopped = true;
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
|
||||
@@ -131,8 +131,8 @@ ol.events.EventTarget.prototype.getListeners = function(type) {
|
||||
*/
|
||||
ol.events.EventTarget.prototype.hasListener = function(opt_type) {
|
||||
return opt_type ?
|
||||
opt_type in this.listeners_ :
|
||||
Object.keys(this.listeners_).length > 0;
|
||||
opt_type in this.listeners_ :
|
||||
Object.keys(this.listeners_).length > 0;
|
||||
};
|
||||
|
||||
|
||||
|
||||
@@ -426,8 +426,10 @@ ol.extent.forEachCorner = function(extent, callback, opt_this) {
|
||||
|
||||
|
||||
/**
|
||||
* Get the size of an extent.
|
||||
* @param {ol.Extent} extent Extent.
|
||||
* @return {number} Area.
|
||||
* @api
|
||||
*/
|
||||
ol.extent.getArea = function(extent) {
|
||||
var area = 0;
|
||||
|
||||
@@ -140,7 +140,7 @@ ol.Feature.prototype.clone = function() {
|
||||
*/
|
||||
ol.Feature.prototype.getGeometry = function() {
|
||||
return /** @type {ol.geom.Geometry|undefined} */ (
|
||||
this.get(this.geometryName_));
|
||||
this.get(this.geometryName_));
|
||||
};
|
||||
|
||||
|
||||
@@ -240,7 +240,7 @@ ol.Feature.prototype.setGeometry = function(geometry) {
|
||||
ol.Feature.prototype.setStyle = function(style) {
|
||||
this.style_ = style;
|
||||
this.styleFunction_ = !style ?
|
||||
undefined : ol.Feature.createStyleFunction(style);
|
||||
undefined : ol.Feature.createStyleFunction(style);
|
||||
this.changed();
|
||||
};
|
||||
|
||||
|
||||
@@ -8,7 +8,7 @@ goog.require('ol.xml');
|
||||
/**
|
||||
* @param {string|ol.FeatureUrlFunction} url Feature URL service.
|
||||
* @param {ol.format.Feature} format Feature format.
|
||||
* @param {function(this:ol.VectorTile, Array.<ol.Feature>, ol.proj.Projection)|function(this:ol.source.Vector, Array.<ol.Feature>)} success
|
||||
* @param {function(this:ol.VectorTile, Array.<ol.Feature>, ol.proj.Projection, ol.Extent)|function(this:ol.source.Vector, Array.<ol.Feature>)} success
|
||||
* Function called with the loaded features and optionally with the data
|
||||
* projection. Called with the vector tile or source as `this`.
|
||||
* @param {function(this:ol.VectorTile)|function(this:ol.source.Vector)} failure
|
||||
@@ -18,60 +18,60 @@ goog.require('ol.xml');
|
||||
*/
|
||||
ol.featureloader.loadFeaturesXhr = function(url, format, success, failure) {
|
||||
return (
|
||||
/**
|
||||
* @param {ol.Extent} extent Extent.
|
||||
* @param {number} resolution Resolution.
|
||||
* @param {ol.proj.Projection} projection Projection.
|
||||
* @this {ol.source.Vector|ol.VectorTile}
|
||||
*/
|
||||
function(extent, resolution, projection) {
|
||||
var xhr = new XMLHttpRequest();
|
||||
xhr.open('GET',
|
||||
typeof url === 'function' ? url(extent, resolution, projection) : url,
|
||||
true);
|
||||
if (format.getType() == ol.format.FormatType.ARRAY_BUFFER) {
|
||||
xhr.responseType = 'arraybuffer';
|
||||
}
|
||||
/**
|
||||
* @param {ol.Extent} extent Extent.
|
||||
* @param {number} resolution Resolution.
|
||||
* @param {ol.proj.Projection} projection Projection.
|
||||
* @this {ol.source.Vector|ol.VectorTile}
|
||||
* @param {Event} event Event.
|
||||
* @private
|
||||
*/
|
||||
function(extent, resolution, projection) {
|
||||
var xhr = new XMLHttpRequest();
|
||||
xhr.open('GET',
|
||||
typeof url === 'function' ? url(extent, resolution, projection) : url,
|
||||
true);
|
||||
if (format.getType() == ol.format.FormatType.ARRAY_BUFFER) {
|
||||
xhr.responseType = 'arraybuffer';
|
||||
}
|
||||
/**
|
||||
* @param {Event} event Event.
|
||||
* @private
|
||||
*/
|
||||
xhr.onload = function(event) {
|
||||
// status will be 0 for file:// urls
|
||||
if (!xhr.status || xhr.status >= 200 && xhr.status < 300) {
|
||||
var type = format.getType();
|
||||
/** @type {Document|Node|Object|string|undefined} */
|
||||
var source;
|
||||
if (type == ol.format.FormatType.JSON ||
|
||||
xhr.onload = function(event) {
|
||||
// status will be 0 for file:// urls
|
||||
if (!xhr.status || xhr.status >= 200 && xhr.status < 300) {
|
||||
var type = format.getType();
|
||||
/** @type {Document|Node|Object|string|undefined} */
|
||||
var source;
|
||||
if (type == ol.format.FormatType.JSON ||
|
||||
type == ol.format.FormatType.TEXT) {
|
||||
source = xhr.responseText;
|
||||
} else if (type == ol.format.FormatType.XML) {
|
||||
source = xhr.responseXML;
|
||||
if (!source) {
|
||||
source = ol.xml.parse(xhr.responseText);
|
||||
}
|
||||
} else if (type == ol.format.FormatType.ARRAY_BUFFER) {
|
||||
source = /** @type {ArrayBuffer} */ (xhr.response);
|
||||
}
|
||||
if (source) {
|
||||
success.call(this, format.readFeatures(source,
|
||||
{featureProjection: projection}),
|
||||
format.readProjection(source));
|
||||
} else {
|
||||
failure.call(this);
|
||||
source = xhr.responseText;
|
||||
} else if (type == ol.format.FormatType.XML) {
|
||||
source = xhr.responseXML;
|
||||
if (!source) {
|
||||
source = ol.xml.parse(xhr.responseText);
|
||||
}
|
||||
} else if (type == ol.format.FormatType.ARRAY_BUFFER) {
|
||||
source = /** @type {ArrayBuffer} */ (xhr.response);
|
||||
}
|
||||
if (source) {
|
||||
success.call(this, format.readFeatures(source,
|
||||
{featureProjection: projection}),
|
||||
format.readProjection(source), format.getLastExtent());
|
||||
} else {
|
||||
failure.call(this);
|
||||
}
|
||||
}.bind(this);
|
||||
/**
|
||||
* @private
|
||||
*/
|
||||
xhr.onerror = function() {
|
||||
} else {
|
||||
failure.call(this);
|
||||
}.bind(this);
|
||||
xhr.send();
|
||||
});
|
||||
}
|
||||
}.bind(this);
|
||||
/**
|
||||
* @private
|
||||
*/
|
||||
xhr.onerror = function() {
|
||||
failure.call(this);
|
||||
}.bind(this);
|
||||
xhr.send();
|
||||
});
|
||||
};
|
||||
|
||||
|
||||
|
||||
@@ -83,8 +83,8 @@ ol.format.EsriJSON.readGeometry_ = function(object, opt_options) {
|
||||
}
|
||||
var geometryReader = ol.format.EsriJSON.GEOMETRY_READERS_[type];
|
||||
return /** @type {ol.geom.Geometry} */ (
|
||||
ol.format.Feature.transformWithOptions(
|
||||
geometryReader(object), false, opt_options));
|
||||
ol.format.Feature.transformWithOptions(
|
||||
geometryReader(object), false, opt_options));
|
||||
};
|
||||
|
||||
|
||||
@@ -121,9 +121,11 @@ ol.format.EsriJSON.convertRings_ = function(rings, layout) {
|
||||
// loop over all outer rings and see if they contain our hole.
|
||||
for (i = outerRings.length - 1; i >= 0; i--) {
|
||||
var outerRing = outerRings[i][0];
|
||||
if (ol.extent.containsExtent(new ol.geom.LinearRing(
|
||||
outerRing).getExtent(),
|
||||
new ol.geom.LinearRing(hole).getExtent())) {
|
||||
var containsHole = ol.extent.containsExtent(
|
||||
new ol.geom.LinearRing(outerRing).getExtent(),
|
||||
new ol.geom.LinearRing(hole).getExtent()
|
||||
);
|
||||
if (containsHole) {
|
||||
// the hole is contained push it into our polygon
|
||||
outerRings[i].push(hole);
|
||||
matched = true;
|
||||
@@ -288,9 +290,9 @@ ol.format.EsriJSON.getHasZM_ = function(geometry) {
|
||||
var layout = geometry.getLayout();
|
||||
return {
|
||||
hasZ: (layout === ol.geom.GeometryLayout.XYZ ||
|
||||
layout === ol.geom.GeometryLayout.XYZM),
|
||||
layout === ol.geom.GeometryLayout.XYZM),
|
||||
hasM: (layout === ol.geom.GeometryLayout.XYM ||
|
||||
layout === ol.geom.GeometryLayout.XYZM)
|
||||
layout === ol.geom.GeometryLayout.XYZM)
|
||||
};
|
||||
};
|
||||
|
||||
@@ -302,7 +304,7 @@ ol.format.EsriJSON.getHasZM_ = function(geometry) {
|
||||
* @return {EsriJSONPolyline} EsriJSON geometry.
|
||||
*/
|
||||
ol.format.EsriJSON.writeLineStringGeometry_ = function(geometry, opt_options) {
|
||||
var hasZM = ol.format.EsriJSON.getHasZM_(/** @type {ol.geom.LineString} */ (geometry));
|
||||
var hasZM = ol.format.EsriJSON.getHasZM_(/** @type {ol.geom.LineString} */(geometry));
|
||||
return /** @type {EsriJSONPolyline} */ ({
|
||||
hasZ: hasZM.hasZ,
|
||||
hasM: hasZM.hasM,
|
||||
@@ -321,7 +323,7 @@ ol.format.EsriJSON.writeLineStringGeometry_ = function(geometry, opt_options) {
|
||||
*/
|
||||
ol.format.EsriJSON.writePolygonGeometry_ = function(geometry, opt_options) {
|
||||
// Esri geometries use the left-hand rule
|
||||
var hasZM = ol.format.EsriJSON.getHasZM_(/** @type {ol.geom.Polygon} */ (geometry));
|
||||
var hasZM = ol.format.EsriJSON.getHasZM_(/** @type {ol.geom.Polygon} */(geometry));
|
||||
return /** @type {EsriJSONPolygon} */ ({
|
||||
hasZ: hasZM.hasZ,
|
||||
hasM: hasZM.hasM,
|
||||
@@ -337,7 +339,7 @@ ol.format.EsriJSON.writePolygonGeometry_ = function(geometry, opt_options) {
|
||||
* @return {EsriJSONPolyline} EsriJSON geometry.
|
||||
*/
|
||||
ol.format.EsriJSON.writeMultiLineStringGeometry_ = function(geometry, opt_options) {
|
||||
var hasZM = ol.format.EsriJSON.getHasZM_(/** @type {ol.geom.MultiLineString} */ (geometry));
|
||||
var hasZM = ol.format.EsriJSON.getHasZM_(/** @type {ol.geom.MultiLineString} */(geometry));
|
||||
return /** @type {EsriJSONPolyline} */ ({
|
||||
hasZ: hasZM.hasZ,
|
||||
hasM: hasZM.hasM,
|
||||
@@ -353,7 +355,7 @@ ol.format.EsriJSON.writeMultiLineStringGeometry_ = function(geometry, opt_option
|
||||
* @return {EsriJSONMultipoint} EsriJSON geometry.
|
||||
*/
|
||||
ol.format.EsriJSON.writeMultiPointGeometry_ = function(geometry, opt_options) {
|
||||
var hasZM = ol.format.EsriJSON.getHasZM_(/** @type {ol.geom.MultiPoint} */ (geometry));
|
||||
var hasZM = ol.format.EsriJSON.getHasZM_(/** @type {ol.geom.MultiPoint} */(geometry));
|
||||
return /** @type {EsriJSONMultipoint} */ ({
|
||||
hasZ: hasZM.hasZ,
|
||||
hasM: hasZM.hasM,
|
||||
@@ -370,7 +372,7 @@ ol.format.EsriJSON.writeMultiPointGeometry_ = function(geometry, opt_options) {
|
||||
*/
|
||||
ol.format.EsriJSON.writeMultiPolygonGeometry_ = function(geometry,
|
||||
opt_options) {
|
||||
var hasZM = ol.format.EsriJSON.getHasZM_(/** @type {ol.geom.MultiPolygon} */ (geometry));
|
||||
var hasZM = ol.format.EsriJSON.getHasZM_(/** @type {ol.geom.MultiPolygon} */(geometry));
|
||||
var coordinates = /** @type {ol.geom.MultiPolygon} */ (geometry).getCoordinates(false);
|
||||
var output = [];
|
||||
for (var i = 0; i < coordinates.length; i++) {
|
||||
@@ -393,17 +395,17 @@ ol.format.EsriJSON.writeMultiPolygonGeometry_ = function(geometry,
|
||||
*/
|
||||
ol.format.EsriJSON.GEOMETRY_READERS_ = {};
|
||||
ol.format.EsriJSON.GEOMETRY_READERS_[ol.geom.GeometryType.POINT] =
|
||||
ol.format.EsriJSON.readPointGeometry_;
|
||||
ol.format.EsriJSON.readPointGeometry_;
|
||||
ol.format.EsriJSON.GEOMETRY_READERS_[ol.geom.GeometryType.LINE_STRING] =
|
||||
ol.format.EsriJSON.readLineStringGeometry_;
|
||||
ol.format.EsriJSON.readLineStringGeometry_;
|
||||
ol.format.EsriJSON.GEOMETRY_READERS_[ol.geom.GeometryType.POLYGON] =
|
||||
ol.format.EsriJSON.readPolygonGeometry_;
|
||||
ol.format.EsriJSON.readPolygonGeometry_;
|
||||
ol.format.EsriJSON.GEOMETRY_READERS_[ol.geom.GeometryType.MULTI_POINT] =
|
||||
ol.format.EsriJSON.readMultiPointGeometry_;
|
||||
ol.format.EsriJSON.readMultiPointGeometry_;
|
||||
ol.format.EsriJSON.GEOMETRY_READERS_[ol.geom.GeometryType.MULTI_LINE_STRING] =
|
||||
ol.format.EsriJSON.readMultiLineStringGeometry_;
|
||||
ol.format.EsriJSON.readMultiLineStringGeometry_;
|
||||
ol.format.EsriJSON.GEOMETRY_READERS_[ol.geom.GeometryType.MULTI_POLYGON] =
|
||||
ol.format.EsriJSON.readMultiPolygonGeometry_;
|
||||
ol.format.EsriJSON.readMultiPolygonGeometry_;
|
||||
|
||||
|
||||
/**
|
||||
@@ -413,17 +415,17 @@ ol.format.EsriJSON.GEOMETRY_READERS_[ol.geom.GeometryType.MULTI_POLYGON] =
|
||||
*/
|
||||
ol.format.EsriJSON.GEOMETRY_WRITERS_ = {};
|
||||
ol.format.EsriJSON.GEOMETRY_WRITERS_[ol.geom.GeometryType.POINT] =
|
||||
ol.format.EsriJSON.writePointGeometry_;
|
||||
ol.format.EsriJSON.writePointGeometry_;
|
||||
ol.format.EsriJSON.GEOMETRY_WRITERS_[ol.geom.GeometryType.LINE_STRING] =
|
||||
ol.format.EsriJSON.writeLineStringGeometry_;
|
||||
ol.format.EsriJSON.writeLineStringGeometry_;
|
||||
ol.format.EsriJSON.GEOMETRY_WRITERS_[ol.geom.GeometryType.POLYGON] =
|
||||
ol.format.EsriJSON.writePolygonGeometry_;
|
||||
ol.format.EsriJSON.writePolygonGeometry_;
|
||||
ol.format.EsriJSON.GEOMETRY_WRITERS_[ol.geom.GeometryType.MULTI_POINT] =
|
||||
ol.format.EsriJSON.writeMultiPointGeometry_;
|
||||
ol.format.EsriJSON.writeMultiPointGeometry_;
|
||||
ol.format.EsriJSON.GEOMETRY_WRITERS_[ol.geom.GeometryType.MULTI_LINE_STRING] =
|
||||
ol.format.EsriJSON.writeMultiLineStringGeometry_;
|
||||
ol.format.EsriJSON.writeMultiLineStringGeometry_;
|
||||
ol.format.EsriJSON.GEOMETRY_WRITERS_[ol.geom.GeometryType.MULTI_POLYGON] =
|
||||
ol.format.EsriJSON.writeMultiPolygonGeometry_;
|
||||
ol.format.EsriJSON.writeMultiPolygonGeometry_;
|
||||
|
||||
|
||||
/**
|
||||
@@ -466,9 +468,9 @@ ol.format.EsriJSON.prototype.readFeatureFromObject = function(
|
||||
}
|
||||
feature.setGeometry(geometry);
|
||||
if (opt_options && opt_options.idField &&
|
||||
esriJSONFeature.attributes[opt_options.idField]) {
|
||||
esriJSONFeature.attributes[opt_options.idField]) {
|
||||
feature.setId(/** @type {number} */(
|
||||
esriJSONFeature.attributes[opt_options.idField]));
|
||||
esriJSONFeature.attributes[opt_options.idField]));
|
||||
}
|
||||
if (esriJSONFeature.attributes) {
|
||||
feature.setProperties(esriJSONFeature.attributes);
|
||||
@@ -486,7 +488,7 @@ ol.format.EsriJSON.prototype.readFeaturesFromObject = function(
|
||||
var options = opt_options ? opt_options : {};
|
||||
if (esriJSONObject.features) {
|
||||
var esriJSONFeatureCollection = /** @type {EsriJSONFeatureCollection} */
|
||||
(object);
|
||||
(object);
|
||||
/** @type {Array.<ol.Feature>} */
|
||||
var features = [];
|
||||
var esriJSONFeatures = esriJSONFeatureCollection.features;
|
||||
@@ -521,7 +523,7 @@ ol.format.EsriJSON.prototype.readGeometry;
|
||||
ol.format.EsriJSON.prototype.readGeometryFromObject = function(
|
||||
object, opt_options) {
|
||||
return ol.format.EsriJSON.readGeometry_(
|
||||
/** @type {EsriJSONGeometry} */ (object), opt_options);
|
||||
/** @type {EsriJSONGeometry} */(object), opt_options);
|
||||
};
|
||||
|
||||
|
||||
@@ -558,9 +560,9 @@ ol.format.EsriJSON.prototype.readProjectionFromObject = function(object) {
|
||||
*/
|
||||
ol.format.EsriJSON.writeGeometry_ = function(geometry, opt_options) {
|
||||
var geometryWriter = ol.format.EsriJSON.GEOMETRY_WRITERS_[geometry.getType()];
|
||||
return geometryWriter(/** @type {ol.geom.Geometry} */ (
|
||||
ol.format.Feature.transformWithOptions(geometry, true, opt_options)),
|
||||
opt_options);
|
||||
return geometryWriter(/** @type {ol.geom.Geometry} */(
|
||||
ol.format.Feature.transformWithOptions(geometry, true, opt_options)),
|
||||
opt_options);
|
||||
};
|
||||
|
||||
|
||||
@@ -620,7 +622,13 @@ ol.format.EsriJSON.prototype.writeFeatureObject = function(
|
||||
var geometry = feature.getGeometry();
|
||||
if (geometry) {
|
||||
object['geometry'] =
|
||||
ol.format.EsriJSON.writeGeometry_(geometry, opt_options);
|
||||
ol.format.EsriJSON.writeGeometry_(geometry, opt_options);
|
||||
if (opt_options && opt_options.featureProjection) {
|
||||
object['geometry']['spatialReference'] = /** @type {EsriJSONCRS} */({
|
||||
wkid: ol.proj.get(
|
||||
opt_options.featureProjection).getCode().split(':').pop()
|
||||
});
|
||||
}
|
||||
}
|
||||
var properties = feature.getProperties();
|
||||
delete properties[feature.getGeometryName()];
|
||||
@@ -629,12 +637,6 @@ ol.format.EsriJSON.prototype.writeFeatureObject = function(
|
||||
} else {
|
||||
object['attributes'] = {};
|
||||
}
|
||||
if (opt_options && opt_options.featureProjection) {
|
||||
object['spatialReference'] = /** @type {EsriJSONCRS} */({
|
||||
wkid: ol.proj.get(
|
||||
opt_options.featureProjection).getCode().split(':').pop()
|
||||
});
|
||||
}
|
||||
return object;
|
||||
};
|
||||
|
||||
|
||||
@@ -47,7 +47,7 @@ ol.format.Feature.prototype.getReadOptions = function(source, opt_options) {
|
||||
if (opt_options) {
|
||||
options = {
|
||||
dataProjection: opt_options.dataProjection ?
|
||||
opt_options.dataProjection : this.readProjection(source),
|
||||
opt_options.dataProjection : this.readProjection(source),
|
||||
featureProjection: opt_options.featureProjection
|
||||
};
|
||||
}
|
||||
@@ -72,6 +72,15 @@ ol.format.Feature.prototype.adaptOptions = function(options) {
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* Get the extent from the source of the last {@link readFeatures} call.
|
||||
* @return {ol.Extent} Tile extent.
|
||||
*/
|
||||
ol.format.Feature.prototype.getLastExtent = function() {
|
||||
return null;
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* @abstract
|
||||
* @return {ol.format.FormatType} Format.
|
||||
@@ -166,9 +175,9 @@ ol.format.Feature.prototype.writeGeometry = function(geometry, opt_options) {};
|
||||
ol.format.Feature.transformWithOptions = function(
|
||||
geometry, write, opt_options) {
|
||||
var featureProjection = opt_options ?
|
||||
ol.proj.get(opt_options.featureProjection) : null;
|
||||
ol.proj.get(opt_options.featureProjection) : null;
|
||||
var dataProjection = opt_options ?
|
||||
ol.proj.get(opt_options.dataProjection) : null;
|
||||
ol.proj.get(opt_options.dataProjection) : null;
|
||||
/**
|
||||
* @type {ol.geom.Geometry|ol.Extent}
|
||||
*/
|
||||
@@ -183,14 +192,14 @@ ol.format.Feature.transformWithOptions = function(
|
||||
// FIXME this is necessary because ol.format.GML treats extents
|
||||
// as geometries
|
||||
transformed = ol.proj.transformExtent(
|
||||
write ? geometry.slice() : geometry,
|
||||
write ? featureProjection : dataProjection,
|
||||
write ? dataProjection : featureProjection);
|
||||
geometry,
|
||||
dataProjection,
|
||||
featureProjection);
|
||||
}
|
||||
} else {
|
||||
transformed = geometry;
|
||||
}
|
||||
if (write && opt_options && opt_options.decimals) {
|
||||
if (write && opt_options && opt_options.decimals !== undefined) {
|
||||
var power = Math.pow(10, opt_options.decimals);
|
||||
// if decimals option on write, round each coordinate appropriately
|
||||
/**
|
||||
@@ -203,11 +212,10 @@ ol.format.Feature.transformWithOptions = function(
|
||||
}
|
||||
return coordinates;
|
||||
};
|
||||
if (Array.isArray(transformed)) {
|
||||
transform(transformed);
|
||||
} else {
|
||||
transformed.applyTransform(transform);
|
||||
if (transformed === geometry) {
|
||||
transformed = transformed.clone();
|
||||
}
|
||||
transformed.applyTransform(transform);
|
||||
}
|
||||
return transformed;
|
||||
};
|
||||
|
||||
@@ -2,6 +2,7 @@ goog.provide('ol.format.filter');
|
||||
|
||||
goog.require('ol.format.filter.And');
|
||||
goog.require('ol.format.filter.Bbox');
|
||||
goog.require('ol.format.filter.During');
|
||||
goog.require('ol.format.filter.EqualTo');
|
||||
goog.require('ol.format.filter.GreaterThan');
|
||||
goog.require('ol.format.filter.GreaterThanOrEqualTo');
|
||||
@@ -228,5 +229,19 @@ ol.format.filter.between = function(propertyName, lowerBoundary, upperBoundary)
|
||||
ol.format.filter.like = function(propertyName, pattern,
|
||||
opt_wildCard, opt_singleChar, opt_escapeChar, opt_matchCase) {
|
||||
return new ol.format.filter.IsLike(propertyName, pattern,
|
||||
opt_wildCard, opt_singleChar, opt_escapeChar, opt_matchCase);
|
||||
opt_wildCard, opt_singleChar, opt_escapeChar, opt_matchCase);
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* Create a `<During>` temporal operator.
|
||||
*
|
||||
* @param {!string} propertyName Name of the context property to compare.
|
||||
* @param {!string} begin The begin date in ISO-8601 format.
|
||||
* @param {!string} end The end date in ISO-8601 format.
|
||||
* @returns {!ol.format.filter.During} `<During>` operator.
|
||||
* @api
|
||||
*/
|
||||
ol.format.filter.during = function(propertyName, begin, end) {
|
||||
return new ol.format.filter.During(propertyName, begin, end);
|
||||
};
|
||||
|
||||
33
src/ol/format/filter/during.js
Normal file
33
src/ol/format/filter/during.js
Normal file
@@ -0,0 +1,33 @@
|
||||
goog.provide('ol.format.filter.During');
|
||||
|
||||
goog.require('ol');
|
||||
goog.require('ol.format.filter.Comparison');
|
||||
|
||||
|
||||
/**
|
||||
* @classdesc
|
||||
* Represents a `<During>` comparison operator.
|
||||
*
|
||||
* @constructor
|
||||
* @param {!string} propertyName Name of the context property to compare.
|
||||
* @param {!string} begin The begin date in ISO-8601 format.
|
||||
* @param {!string} end The end date in ISO-8601 format.
|
||||
* @extends {ol.format.filter.Comparison}
|
||||
* @api
|
||||
*/
|
||||
ol.format.filter.During = function(propertyName, begin, end) {
|
||||
ol.format.filter.Comparison.call(this, 'During', propertyName);
|
||||
|
||||
/**
|
||||
* @public
|
||||
* @type {!string}
|
||||
*/
|
||||
this.begin = begin;
|
||||
|
||||
/**
|
||||
* @public
|
||||
* @type {!string}
|
||||
*/
|
||||
this.end = end;
|
||||
};
|
||||
ol.inherits(ol.format.filter.During, ol.format.filter.Comparison);
|
||||
@@ -39,7 +39,7 @@ ol.format.GeoJSON = function(opt_options) {
|
||||
*/
|
||||
this.defaultDataProjection = ol.proj.get(
|
||||
options.defaultDataProjection ?
|
||||
options.defaultDataProjection : 'EPSG:4326');
|
||||
options.defaultDataProjection : 'EPSG:4326');
|
||||
|
||||
|
||||
if (options.featureProjection) {
|
||||
@@ -69,8 +69,8 @@ ol.format.GeoJSON.readGeometry_ = function(object, opt_options) {
|
||||
}
|
||||
var geometryReader = ol.format.GeoJSON.GEOMETRY_READERS_[object.type];
|
||||
return /** @type {ol.geom.Geometry} */ (
|
||||
ol.format.Feature.transformWithOptions(
|
||||
geometryReader(object), false, opt_options));
|
||||
ol.format.Feature.transformWithOptions(
|
||||
geometryReader(object), false, opt_options));
|
||||
};
|
||||
|
||||
|
||||
@@ -163,8 +163,8 @@ ol.format.GeoJSON.readPolygonGeometry_ = function(object) {
|
||||
ol.format.GeoJSON.writeGeometry_ = function(geometry, opt_options) {
|
||||
var geometryWriter = ol.format.GeoJSON.GEOMETRY_WRITERS_[geometry.getType()];
|
||||
return geometryWriter(/** @type {ol.geom.Geometry} */ (
|
||||
ol.format.Feature.transformWithOptions(geometry, true, opt_options)),
|
||||
opt_options);
|
||||
ol.format.Feature.transformWithOptions(geometry, true, opt_options)),
|
||||
opt_options);
|
||||
};
|
||||
|
||||
|
||||
@@ -329,7 +329,8 @@ ol.format.GeoJSON.GEOMETRY_WRITERS_ = {
|
||||
/**
|
||||
* Read a feature from a GeoJSON Feature source. Only works for Feature or
|
||||
* geometry types. Use {@link ol.format.GeoJSON#readFeatures} to read
|
||||
* FeatureCollection source.
|
||||
* FeatureCollection source. If feature at source has an id, it will be used
|
||||
* as Feature id by calling {@link ol.Feature#setId} internally.
|
||||
*
|
||||
* @function
|
||||
* @param {Document|Node|Object|string} source Source.
|
||||
|
||||
@@ -35,7 +35,7 @@ ol.format.GML2 = function(opt_options) {
|
||||
* @inheritDoc
|
||||
*/
|
||||
this.schemaLocation = options.schemaLocation ?
|
||||
options.schemaLocation : ol.format.GML2.schemaLocation_;
|
||||
options.schemaLocation : ol.format.GML2.schemaLocation_;
|
||||
|
||||
};
|
||||
ol.inherits(ol.format.GML2, ol.format.GMLBase);
|
||||
@@ -353,6 +353,7 @@ ol.format.GML2.prototype.createCoordinatesNode_ = function(namespaceURI) {
|
||||
*/
|
||||
ol.format.GML2.prototype.writeCoordinates_ = function(node, value, objectStack) {
|
||||
var context = objectStack[objectStack.length - 1];
|
||||
var hasZ = context['hasZ'];
|
||||
var srsName = context['srsName'];
|
||||
// only 2d for simple features profile
|
||||
var points = value.getCoordinates();
|
||||
@@ -361,7 +362,7 @@ ol.format.GML2.prototype.writeCoordinates_ = function(node, value, objectStack)
|
||||
var point;
|
||||
for (var i = 0; i < len; ++i) {
|
||||
point = points[i];
|
||||
parts[i] = this.getCoords_(point, srsName);
|
||||
parts[i] = this.getCoords_(point, srsName, hasZ);
|
||||
}
|
||||
ol.format.XSD.writeStringTextNode(node, parts.join(' '));
|
||||
};
|
||||
@@ -389,6 +390,7 @@ ol.format.GML2.prototype.writeCurveSegments_ = function(node, line, objectStack)
|
||||
*/
|
||||
ol.format.GML2.prototype.writeSurfaceOrPolygon_ = function(node, geometry, objectStack) {
|
||||
var context = objectStack[objectStack.length - 1];
|
||||
var hasZ = context['hasZ'];
|
||||
var srsName = context['srsName'];
|
||||
if (node.nodeName !== 'PolygonPatch' && srsName) {
|
||||
node.setAttribute('srsName', srsName);
|
||||
@@ -396,7 +398,7 @@ ol.format.GML2.prototype.writeSurfaceOrPolygon_ = function(node, geometry, objec
|
||||
if (node.nodeName === 'Polygon' || node.nodeName === 'PolygonPatch') {
|
||||
var rings = geometry.getLinearRings();
|
||||
ol.xml.pushSerializeAndPop(
|
||||
{node: node, srsName: srsName},
|
||||
{node: node, hasZ: hasZ, srsName: srsName},
|
||||
ol.format.GML2.RING_SERIALIZERS_,
|
||||
this.RING_NODE_FACTORY_,
|
||||
rings, objectStack, undefined, this);
|
||||
@@ -457,17 +459,25 @@ ol.format.GML2.prototype.writeRing_ = function(node, ring, objectStack) {
|
||||
/**
|
||||
* @param {Array.<number>} point Point geometry.
|
||||
* @param {string=} opt_srsName Optional srsName
|
||||
* @param {boolean=} opt_hasZ whether the geometry has a Z coordinate (is 3D) or not.
|
||||
* @return {string} The coords string.
|
||||
* @private
|
||||
*/
|
||||
ol.format.GML2.prototype.getCoords_ = function(point, opt_srsName) {
|
||||
ol.format.GML2.prototype.getCoords_ = function(point, opt_srsName, opt_hasZ) {
|
||||
var axisOrientation = 'enu';
|
||||
if (opt_srsName) {
|
||||
axisOrientation = ol.proj.get(opt_srsName).getAxisOrientation();
|
||||
}
|
||||
return ((axisOrientation.substr(0, 2) === 'en') ?
|
||||
point[0] + ',' + point[1] :
|
||||
point[1] + ',' + point[0]);
|
||||
var coords = ((axisOrientation.substr(0, 2) === 'en') ?
|
||||
point[0] + ',' + point[1] :
|
||||
point[1] + ',' + point[0]);
|
||||
if (opt_hasZ) {
|
||||
// For newly created points, Z can be undefined.
|
||||
var z = point[2] || 0;
|
||||
coords += ',' + z;
|
||||
}
|
||||
|
||||
return coords;
|
||||
};
|
||||
|
||||
|
||||
@@ -479,13 +489,14 @@ ol.format.GML2.prototype.getCoords_ = function(point, opt_srsName) {
|
||||
*/
|
||||
ol.format.GML2.prototype.writeMultiCurveOrLineString_ = function(node, geometry, objectStack) {
|
||||
var context = objectStack[objectStack.length - 1];
|
||||
var hasZ = context['hasZ'];
|
||||
var srsName = context['srsName'];
|
||||
var curve = context['curve'];
|
||||
if (srsName) {
|
||||
node.setAttribute('srsName', srsName);
|
||||
}
|
||||
var lines = geometry.getLineStrings();
|
||||
ol.xml.pushSerializeAndPop({node: node, srsName: srsName, curve: curve},
|
||||
ol.xml.pushSerializeAndPop({node: node, hasZ: hasZ, srsName: srsName, curve: curve},
|
||||
ol.format.GML2.LINESTRINGORCURVEMEMBER_SERIALIZERS_,
|
||||
this.MULTIGEOMETRY_MEMBER_NODE_FACTORY_, lines,
|
||||
objectStack, undefined, this);
|
||||
@@ -500,6 +511,7 @@ ol.format.GML2.prototype.writeMultiCurveOrLineString_ = function(node, geometry,
|
||||
*/
|
||||
ol.format.GML2.prototype.writePoint_ = function(node, geometry, objectStack) {
|
||||
var context = objectStack[objectStack.length - 1];
|
||||
var hasZ = context['hasZ'];
|
||||
var srsName = context['srsName'];
|
||||
if (srsName) {
|
||||
node.setAttribute('srsName', srsName);
|
||||
@@ -507,7 +519,7 @@ ol.format.GML2.prototype.writePoint_ = function(node, geometry, objectStack) {
|
||||
var coordinates = this.createCoordinatesNode_(node.namespaceURI);
|
||||
node.appendChild(coordinates);
|
||||
var point = geometry.getCoordinates();
|
||||
var coord = this.getCoords_(point, srsName);
|
||||
var coord = this.getCoords_(point, srsName, hasZ);
|
||||
ol.format.XSD.writeStringTextNode(coordinates, coord);
|
||||
};
|
||||
|
||||
@@ -521,12 +533,13 @@ ol.format.GML2.prototype.writePoint_ = function(node, geometry, objectStack) {
|
||||
ol.format.GML2.prototype.writeMultiPoint_ = function(node, geometry,
|
||||
objectStack) {
|
||||
var context = objectStack[objectStack.length - 1];
|
||||
var hasZ = context['hasZ'];
|
||||
var srsName = context['srsName'];
|
||||
if (srsName) {
|
||||
node.setAttribute('srsName', srsName);
|
||||
}
|
||||
var points = geometry.getPoints();
|
||||
ol.xml.pushSerializeAndPop({node: node, srsName: srsName},
|
||||
ol.xml.pushSerializeAndPop({node: node, hasZ: hasZ, srsName: srsName},
|
||||
ol.format.GML2.POINTMEMBER_SERIALIZERS_,
|
||||
ol.xml.makeSimpleNodeFactory('pointMember'), points,
|
||||
objectStack, undefined, this);
|
||||
@@ -587,13 +600,14 @@ ol.format.GML2.prototype.writeLinearRing_ = function(node, geometry, objectStack
|
||||
*/
|
||||
ol.format.GML2.prototype.writeMultiSurfaceOrPolygon_ = function(node, geometry, objectStack) {
|
||||
var context = objectStack[objectStack.length - 1];
|
||||
var hasZ = context['hasZ'];
|
||||
var srsName = context['srsName'];
|
||||
var surface = context['surface'];
|
||||
if (srsName) {
|
||||
node.setAttribute('srsName', srsName);
|
||||
}
|
||||
var polygons = geometry.getPolygons();
|
||||
ol.xml.pushSerializeAndPop({node: node, srsName: srsName, surface: surface},
|
||||
ol.xml.pushSerializeAndPop({node: node, hasZ: hasZ, srsName: srsName, surface: surface},
|
||||
ol.format.GML2.SURFACEORPOLYGONMEMBER_SERIALIZERS_,
|
||||
this.MULTIGEOMETRY_MEMBER_NODE_FACTORY_, polygons,
|
||||
objectStack, undefined, this);
|
||||
|
||||
@@ -52,20 +52,20 @@ ol.format.GML3 = function(opt_options) {
|
||||
* @type {boolean}
|
||||
*/
|
||||
this.multiCurve_ = options.multiCurve !== undefined ?
|
||||
options.multiCurve : true;
|
||||
options.multiCurve : true;
|
||||
|
||||
/**
|
||||
* @private
|
||||
* @type {boolean}
|
||||
*/
|
||||
this.multiSurface_ = options.multiSurface !== undefined ?
|
||||
options.multiSurface : true;
|
||||
options.multiSurface : true;
|
||||
|
||||
/**
|
||||
* @inheritDoc
|
||||
*/
|
||||
this.schemaLocation = options.schemaLocation ?
|
||||
options.schemaLocation : ol.format.GML3.schemaLocation_;
|
||||
options.schemaLocation : ol.format.GML3.schemaLocation_;
|
||||
|
||||
};
|
||||
ol.inherits(ol.format.GML3, ol.format.GMLBase);
|
||||
@@ -565,6 +565,7 @@ ol.format.GML3.prototype.SEGMENTS_PARSERS_ = {
|
||||
*/
|
||||
ol.format.GML3.prototype.writePos_ = function(node, value, objectStack) {
|
||||
var context = objectStack[objectStack.length - 1];
|
||||
var hasZ = context['hasZ'];
|
||||
var srsName = context['srsName'];
|
||||
var axisOrientation = 'enu';
|
||||
if (srsName) {
|
||||
@@ -578,6 +579,11 @@ ol.format.GML3.prototype.writePos_ = function(node, value, objectStack) {
|
||||
} else {
|
||||
coords = (point[1] + ' ' + point[0]);
|
||||
}
|
||||
if (hasZ) {
|
||||
// For newly created points, Z can be undefined.
|
||||
var z = point[2] || 0;
|
||||
coords += ' ' + z;
|
||||
}
|
||||
ol.format.XSD.writeStringTextNode(node, coords);
|
||||
};
|
||||
|
||||
@@ -585,17 +591,25 @@ ol.format.GML3.prototype.writePos_ = function(node, value, objectStack) {
|
||||
/**
|
||||
* @param {Array.<number>} point Point geometry.
|
||||
* @param {string=} opt_srsName Optional srsName
|
||||
* @param {boolean=} opt_hasZ whether the geometry has a Z coordinate (is 3D) or not.
|
||||
* @return {string} The coords string.
|
||||
* @private
|
||||
*/
|
||||
ol.format.GML3.prototype.getCoords_ = function(point, opt_srsName) {
|
||||
ol.format.GML3.prototype.getCoords_ = function(point, opt_srsName, opt_hasZ) {
|
||||
var axisOrientation = 'enu';
|
||||
if (opt_srsName) {
|
||||
axisOrientation = ol.proj.get(opt_srsName).getAxisOrientation();
|
||||
}
|
||||
return ((axisOrientation.substr(0, 2) === 'en') ?
|
||||
point[0] + ' ' + point[1] :
|
||||
point[1] + ' ' + point[0]);
|
||||
var coords = ((axisOrientation.substr(0, 2) === 'en') ?
|
||||
point[0] + ' ' + point[1] :
|
||||
point[1] + ' ' + point[0]);
|
||||
if (opt_hasZ) {
|
||||
// For newly created points, Z can be undefined.
|
||||
var z = point[2] || 0;
|
||||
coords += ' ' + z;
|
||||
}
|
||||
|
||||
return coords;
|
||||
};
|
||||
|
||||
|
||||
@@ -607,6 +621,7 @@ ol.format.GML3.prototype.getCoords_ = function(point, opt_srsName) {
|
||||
*/
|
||||
ol.format.GML3.prototype.writePosList_ = function(node, value, objectStack) {
|
||||
var context = objectStack[objectStack.length - 1];
|
||||
var hasZ = context['hasZ'];
|
||||
var srsName = context['srsName'];
|
||||
// only 2d for simple features profile
|
||||
var points = value.getCoordinates();
|
||||
@@ -615,7 +630,7 @@ ol.format.GML3.prototype.writePosList_ = function(node, value, objectStack) {
|
||||
var point;
|
||||
for (var i = 0; i < len; ++i) {
|
||||
point = points[i];
|
||||
parts[i] = this.getCoords_(point, srsName);
|
||||
parts[i] = this.getCoords_(point, srsName, hasZ);
|
||||
}
|
||||
ol.format.XSD.writeStringTextNode(node, parts.join(' '));
|
||||
};
|
||||
@@ -717,6 +732,7 @@ ol.format.GML3.prototype.RING_NODE_FACTORY_ = function(value, objectStack, opt_n
|
||||
*/
|
||||
ol.format.GML3.prototype.writeSurfaceOrPolygon_ = function(node, geometry, objectStack) {
|
||||
var context = objectStack[objectStack.length - 1];
|
||||
var hasZ = context['hasZ'];
|
||||
var srsName = context['srsName'];
|
||||
if (node.nodeName !== 'PolygonPatch' && srsName) {
|
||||
node.setAttribute('srsName', srsName);
|
||||
@@ -724,7 +740,7 @@ ol.format.GML3.prototype.writeSurfaceOrPolygon_ = function(node, geometry, objec
|
||||
if (node.nodeName === 'Polygon' || node.nodeName === 'PolygonPatch') {
|
||||
var rings = geometry.getLinearRings();
|
||||
ol.xml.pushSerializeAndPop(
|
||||
{node: node, srsName: srsName},
|
||||
{node: node, hasZ: hasZ, srsName: srsName},
|
||||
ol.format.GML3.RING_SERIALIZERS_,
|
||||
this.RING_NODE_FACTORY_,
|
||||
rings, objectStack, undefined, this);
|
||||
@@ -771,13 +787,14 @@ ol.format.GML3.prototype.writeCurveOrLineString_ = function(node, geometry, obje
|
||||
*/
|
||||
ol.format.GML3.prototype.writeMultiSurfaceOrPolygon_ = function(node, geometry, objectStack) {
|
||||
var context = objectStack[objectStack.length - 1];
|
||||
var hasZ = context['hasZ'];
|
||||
var srsName = context['srsName'];
|
||||
var surface = context['surface'];
|
||||
if (srsName) {
|
||||
node.setAttribute('srsName', srsName);
|
||||
}
|
||||
var polygons = geometry.getPolygons();
|
||||
ol.xml.pushSerializeAndPop({node: node, srsName: srsName, surface: surface},
|
||||
ol.xml.pushSerializeAndPop({node: node, hasZ: hasZ, srsName: srsName, surface: surface},
|
||||
ol.format.GML3.SURFACEORPOLYGONMEMBER_SERIALIZERS_,
|
||||
this.MULTIGEOMETRY_MEMBER_NODE_FACTORY_, polygons,
|
||||
objectStack, undefined, this);
|
||||
@@ -794,11 +811,12 @@ ol.format.GML3.prototype.writeMultiPoint_ = function(node, geometry,
|
||||
objectStack) {
|
||||
var context = objectStack[objectStack.length - 1];
|
||||
var srsName = context['srsName'];
|
||||
var hasZ = context['hasZ'];
|
||||
if (srsName) {
|
||||
node.setAttribute('srsName', srsName);
|
||||
}
|
||||
var points = geometry.getPoints();
|
||||
ol.xml.pushSerializeAndPop({node: node, srsName: srsName},
|
||||
ol.xml.pushSerializeAndPop({node: node, hasZ: hasZ, srsName: srsName},
|
||||
ol.format.GML3.POINTMEMBER_SERIALIZERS_,
|
||||
ol.xml.makeSimpleNodeFactory('pointMember'), points,
|
||||
objectStack, undefined, this);
|
||||
@@ -813,13 +831,14 @@ ol.format.GML3.prototype.writeMultiPoint_ = function(node, geometry,
|
||||
*/
|
||||
ol.format.GML3.prototype.writeMultiCurveOrLineString_ = function(node, geometry, objectStack) {
|
||||
var context = objectStack[objectStack.length - 1];
|
||||
var hasZ = context['hasZ'];
|
||||
var srsName = context['srsName'];
|
||||
var curve = context['curve'];
|
||||
if (srsName) {
|
||||
node.setAttribute('srsName', srsName);
|
||||
}
|
||||
var lines = geometry.getLineStrings();
|
||||
ol.xml.pushSerializeAndPop({node: node, srsName: srsName, curve: curve},
|
||||
ol.xml.pushSerializeAndPop({node: node, hasZ: hasZ, srsName: srsName, curve: curve},
|
||||
ol.format.GML3.LINESTRINGORCURVEMEMBER_SERIALIZERS_,
|
||||
this.MULTIGEOMETRY_MEMBER_NODE_FACTORY_, lines,
|
||||
objectStack, undefined, this);
|
||||
@@ -1168,7 +1187,7 @@ ol.format.GML3.prototype.GEOMETRY_NODE_FACTORY_ = function(value, objectStack, o
|
||||
ol.format.GML3.prototype.writeGeometryNode = function(geometry, opt_options) {
|
||||
opt_options = this.adaptOptions(opt_options);
|
||||
var geom = ol.xml.createElementNS('http://www.opengis.net/gml', 'geom');
|
||||
var context = {node: geom, srsName: this.srsName,
|
||||
var context = {node: geom, hasZ: this.hasZ, srsName: this.srsName,
|
||||
curve: this.curve_, surface: this.surface_,
|
||||
multiSurface: this.multiSurface_, multiCurve: this.multiCurve_};
|
||||
if (opt_options) {
|
||||
@@ -1208,6 +1227,7 @@ ol.format.GML3.prototype.writeFeaturesNode = function(features, opt_options) {
|
||||
'xsi:schemaLocation', this.schemaLocation);
|
||||
var context = {
|
||||
srsName: this.srsName,
|
||||
hasZ: this.hasZ,
|
||||
curve: this.curve_,
|
||||
surface: this.surface_,
|
||||
multiSurface: this.multiSurface_,
|
||||
|
||||
@@ -167,12 +167,12 @@ ol.format.GMLBase.prototype.readFeaturesInternal = function(node, objectStack) {
|
||||
var parsers = {};
|
||||
for (i = 0, ii = featureTypes.length; i < ii; ++i) {
|
||||
var featurePrefix = featureTypes[i].indexOf(':') === -1 ?
|
||||
defaultPrefix : featureTypes[i].split(':')[0];
|
||||
defaultPrefix : featureTypes[i].split(':')[0];
|
||||
if (featurePrefix === p) {
|
||||
parsers[featureTypes[i].split(':').pop()] =
|
||||
(localName == 'featureMembers') ?
|
||||
ol.xml.makeArrayPusher(this.readFeatureElement, this) :
|
||||
ol.xml.makeReplacer(this.readFeatureElement, this);
|
||||
ol.xml.makeArrayPusher(this.readFeatureElement, this) :
|
||||
ol.xml.makeReplacer(this.readFeatureElement, this);
|
||||
}
|
||||
}
|
||||
parsersNS[featureNS[p]] = parsers;
|
||||
@@ -203,7 +203,7 @@ ol.format.GMLBase.prototype.readGeometryElement = function(node, objectStack) {
|
||||
this.GEOMETRY_PARSERS_, node, objectStack, this);
|
||||
if (geometry) {
|
||||
return /** @type {ol.geom.Geometry} */ (
|
||||
ol.format.Feature.transformWithOptions(geometry, false, context));
|
||||
ol.format.Feature.transformWithOptions(geometry, false, context));
|
||||
} else {
|
||||
return undefined;
|
||||
}
|
||||
@@ -590,5 +590,5 @@ ol.format.GMLBase.prototype.readFeaturesFromNode = function(node, opt_options) {
|
||||
*/
|
||||
ol.format.GMLBase.prototype.readProjectionFromNode = function(node) {
|
||||
return ol.proj.get(this.srsName ? this.srsName :
|
||||
node.firstElementChild.getAttribute('srsName'));
|
||||
node.firstElementChild.getAttribute('srsName'));
|
||||
};
|
||||
|
||||
@@ -606,8 +606,8 @@ ol.format.GPX.writeWptType_ = function(node, coordinate, objectStack) {
|
||||
// pass
|
||||
}
|
||||
var orderedKeys = (node.nodeName == 'rtept') ?
|
||||
ol.format.GPX.RTEPT_TYPE_SEQUENCE_[namespaceURI] :
|
||||
ol.format.GPX.WPT_TYPE_SEQUENCE_[namespaceURI];
|
||||
ol.format.GPX.RTEPT_TYPE_SEQUENCE_[namespaceURI] :
|
||||
ol.format.GPX.WPT_TYPE_SEQUENCE_[namespaceURI];
|
||||
var values = ol.xml.makeSequence(properties, orderedKeys);
|
||||
ol.xml.pushSerializeAndPop(/** @type {ol.XmlNodeStackItem} */
|
||||
({node: node, 'properties': properties}),
|
||||
@@ -629,7 +629,7 @@ ol.format.GPX.writeRte_ = function(node, feature, objectStack) {
|
||||
var geometry = feature.getGeometry();
|
||||
if (geometry) {
|
||||
geometry = /** @type {ol.geom.LineString} */
|
||||
(ol.format.Feature.transformWithOptions(geometry, true, options));
|
||||
(ol.format.Feature.transformWithOptions(geometry, true, options));
|
||||
context['geometryLayout'] = geometry.getLayout();
|
||||
properties['rtept'] = geometry.getCoordinates();
|
||||
}
|
||||
@@ -656,7 +656,7 @@ ol.format.GPX.writeTrk_ = function(node, feature, objectStack) {
|
||||
var geometry = feature.getGeometry();
|
||||
if (geometry) {
|
||||
geometry = /** @type {ol.geom.MultiLineString} */
|
||||
(ol.format.Feature.transformWithOptions(geometry, true, options));
|
||||
(ol.format.Feature.transformWithOptions(geometry, true, options));
|
||||
properties['trkseg'] = geometry.getLineStrings();
|
||||
}
|
||||
var parentNode = objectStack[objectStack.length - 1].node;
|
||||
@@ -697,7 +697,7 @@ ol.format.GPX.writeWpt_ = function(node, feature, objectStack) {
|
||||
var geometry = feature.getGeometry();
|
||||
if (geometry) {
|
||||
geometry = /** @type {ol.geom.Point} */
|
||||
(ol.format.Feature.transformWithOptions(geometry, true, options));
|
||||
(ol.format.Feature.transformWithOptions(geometry, true, options));
|
||||
context['geometryLayout'] = geometry.getLayout();
|
||||
ol.format.GPX.writeWptType_(node, geometry.getCoordinates(), objectStack);
|
||||
}
|
||||
|
||||
@@ -35,7 +35,7 @@ ol.format.IGC = function(opt_options) {
|
||||
* @type {ol.format.IGCZ}
|
||||
*/
|
||||
this.altitudeMode_ = options.altitudeMode ?
|
||||
options.altitudeMode : ol.format.IGCZ.NONE;
|
||||
options.altitudeMode : ol.format.IGCZ.NONE;
|
||||
|
||||
};
|
||||
ol.inherits(ol.format.IGC, ol.format.TextFeature);
|
||||
@@ -158,7 +158,7 @@ ol.format.IGC.prototype.readFeatureFromText = function(text, opt_options) {
|
||||
}
|
||||
var lineString = new ol.geom.LineString(null);
|
||||
var layout = altitudeMode == ol.format.IGCZ.NONE ?
|
||||
ol.geom.GeometryLayout.XYM : ol.geom.GeometryLayout.XYZM;
|
||||
ol.geom.GeometryLayout.XYM : ol.geom.GeometryLayout.XYZM;
|
||||
lineString.setFlatCoordinates(layout, flatCoordinates);
|
||||
var feature = new ol.Feature(ol.format.Feature.transformWithOptions(
|
||||
lineString, false, opt_options));
|
||||
|
||||
@@ -66,21 +66,21 @@ ol.format.KML = function(opt_options) {
|
||||
* @type {Array.<ol.style.Style>}
|
||||
*/
|
||||
this.defaultStyle_ = options.defaultStyle ?
|
||||
options.defaultStyle : ol.format.KML.DEFAULT_STYLE_ARRAY_;
|
||||
options.defaultStyle : ol.format.KML.DEFAULT_STYLE_ARRAY_;
|
||||
|
||||
/**
|
||||
* @private
|
||||
* @type {boolean}
|
||||
*/
|
||||
this.extractStyles_ = options.extractStyles !== undefined ?
|
||||
options.extractStyles : true;
|
||||
options.extractStyles : true;
|
||||
|
||||
/**
|
||||
* @private
|
||||
* @type {boolean}
|
||||
*/
|
||||
this.writeStyles_ = options.writeStyles !== undefined ?
|
||||
options.writeStyles : true;
|
||||
options.writeStyles : true;
|
||||
|
||||
/**
|
||||
* @private
|
||||
@@ -93,7 +93,7 @@ ol.format.KML = function(opt_options) {
|
||||
* @type {boolean}
|
||||
*/
|
||||
this.showPointNames_ = options.showPointNames !== undefined ?
|
||||
options.showPointNames : true;
|
||||
options.showPointNames : true;
|
||||
|
||||
};
|
||||
ol.inherits(ol.format.KML, ol.format.XMLFeature);
|
||||
@@ -285,7 +285,8 @@ ol.format.KML.createStyleDefaults_ = function() {
|
||||
*/
|
||||
ol.format.KML.ICON_ANCHOR_UNITS_MAP_ = {
|
||||
'fraction': ol.style.IconAnchorUnits.FRACTION,
|
||||
'pixels': ol.style.IconAnchorUnits.PIXELS
|
||||
'pixels': ol.style.IconAnchorUnits.PIXELS,
|
||||
'insetPixels': ol.style.IconAnchorUnits.PIXELS
|
||||
};
|
||||
|
||||
|
||||
@@ -352,53 +353,53 @@ ol.format.KML.createFeatureStyleFunction_ = function(style, styleUrl,
|
||||
defaultStyle, sharedStyles, showPointNames) {
|
||||
|
||||
return (
|
||||
/**
|
||||
/**
|
||||
* @param {number} resolution Resolution.
|
||||
* @return {Array.<ol.style.Style>} Style.
|
||||
* @this {ol.Feature}
|
||||
*/
|
||||
function(resolution) {
|
||||
var drawName = showPointNames;
|
||||
/** @type {ol.style.Style|undefined} */
|
||||
var nameStyle;
|
||||
var name = '';
|
||||
if (drawName) {
|
||||
if (this.getGeometry()) {
|
||||
drawName = (this.getGeometry().getType() ===
|
||||
function(resolution) {
|
||||
var drawName = showPointNames;
|
||||
/** @type {ol.style.Style|undefined} */
|
||||
var nameStyle;
|
||||
var name = '';
|
||||
if (drawName) {
|
||||
if (this.getGeometry()) {
|
||||
drawName = (this.getGeometry().getType() ===
|
||||
ol.geom.GeometryType.POINT);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (drawName) {
|
||||
name = /** @type {string} */ (this.get('name'));
|
||||
drawName = drawName && name;
|
||||
}
|
||||
if (drawName) {
|
||||
name = /** @type {string} */ (this.get('name'));
|
||||
drawName = drawName && name;
|
||||
}
|
||||
|
||||
if (style) {
|
||||
if (drawName) {
|
||||
nameStyle = ol.format.KML.createNameStyleFunction_(style[0],
|
||||
name);
|
||||
return style.concat(nameStyle);
|
||||
}
|
||||
return style;
|
||||
}
|
||||
if (styleUrl) {
|
||||
var foundStyle = ol.format.KML.findStyle_(styleUrl, defaultStyle,
|
||||
sharedStyles);
|
||||
if (drawName) {
|
||||
nameStyle = ol.format.KML.createNameStyleFunction_(foundStyle[0],
|
||||
name);
|
||||
return foundStyle.concat(nameStyle);
|
||||
}
|
||||
return foundStyle;
|
||||
}
|
||||
if (style) {
|
||||
if (drawName) {
|
||||
nameStyle = ol.format.KML.createNameStyleFunction_(defaultStyle[0],
|
||||
nameStyle = ol.format.KML.createNameStyleFunction_(style[0],
|
||||
name);
|
||||
return defaultStyle.concat(nameStyle);
|
||||
return style.concat(nameStyle);
|
||||
}
|
||||
return defaultStyle;
|
||||
});
|
||||
return style;
|
||||
}
|
||||
if (styleUrl) {
|
||||
var foundStyle = ol.format.KML.findStyle_(styleUrl, defaultStyle,
|
||||
sharedStyles);
|
||||
if (drawName) {
|
||||
nameStyle = ol.format.KML.createNameStyleFunction_(foundStyle[0],
|
||||
name);
|
||||
return foundStyle.concat(nameStyle);
|
||||
}
|
||||
return foundStyle;
|
||||
}
|
||||
if (drawName) {
|
||||
nameStyle = ol.format.KML.createNameStyleFunction_(defaultStyle[0],
|
||||
name);
|
||||
return defaultStyle.concat(nameStyle);
|
||||
}
|
||||
return defaultStyle;
|
||||
});
|
||||
};
|
||||
|
||||
|
||||
@@ -487,7 +488,7 @@ ol.format.KML.readFlatCoordinates_ = function(node) {
|
||||
*/
|
||||
ol.format.KML.readURI_ = function(node) {
|
||||
var s = ol.xml.getAllTextContent(node, false).trim();
|
||||
if (node.baseURI) {
|
||||
if (node.baseURI && node.baseURI !== 'about:blank') {
|
||||
var url = new URL(s, node.baseURI);
|
||||
return url.href;
|
||||
} else {
|
||||
@@ -504,11 +505,26 @@ ol.format.KML.readURI_ = function(node) {
|
||||
ol.format.KML.readVec2_ = function(node) {
|
||||
var xunits = node.getAttribute('xunits');
|
||||
var yunits = node.getAttribute('yunits');
|
||||
var origin;
|
||||
if (xunits !== 'insetPixels') {
|
||||
if (yunits !== 'insetPixels') {
|
||||
origin = ol.style.IconOrigin.BOTTOM_LEFT;
|
||||
} else {
|
||||
origin = ol.style.IconOrigin.TOP_LEFT;
|
||||
}
|
||||
} else {
|
||||
if (yunits !== 'insetPixels') {
|
||||
origin = ol.style.IconOrigin.BOTTOM_RIGHT;
|
||||
} else {
|
||||
origin = ol.style.IconOrigin.TOP_RIGHT;
|
||||
}
|
||||
}
|
||||
return {
|
||||
x: parseFloat(node.getAttribute('x')),
|
||||
xunits: ol.format.KML.ICON_ANCHOR_UNITS_MAP_[xunits],
|
||||
y: parseFloat(node.getAttribute('y')),
|
||||
yunits: ol.format.KML.ICON_ANCHOR_UNITS_MAP_[yunits]
|
||||
yunits: ol.format.KML.ICON_ANCHOR_UNITS_MAP_[yunits],
|
||||
origin: origin
|
||||
};
|
||||
};
|
||||
|
||||
@@ -533,7 +549,7 @@ ol.format.KML.readStyleMapValue_ = function(node, objectStack) {
|
||||
return ol.xml.pushParseAndPop(undefined,
|
||||
ol.format.KML.STYLE_MAP_PARSERS_, node, objectStack);
|
||||
};
|
||||
/**
|
||||
/**
|
||||
* @param {Node} node Node.
|
||||
* @param {Array.<*>} objectStack Object stack.
|
||||
* @private
|
||||
@@ -562,12 +578,14 @@ ol.format.KML.IconStyleParser_ = function(node, objectStack) {
|
||||
src = ol.format.KML.DEFAULT_IMAGE_STYLE_SRC_;
|
||||
}
|
||||
var anchor, anchorXUnits, anchorYUnits;
|
||||
var anchorOrigin = ol.style.IconOrigin.BOTTOM_LEFT;
|
||||
var hotSpot = /** @type {ol.KMLVec2_|undefined} */
|
||||
(object['hotSpot']);
|
||||
if (hotSpot) {
|
||||
anchor = [hotSpot.x, hotSpot.y];
|
||||
anchorXUnits = hotSpot.xunits;
|
||||
anchorYUnits = hotSpot.yunits;
|
||||
anchorOrigin = hotSpot.origin;
|
||||
} else if (src === ol.format.KML.DEFAULT_IMAGE_STYLE_SRC_) {
|
||||
anchor = ol.format.KML.DEFAULT_IMAGE_STYLE_ANCHOR_;
|
||||
anchorXUnits = ol.format.KML.DEFAULT_IMAGE_STYLE_ANCHOR_X_UNITS_;
|
||||
@@ -616,7 +634,7 @@ ol.format.KML.IconStyleParser_ = function(node, objectStack) {
|
||||
|
||||
var imageStyle = new ol.style.Icon({
|
||||
anchor: anchor,
|
||||
anchorOrigin: ol.style.IconOrigin.BOTTOM_LEFT,
|
||||
anchorOrigin: anchorOrigin,
|
||||
anchorXUnits: anchorXUnits,
|
||||
anchorYUnits: anchorYUnits,
|
||||
crossOrigin: 'anonymous', // FIXME should this be configurable?
|
||||
@@ -789,7 +807,7 @@ ol.format.KML.readGxTrack_ = function(node, objectStack) {
|
||||
var whens = gxTrackObject.whens;
|
||||
var i, ii;
|
||||
for (i = 0, ii = Math.min(flatCoordinates.length, whens.length); i < ii;
|
||||
++i) {
|
||||
++i) {
|
||||
flatCoordinates[4 * i + 3] = whens[i];
|
||||
}
|
||||
var lineString = new ol.geom.LineString(null);
|
||||
@@ -1003,23 +1021,23 @@ ol.format.KML.readStyle_ = function(node, objectStack) {
|
||||
}
|
||||
var fillStyle = /** @type {ol.style.Fill} */
|
||||
('fillStyle' in styleObject ?
|
||||
styleObject['fillStyle'] : ol.format.KML.DEFAULT_FILL_STYLE_);
|
||||
styleObject['fillStyle'] : ol.format.KML.DEFAULT_FILL_STYLE_);
|
||||
var fill = /** @type {boolean|undefined} */ (styleObject['fill']);
|
||||
if (fill !== undefined && !fill) {
|
||||
fillStyle = null;
|
||||
}
|
||||
var imageStyle = /** @type {ol.style.Image} */
|
||||
('imageStyle' in styleObject ?
|
||||
styleObject['imageStyle'] : ol.format.KML.DEFAULT_IMAGE_STYLE_);
|
||||
styleObject['imageStyle'] : ol.format.KML.DEFAULT_IMAGE_STYLE_);
|
||||
if (imageStyle == ol.format.KML.DEFAULT_NO_IMAGE_STYLE_) {
|
||||
imageStyle = undefined;
|
||||
}
|
||||
var textStyle = /** @type {ol.style.Text} */
|
||||
('textStyle' in styleObject ?
|
||||
styleObject['textStyle'] : ol.format.KML.DEFAULT_TEXT_STYLE_);
|
||||
styleObject['textStyle'] : ol.format.KML.DEFAULT_TEXT_STYLE_);
|
||||
var strokeStyle = /** @type {ol.style.Stroke} */
|
||||
('strokeStyle' in styleObject ?
|
||||
styleObject['strokeStyle'] : ol.format.KML.DEFAULT_STROKE_STYLE_);
|
||||
styleObject['strokeStyle'] : ol.format.KML.DEFAULT_STROKE_STYLE_);
|
||||
var outline = /** @type {boolean|undefined} */
|
||||
(styleObject['outline']);
|
||||
if (outline !== undefined && !outline) {
|
||||
@@ -1074,13 +1092,13 @@ ol.format.KML.setCommonGeometryProperties_ = function(multiGeometry,
|
||||
ol.format.KML.DataParser_ = function(node, objectStack) {
|
||||
var name = node.getAttribute('name');
|
||||
ol.xml.parseNode(ol.format.KML.DATA_PARSERS_, node, objectStack);
|
||||
var featureObject =
|
||||
/** @type {Object} */ (objectStack[objectStack.length - 1]);
|
||||
var featureObject = /** @type {Object} */ (objectStack[objectStack.length - 1]);
|
||||
if (name !== null) {
|
||||
featureObject[name] = featureObject.value;
|
||||
} else if (featureObject.displayName !== null) {
|
||||
featureObject[featureObject.displayName] = featureObject.value;
|
||||
}
|
||||
delete featureObject['value'];
|
||||
};
|
||||
|
||||
|
||||
@@ -1719,7 +1737,7 @@ ol.format.KML.prototype.readSharedStyle_ = function(node, objectStack) {
|
||||
var style = ol.format.KML.readStyle_(node, objectStack);
|
||||
if (style) {
|
||||
var styleUri;
|
||||
if (node.baseURI) {
|
||||
if (node.baseURI && node.baseURI !== 'about:blank') {
|
||||
var url = new URL('#' + id, node.baseURI);
|
||||
styleUri = url.href;
|
||||
} else {
|
||||
@@ -1746,7 +1764,7 @@ ol.format.KML.prototype.readSharedStyleMap_ = function(node, objectStack) {
|
||||
return;
|
||||
}
|
||||
var styleUri;
|
||||
if (node.baseURI) {
|
||||
if (node.baseURI && node.baseURI !== 'about:blank') {
|
||||
var url = new URL('#' + id, node.baseURI);
|
||||
styleUri = url.href;
|
||||
} else {
|
||||
@@ -2126,16 +2144,16 @@ ol.format.KML.writeDataNode_ = function(node, pair, objectStack) {
|
||||
if (typeof value == 'object') {
|
||||
if (value !== null && value.displayName) {
|
||||
ol.xml.pushSerializeAndPop(context, ol.format.KML.EXTENDEDDATA_NODE_SERIALIZERS_,
|
||||
ol.xml.OBJECT_PROPERTY_NODE_FACTORY, [value.displayName], objectStack, ['displayName']);
|
||||
ol.xml.OBJECT_PROPERTY_NODE_FACTORY, [value.displayName], objectStack, ['displayName']);
|
||||
}
|
||||
|
||||
if (value !== null && value.value) {
|
||||
ol.xml.pushSerializeAndPop(context, ol.format.KML.EXTENDEDDATA_NODE_SERIALIZERS_,
|
||||
ol.xml.OBJECT_PROPERTY_NODE_FACTORY, [value.value], objectStack, ['value']);
|
||||
ol.xml.OBJECT_PROPERTY_NODE_FACTORY, [value.value], objectStack, ['value']);
|
||||
}
|
||||
} else {
|
||||
ol.xml.pushSerializeAndPop(context, ol.format.KML.EXTENDEDDATA_NODE_SERIALIZERS_,
|
||||
ol.xml.OBJECT_PROPERTY_NODE_FACTORY, [value], objectStack, ['value']);
|
||||
ol.xml.OBJECT_PROPERTY_NODE_FACTORY, [value], objectStack, ['value']);
|
||||
}
|
||||
};
|
||||
|
||||
@@ -2188,7 +2206,7 @@ ol.format.KML.writeExtendedData_ = function(node, namesAndValues, objectStack) {
|
||||
|
||||
for (var i = 0; i < length; i++) {
|
||||
ol.xml.pushSerializeAndPop(context, ol.format.KML.EXTENDEDDATA_NODE_SERIALIZERS_,
|
||||
ol.format.KML.DATA_NODE_FACTORY_, [{name: names[i], value: values[i]}], objectStack);
|
||||
ol.format.KML.DATA_NODE_FACTORY_, [{name: names[i], value: values[i]}], objectStack);
|
||||
}
|
||||
};
|
||||
|
||||
@@ -2242,7 +2260,7 @@ ol.format.KML.writeIconStyle_ = function(node, style, objectStack) {
|
||||
iconProperties['y'] = iconImageSize[1] - (origin[1] + size[1]);
|
||||
}
|
||||
|
||||
if (anchor && anchor[0] !== 0 && anchor[1] !== size[1]) {
|
||||
if (anchor && (anchor[0] !== size[0] / 2 || anchor[1] !== size[1] / 2)) {
|
||||
var /** @type {ol.KMLVec2_} */ hotSpot = {
|
||||
x: anchor[0],
|
||||
xunits: ol.style.IconAnchorUnits.PIXELS,
|
||||
@@ -2402,7 +2420,7 @@ ol.format.KML.writePlacemark_ = function(node, feature, objectStack) {
|
||||
var sequence = ol.xml.makeSequence(properties, keys);
|
||||
var namesAndValues = {names: keys, values: sequence};
|
||||
ol.xml.pushSerializeAndPop(context, ol.format.KML.PLACEMARK_SERIALIZERS_,
|
||||
ol.format.KML.EXTENDEDDATA_NODE_FACTORY_, [namesAndValues], objectStack);
|
||||
ol.format.KML.EXTENDEDDATA_NODE_FACTORY_, [namesAndValues], objectStack);
|
||||
}
|
||||
|
||||
var styleFunction = feature.getStyleFunction();
|
||||
|
||||
@@ -3,8 +3,8 @@
|
||||
goog.provide('ol.format.MVT');
|
||||
|
||||
goog.require('ol');
|
||||
goog.require('ol.ext.pbf');
|
||||
goog.require('ol.ext.vectortile');
|
||||
goog.require('ol.ext.PBF');
|
||||
goog.require('ol.ext.vectortile.VectorTile');
|
||||
goog.require('ol.format.Feature');
|
||||
goog.require('ol.format.FormatType');
|
||||
goog.require('ol.geom.GeometryLayout');
|
||||
@@ -44,12 +44,12 @@ ol.format.MVT = function(opt_options) {
|
||||
|
||||
/**
|
||||
* @private
|
||||
* @type {function((ol.geom.Geometry|Object.<string, *>)=)|
|
||||
* @type {function((ol.geom.Geometry|Object.<string,*>)=)|
|
||||
* function(ol.geom.GeometryType,Array.<number>,
|
||||
* (Array.<number>|Array.<Array.<number>>),Object.<string, *>)}
|
||||
* (Array.<number>|Array.<Array.<number>>),Object.<string,*>,number)}
|
||||
*/
|
||||
this.featureClass_ = options.featureClass ?
|
||||
options.featureClass : ol.render.Feature;
|
||||
options.featureClass : ol.render.Feature;
|
||||
|
||||
/**
|
||||
* @private
|
||||
@@ -69,10 +69,25 @@ ol.format.MVT = function(opt_options) {
|
||||
*/
|
||||
this.layers_ = options.layers ? options.layers : null;
|
||||
|
||||
/**
|
||||
* @private
|
||||
* @type {ol.Extent}
|
||||
*/
|
||||
this.extent_ = null;
|
||||
|
||||
};
|
||||
ol.inherits(ol.format.MVT, ol.format.Feature);
|
||||
|
||||
|
||||
/**
|
||||
* @inheritDoc
|
||||
* @api
|
||||
*/
|
||||
ol.format.MVT.prototype.getLastExtent = function() {
|
||||
return this.extent_;
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* @inheritDoc
|
||||
*/
|
||||
@@ -124,7 +139,7 @@ ol.format.MVT.prototype.readRenderFeature_ = function(rawFeature, layer) {
|
||||
var geometryType;
|
||||
if (type === 1) {
|
||||
geometryType = coords.length === 1 ?
|
||||
ol.geom.GeometryType.POINT : ol.geom.GeometryType.MULTI_POINT;
|
||||
ol.geom.GeometryType.POINT : ol.geom.GeometryType.MULTI_POINT;
|
||||
} else if (type === 2) {
|
||||
if (coords.length === 1) {
|
||||
geometryType = ol.geom.GeometryType.LINE_STRING;
|
||||
@@ -137,8 +152,9 @@ ol.format.MVT.prototype.readRenderFeature_ = function(rawFeature, layer) {
|
||||
|
||||
var values = rawFeature.properties;
|
||||
values[this.layerName_] = layer;
|
||||
var id = rawFeature.id;
|
||||
|
||||
return new this.featureClass_(geometryType, flatCoordinates, ends, values);
|
||||
return new this.featureClass_(geometryType, flatCoordinates, ends, values, id);
|
||||
};
|
||||
|
||||
|
||||
@@ -149,7 +165,7 @@ ol.format.MVT.prototype.readRenderFeature_ = function(rawFeature, layer) {
|
||||
ol.format.MVT.prototype.readFeatures = function(source, opt_options) {
|
||||
var layers = this.layers_;
|
||||
|
||||
var pbf = new ol.ext.pbf(/** @type {ArrayBuffer} */ (source));
|
||||
var pbf = new ol.ext.PBF(/** @type {ArrayBuffer} */ (source));
|
||||
var tile = new ol.ext.vectortile.VectorTile(pbf);
|
||||
var features = [];
|
||||
var featureClass = this.featureClass_;
|
||||
@@ -160,14 +176,17 @@ ol.format.MVT.prototype.readFeatures = function(source, opt_options) {
|
||||
}
|
||||
layer = tile.layers[name];
|
||||
|
||||
var rawFeature;
|
||||
for (var i = 0, ii = layer.length; i < ii; ++i) {
|
||||
rawFeature = layer.feature(i);
|
||||
if (featureClass === ol.render.Feature) {
|
||||
feature = this.readRenderFeature_(layer.feature(i), name);
|
||||
feature = this.readRenderFeature_(rawFeature, name);
|
||||
} else {
|
||||
feature = this.readFeature_(layer.feature(i), name, opt_options);
|
||||
feature = this.readFeature_(rawFeature, name, opt_options);
|
||||
}
|
||||
features.push(feature);
|
||||
}
|
||||
this.extent_ = layer ? [0, 0, layer.extent, layer.extent] : null;
|
||||
}
|
||||
|
||||
return features;
|
||||
@@ -237,7 +256,7 @@ ol.format.MVT.readGeometry_ = function(rawFeature) {
|
||||
var geom;
|
||||
if (type === 1) {
|
||||
geom = coords.length === 1 ?
|
||||
new ol.geom.Point(null) : new ol.geom.MultiPoint(null);
|
||||
new ol.geom.Point(null) : new ol.geom.MultiPoint(null);
|
||||
} else if (type === 2) {
|
||||
if (coords.length === 1) {
|
||||
geom = new ol.geom.LineString(null);
|
||||
|
||||
@@ -386,13 +386,13 @@ ol.format.OWS.REQUEST_METHOD_PARSERS_ = ol.xml.makeStructureNS(
|
||||
*/
|
||||
ol.format.OWS.SERVICE_CONTACT_PARSERS_ =
|
||||
ol.xml.makeStructureNS(
|
||||
ol.format.OWS.NAMESPACE_URIS_, {
|
||||
'IndividualName': ol.xml.makeObjectPropertySetter(
|
||||
ol.format.XSD.readString),
|
||||
'PositionName': ol.xml.makeObjectPropertySetter(ol.format.XSD.readString),
|
||||
'ContactInfo': ol.xml.makeObjectPropertySetter(
|
||||
ol.format.OWS.readContactInfo_)
|
||||
});
|
||||
ol.format.OWS.NAMESPACE_URIS_, {
|
||||
'IndividualName': ol.xml.makeObjectPropertySetter(
|
||||
ol.format.XSD.readString),
|
||||
'PositionName': ol.xml.makeObjectPropertySetter(ol.format.XSD.readString),
|
||||
'ContactInfo': ol.xml.makeObjectPropertySetter(
|
||||
ol.format.OWS.readContactInfo_)
|
||||
});
|
||||
|
||||
|
||||
/**
|
||||
@@ -402,12 +402,12 @@ ol.format.OWS.SERVICE_CONTACT_PARSERS_ =
|
||||
*/
|
||||
ol.format.OWS.SERVICE_IDENTIFICATION_PARSERS_ =
|
||||
ol.xml.makeStructureNS(
|
||||
ol.format.OWS.NAMESPACE_URIS_, {
|
||||
'Title': ol.xml.makeObjectPropertySetter(ol.format.XSD.readString),
|
||||
'ServiceTypeVersion': ol.xml.makeObjectPropertySetter(
|
||||
ol.format.XSD.readString),
|
||||
'ServiceType': ol.xml.makeObjectPropertySetter(ol.format.XSD.readString)
|
||||
});
|
||||
ol.format.OWS.NAMESPACE_URIS_, {
|
||||
'Title': ol.xml.makeObjectPropertySetter(ol.format.XSD.readString),
|
||||
'ServiceTypeVersion': ol.xml.makeObjectPropertySetter(
|
||||
ol.format.XSD.readString),
|
||||
'ServiceType': ol.xml.makeObjectPropertySetter(ol.format.XSD.readString)
|
||||
});
|
||||
|
||||
|
||||
/**
|
||||
@@ -417,9 +417,9 @@ ol.format.OWS.SERVICE_IDENTIFICATION_PARSERS_ =
|
||||
*/
|
||||
ol.format.OWS.SERVICE_PROVIDER_PARSERS_ =
|
||||
ol.xml.makeStructureNS(
|
||||
ol.format.OWS.NAMESPACE_URIS_, {
|
||||
'ProviderName': ol.xml.makeObjectPropertySetter(ol.format.XSD.readString),
|
||||
'ProviderSite': ol.xml.makeObjectPropertySetter(ol.format.XLink.readHref),
|
||||
'ServiceContact': ol.xml.makeObjectPropertySetter(
|
||||
ol.format.OWS.readServiceContact_)
|
||||
});
|
||||
ol.format.OWS.NAMESPACE_URIS_, {
|
||||
'ProviderName': ol.xml.makeObjectPropertySetter(ol.format.XSD.readString),
|
||||
'ProviderSite': ol.xml.makeObjectPropertySetter(ol.format.XLink.readHref),
|
||||
'ServiceContact': ol.xml.makeObjectPropertySetter(
|
||||
ol.format.OWS.readServiceContact_)
|
||||
});
|
||||
|
||||
@@ -46,7 +46,7 @@ ol.format.Polyline = function(opt_options) {
|
||||
* @type {ol.geom.GeometryLayout}
|
||||
*/
|
||||
this.geometryLayout_ = options.geometryLayout ?
|
||||
options.geometryLayout : ol.geom.GeometryLayout.XY;
|
||||
options.geometryLayout : ol.geom.GeometryLayout.XY;
|
||||
};
|
||||
ol.inherits(ol.format.Polyline, ol.format.TextFeature);
|
||||
|
||||
@@ -332,9 +332,9 @@ ol.format.Polyline.prototype.readGeometryFromText = function(text, opt_options)
|
||||
flatCoordinates, 0, flatCoordinates.length, stride);
|
||||
|
||||
return /** @type {ol.geom.Geometry} */ (
|
||||
ol.format.Feature.transformWithOptions(
|
||||
new ol.geom.LineString(coordinates, this.geometryLayout_), false,
|
||||
this.adaptOptions(opt_options)));
|
||||
ol.format.Feature.transformWithOptions(
|
||||
new ol.geom.LineString(coordinates, this.geometryLayout_), false,
|
||||
this.adaptOptions(opt_options)));
|
||||
};
|
||||
|
||||
|
||||
@@ -388,8 +388,8 @@ ol.format.Polyline.prototype.writeGeometry;
|
||||
*/
|
||||
ol.format.Polyline.prototype.writeGeometryText = function(geometry, opt_options) {
|
||||
geometry = /** @type {ol.geom.LineString} */
|
||||
(ol.format.Feature.transformWithOptions(
|
||||
geometry, true, this.adaptOptions(opt_options)));
|
||||
(ol.format.Feature.transformWithOptions(
|
||||
geometry, true, this.adaptOptions(opt_options)));
|
||||
var flatCoordinates = geometry.getFlatCoordinates();
|
||||
var stride = geometry.getStride();
|
||||
ol.geom.flat.flip.flipXY(
|
||||
|
||||
@@ -10,7 +10,6 @@ goog.require('ol.geom.MultiPoint');
|
||||
goog.require('ol.geom.MultiPolygon');
|
||||
goog.require('ol.geom.Point');
|
||||
goog.require('ol.geom.Polygon');
|
||||
goog.require('ol.obj');
|
||||
goog.require('ol.proj');
|
||||
|
||||
|
||||
@@ -29,12 +28,24 @@ ol.format.TopoJSON = function(opt_options) {
|
||||
|
||||
ol.format.JSONFeature.call(this);
|
||||
|
||||
/**
|
||||
* @private
|
||||
* @type {string|undefined}
|
||||
*/
|
||||
this.layerName_ = options.layerName;
|
||||
|
||||
/**
|
||||
* @private
|
||||
* @type {Array.<string>}
|
||||
*/
|
||||
this.layers_ = options.layers ? options.layers : null;
|
||||
|
||||
/**
|
||||
* @inheritDoc
|
||||
*/
|
||||
this.defaultDataProjection = ol.proj.get(
|
||||
options.defaultDataProjection ?
|
||||
options.defaultDataProjection : 'EPSG:4326');
|
||||
options.defaultDataProjection : 'EPSG:4326');
|
||||
|
||||
};
|
||||
ol.inherits(ol.format.TopoJSON, ol.format.JSONFeature);
|
||||
@@ -202,18 +213,21 @@ ol.format.TopoJSON.readMultiPolygonGeometry_ = function(object, arcs) {
|
||||
* @param {Array.<Array.<ol.Coordinate>>} arcs Array of arcs.
|
||||
* @param {Array.<number>} scale Scale for each dimension.
|
||||
* @param {Array.<number>} translate Translation for each dimension.
|
||||
* @param {string|undefined} property Property to set the `GeometryCollection`'s parent
|
||||
* object to.
|
||||
* @param {string} name Name of the `Topology`'s child object.
|
||||
* @param {olx.format.ReadOptions=} opt_options Read options.
|
||||
* @return {Array.<ol.Feature>} Array of features.
|
||||
* @private
|
||||
*/
|
||||
ol.format.TopoJSON.readFeaturesFromGeometryCollection_ = function(
|
||||
collection, arcs, scale, translate, opt_options) {
|
||||
collection, arcs, scale, translate, property, name, opt_options) {
|
||||
var geometries = collection.geometries;
|
||||
var features = [];
|
||||
var i, ii;
|
||||
for (i = 0, ii = geometries.length; i < ii; ++i) {
|
||||
features[i] = ol.format.TopoJSON.readFeatureFromGeometry_(
|
||||
geometries[i], arcs, scale, translate, opt_options);
|
||||
geometries[i], arcs, scale, translate, property, name, opt_options);
|
||||
}
|
||||
return features;
|
||||
};
|
||||
@@ -226,12 +240,15 @@ ol.format.TopoJSON.readFeaturesFromGeometryCollection_ = function(
|
||||
* @param {Array.<Array.<ol.Coordinate>>} arcs Array of arcs.
|
||||
* @param {Array.<number>} scale Scale for each dimension.
|
||||
* @param {Array.<number>} translate Translation for each dimension.
|
||||
* @param {string|undefined} property Property to set the `GeometryCollection`'s parent
|
||||
* object to.
|
||||
* @param {string} name Name of the `Topology`'s child object.
|
||||
* @param {olx.format.ReadOptions=} opt_options Read options.
|
||||
* @return {ol.Feature} Feature.
|
||||
* @private
|
||||
*/
|
||||
ol.format.TopoJSON.readFeatureFromGeometry_ = function(object, arcs,
|
||||
scale, translate, opt_options) {
|
||||
scale, translate, property, name, opt_options) {
|
||||
var geometry;
|
||||
var type = object.type;
|
||||
var geometryReader = ol.format.TopoJSON.GEOMETRY_READERS_[type];
|
||||
@@ -242,12 +259,19 @@ ol.format.TopoJSON.readFeatureFromGeometry_ = function(object, arcs,
|
||||
}
|
||||
var feature = new ol.Feature();
|
||||
feature.setGeometry(/** @type {ol.geom.Geometry} */ (
|
||||
ol.format.Feature.transformWithOptions(geometry, false, opt_options)));
|
||||
ol.format.Feature.transformWithOptions(geometry, false, opt_options)));
|
||||
if (object.id !== undefined) {
|
||||
feature.setId(object.id);
|
||||
}
|
||||
if (object.properties) {
|
||||
feature.setProperties(object.properties);
|
||||
var properties = object.properties;
|
||||
if (property) {
|
||||
if (!properties) {
|
||||
properties = {};
|
||||
}
|
||||
properties[property] = name;
|
||||
}
|
||||
if (properties) {
|
||||
feature.setProperties(properties);
|
||||
}
|
||||
return feature;
|
||||
};
|
||||
@@ -283,21 +307,24 @@ ol.format.TopoJSON.prototype.readFeaturesFromObject = function(
|
||||
}
|
||||
/** @type {Array.<ol.Feature>} */
|
||||
var features = [];
|
||||
var topoJSONFeatures = ol.obj.getValues(topoJSONTopology.objects);
|
||||
var i, ii;
|
||||
var feature;
|
||||
for (i = 0, ii = topoJSONFeatures.length; i < ii; ++i) {
|
||||
if (topoJSONFeatures[i].type === 'GeometryCollection') {
|
||||
var topoJSONFeatures = topoJSONTopology.objects;
|
||||
var property = this.layerName_;
|
||||
var objectName, feature;
|
||||
for (objectName in topoJSONFeatures) {
|
||||
if (this.layers_ && this.layers_.indexOf(objectName) == -1) {
|
||||
continue;
|
||||
}
|
||||
if (topoJSONFeatures[objectName].type === 'GeometryCollection') {
|
||||
feature = /** @type {TopoJSONGeometryCollection} */
|
||||
(topoJSONFeatures[i]);
|
||||
(topoJSONFeatures[objectName]);
|
||||
features.push.apply(features,
|
||||
ol.format.TopoJSON.readFeaturesFromGeometryCollection_(
|
||||
feature, arcs, scale, translate, opt_options));
|
||||
feature, arcs, scale, translate, property, objectName, opt_options));
|
||||
} else {
|
||||
feature = /** @type {TopoJSONGeometry} */
|
||||
(topoJSONFeatures[i]);
|
||||
(topoJSONFeatures[objectName]);
|
||||
features.push(ol.format.TopoJSON.readFeatureFromGeometry_(
|
||||
feature, arcs, scale, translate, opt_options));
|
||||
feature, arcs, scale, translate, property, objectName, opt_options));
|
||||
}
|
||||
}
|
||||
return features;
|
||||
|
||||
@@ -47,15 +47,15 @@ ol.format.WFS = function(opt_options) {
|
||||
* @type {ol.format.GMLBase}
|
||||
*/
|
||||
this.gmlFormat_ = options.gmlFormat ?
|
||||
options.gmlFormat : new ol.format.GML3();
|
||||
options.gmlFormat : new ol.format.GML3();
|
||||
|
||||
/**
|
||||
* @private
|
||||
* @type {string}
|
||||
*/
|
||||
this.schemaLocation_ = options.schemaLocation ?
|
||||
options.schemaLocation :
|
||||
ol.format.WFS.SCHEMA_LOCATIONS[ol.format.WFS.DEFAULT_VERSION];
|
||||
options.schemaLocation :
|
||||
ol.format.WFS.SCHEMA_LOCATIONS[ol.format.WFS.DEFAULT_VERSION];
|
||||
|
||||
ol.format.XMLFeature.call(this);
|
||||
};
|
||||
@@ -90,6 +90,13 @@ ol.format.WFS.OGCNS = 'http://www.opengis.net/ogc';
|
||||
ol.format.WFS.WFSNS = 'http://www.opengis.net/wfs';
|
||||
|
||||
|
||||
/**
|
||||
* @const
|
||||
* @type {string}
|
||||
*/
|
||||
ol.format.WFS.FESNS = 'http://www.opengis.net/fes';
|
||||
|
||||
|
||||
/**
|
||||
* @const
|
||||
* @type {Object.<string, string>}
|
||||
@@ -399,6 +406,25 @@ ol.format.WFS.writeOgcFidFilter_ = function(node, fid, objectStack) {
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* @param {string|undefined} featurePrefix The prefix of the feature.
|
||||
* @param {string} featureType The type of the feature.
|
||||
* @returns {string} The value of the typeName property.
|
||||
* @private
|
||||
*/
|
||||
ol.format.WFS.getTypeName_ = function(featurePrefix, featureType) {
|
||||
featurePrefix = featurePrefix ? featurePrefix :
|
||||
ol.format.WFS.FEATURE_PREFIX;
|
||||
var prefix = featurePrefix + ':';
|
||||
// The featureType already contains the prefix.
|
||||
if (featureType.indexOf(prefix) === 0) {
|
||||
return featureType;
|
||||
} else {
|
||||
return prefix + featureType;
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* @param {Node} node Node.
|
||||
* @param {ol.Feature} feature Feature.
|
||||
@@ -410,10 +436,9 @@ ol.format.WFS.writeDelete_ = function(node, feature, objectStack) {
|
||||
ol.asserts.assert(feature.getId() !== undefined, 26); // Features must have an id set
|
||||
var featureType = context['featureType'];
|
||||
var featurePrefix = context['featurePrefix'];
|
||||
featurePrefix = featurePrefix ? featurePrefix :
|
||||
ol.format.WFS.FEATURE_PREFIX;
|
||||
var featureNS = context['featureNS'];
|
||||
node.setAttribute('typeName', featurePrefix + ':' + featureType);
|
||||
var typeName = ol.format.WFS.getTypeName_(featurePrefix, featureType);
|
||||
node.setAttribute('typeName', typeName);
|
||||
ol.xml.setAttributeNS(node, ol.format.WFS.XMLNS, 'xmlns:' + featurePrefix,
|
||||
featureNS);
|
||||
var fid = feature.getId();
|
||||
@@ -434,10 +459,9 @@ ol.format.WFS.writeUpdate_ = function(node, feature, objectStack) {
|
||||
ol.asserts.assert(feature.getId() !== undefined, 27); // Features must have an id set
|
||||
var featureType = context['featureType'];
|
||||
var featurePrefix = context['featurePrefix'];
|
||||
featurePrefix = featurePrefix ? featurePrefix :
|
||||
ol.format.WFS.FEATURE_PREFIX;
|
||||
var featureNS = context['featureNS'];
|
||||
node.setAttribute('typeName', featurePrefix + ':' + featureType);
|
||||
var typeName = ol.format.WFS.getTypeName_(featurePrefix, featureType);
|
||||
node.setAttribute('typeName', typeName);
|
||||
ol.xml.setAttributeNS(node, ol.format.WFS.XMLNS, 'xmlns:' + featurePrefix,
|
||||
featureNS);
|
||||
var fid = feature.getId();
|
||||
@@ -452,10 +476,10 @@ ol.format.WFS.writeUpdate_ = function(node, feature, objectStack) {
|
||||
}
|
||||
ol.xml.pushSerializeAndPop(/** @type {ol.XmlNodeStackItem} */ (
|
||||
{'gmlVersion': context['gmlVersion'], node: node,
|
||||
'srsName': context['srsName']}),
|
||||
ol.format.WFS.TRANSACTION_SERIALIZERS_,
|
||||
ol.xml.makeSimpleNodeFactory('Property'), values,
|
||||
objectStack);
|
||||
'hasZ': context['hasZ'], 'srsName': context['srsName']}),
|
||||
ol.format.WFS.TRANSACTION_SERIALIZERS_,
|
||||
ol.xml.makeSimpleNodeFactory('Property'), values,
|
||||
objectStack);
|
||||
ol.format.WFS.writeOgcFidFilter_(node, fid, objectStack);
|
||||
}
|
||||
};
|
||||
@@ -538,8 +562,14 @@ ol.format.WFS.writeQuery_ = function(node, featureType, objectStack) {
|
||||
var featureNS = context['featureNS'];
|
||||
var propertyNames = context['propertyNames'];
|
||||
var srsName = context['srsName'];
|
||||
var prefix = featurePrefix ? featurePrefix + ':' : '';
|
||||
node.setAttribute('typeName', prefix + featureType);
|
||||
var typeName;
|
||||
// If feature prefix is not defined, we must not use the default prefix.
|
||||
if (featurePrefix) {
|
||||
typeName = ol.format.WFS.getTypeName_(featurePrefix, featureType);
|
||||
} else {
|
||||
typeName = featureType;
|
||||
}
|
||||
node.setAttribute('typeName', typeName);
|
||||
if (srsName) {
|
||||
node.setAttribute('srsName', srsName);
|
||||
}
|
||||
@@ -623,6 +653,32 @@ ol.format.WFS.writeWithinFilter_ = function(node, filter, objectStack) {
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* @param {Node} node Node.
|
||||
* @param {ol.format.filter.During} filter Filter.
|
||||
* @param {Array.<*>} objectStack Node stack.
|
||||
* @private
|
||||
*/
|
||||
ol.format.WFS.writeDuringFilter_ = function(node, filter, objectStack) {
|
||||
|
||||
var valueReference = ol.xml.createElementNS(ol.format.WFS.FESNS, 'ValueReference');
|
||||
ol.format.XSD.writeStringTextNode(valueReference, filter.propertyName);
|
||||
node.appendChild(valueReference);
|
||||
|
||||
var timePeriod = ol.xml.createElementNS(ol.format.GMLBase.GMLNS, 'TimePeriod');
|
||||
|
||||
node.appendChild(timePeriod);
|
||||
|
||||
var begin = ol.xml.createElementNS(ol.format.GMLBase.GMLNS, 'begin');
|
||||
timePeriod.appendChild(begin);
|
||||
ol.format.WFS.writeTimeInstant_(begin, filter.begin);
|
||||
|
||||
var end = ol.xml.createElementNS(ol.format.GMLBase.GMLNS, 'end');
|
||||
timePeriod.appendChild(end);
|
||||
ol.format.WFS.writeTimeInstant_(end, filter.end);
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* @param {Node} node Node.
|
||||
* @param {ol.format.filter.LogicalNary} filter Filter.
|
||||
@@ -632,12 +688,14 @@ ol.format.WFS.writeWithinFilter_ = function(node, filter, objectStack) {
|
||||
ol.format.WFS.writeLogicalFilter_ = function(node, filter, objectStack) {
|
||||
/** @type {ol.XmlNodeStackItem} */
|
||||
var item = {node: node};
|
||||
filter.conditions.forEach(function(condition) {
|
||||
var conditions = filter.conditions;
|
||||
for (var i = 0, ii = conditions.length; i < ii; ++i) {
|
||||
var condition = conditions[i];
|
||||
ol.xml.pushSerializeAndPop(item,
|
||||
ol.format.WFS.GETFEATURE_SERIALIZERS_,
|
||||
ol.xml.makeSimpleNodeFactory(condition.getTagName()),
|
||||
[condition], objectStack);
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
@@ -754,6 +812,21 @@ ol.format.WFS.writeOgcLiteral_ = function(node, value) {
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* @param {Node} node Node.
|
||||
* @param {string} time PropertyName value.
|
||||
* @private
|
||||
*/
|
||||
ol.format.WFS.writeTimeInstant_ = function(node, time) {
|
||||
var timeInstant = ol.xml.createElementNS(ol.format.GMLBase.GMLNS, 'TimeInstant');
|
||||
node.appendChild(timeInstant);
|
||||
|
||||
var timePosition = ol.xml.createElementNS(ol.format.GMLBase.GMLNS, 'timePosition');
|
||||
timeInstant.appendChild(timePosition);
|
||||
ol.format.XSD.writeStringTextNode(timePosition, time);
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* @type {Object.<string, Object.<string, ol.XmlSerializer>>}
|
||||
* @private
|
||||
@@ -763,6 +836,7 @@ ol.format.WFS.GETFEATURE_SERIALIZERS_ = {
|
||||
'Query': ol.xml.makeChildAppender(ol.format.WFS.writeQuery_)
|
||||
},
|
||||
'http://www.opengis.net/ogc': {
|
||||
'During': ol.xml.makeChildAppender(ol.format.WFS.writeDuringFilter_),
|
||||
'And': ol.xml.makeChildAppender(ol.format.WFS.writeLogicalFilter_),
|
||||
'Or': ol.xml.makeChildAppender(ol.format.WFS.writeLogicalFilter_),
|
||||
'Not': ol.xml.makeChildAppender(ol.format.WFS.writeNotFilter_),
|
||||
@@ -892,7 +966,7 @@ ol.format.WFS.prototype.writeTransaction = function(inserts, updates, deletes,
|
||||
var objectStack = [];
|
||||
var node = ol.xml.createElementNS(ol.format.WFS.WFSNS, 'Transaction');
|
||||
var version = options.version ?
|
||||
options.version : ol.format.WFS.DEFAULT_VERSION;
|
||||
options.version : ol.format.WFS.DEFAULT_VERSION;
|
||||
var gmlVersion = version === '1.0.0' ? 2 : 3;
|
||||
node.setAttribute('service', 'WFS');
|
||||
node.setAttribute('version', version);
|
||||
@@ -908,10 +982,11 @@ ol.format.WFS.prototype.writeTransaction = function(inserts, updates, deletes,
|
||||
var schemaLocation = ol.format.WFS.SCHEMA_LOCATIONS[version];
|
||||
ol.xml.setAttributeNS(node, 'http://www.w3.org/2001/XMLSchema-instance',
|
||||
'xsi:schemaLocation', schemaLocation);
|
||||
var featurePrefix = options.featurePrefix ? options.featurePrefix : ol.format.WFS.FEATURE_PREFIX;
|
||||
if (inserts) {
|
||||
obj = {node: node, 'featureNS': options.featureNS,
|
||||
'featureType': options.featureType, 'featurePrefix': options.featurePrefix,
|
||||
'gmlVersion': gmlVersion, 'srsName': options.srsName};
|
||||
'featureType': options.featureType, 'featurePrefix': featurePrefix,
|
||||
'gmlVersion': gmlVersion, 'hasZ': options.hasZ, 'srsName': options.srsName};
|
||||
ol.obj.assign(obj, baseObj);
|
||||
ol.xml.pushSerializeAndPop(obj,
|
||||
ol.format.WFS.TRANSACTION_SERIALIZERS_,
|
||||
@@ -920,8 +995,8 @@ ol.format.WFS.prototype.writeTransaction = function(inserts, updates, deletes,
|
||||
}
|
||||
if (updates) {
|
||||
obj = {node: node, 'featureNS': options.featureNS,
|
||||
'featureType': options.featureType, 'featurePrefix': options.featurePrefix,
|
||||
'gmlVersion': gmlVersion, 'srsName': options.srsName};
|
||||
'featureType': options.featureType, 'featurePrefix': featurePrefix,
|
||||
'gmlVersion': gmlVersion, 'hasZ': options.hasZ, 'srsName': options.srsName};
|
||||
ol.obj.assign(obj, baseObj);
|
||||
ol.xml.pushSerializeAndPop(obj,
|
||||
ol.format.WFS.TRANSACTION_SERIALIZERS_,
|
||||
@@ -930,7 +1005,7 @@ ol.format.WFS.prototype.writeTransaction = function(inserts, updates, deletes,
|
||||
}
|
||||
if (deletes) {
|
||||
ol.xml.pushSerializeAndPop({node: node, 'featureNS': options.featureNS,
|
||||
'featureType': options.featureType, 'featurePrefix': options.featurePrefix,
|
||||
'featureType': options.featureType, 'featurePrefix': featurePrefix,
|
||||
'gmlVersion': gmlVersion, 'srsName': options.srsName},
|
||||
ol.format.WFS.TRANSACTION_SERIALIZERS_,
|
||||
ol.xml.makeSimpleNodeFactory('Delete'), deletes,
|
||||
@@ -938,7 +1013,7 @@ ol.format.WFS.prototype.writeTransaction = function(inserts, updates, deletes,
|
||||
}
|
||||
if (options.nativeElements) {
|
||||
ol.xml.pushSerializeAndPop({node: node, 'featureNS': options.featureNS,
|
||||
'featureType': options.featureType, 'featurePrefix': options.featurePrefix,
|
||||
'featureType': options.featureType, 'featurePrefix': featurePrefix,
|
||||
'gmlVersion': gmlVersion, 'srsName': options.srsName},
|
||||
ol.format.WFS.TRANSACTION_SERIALIZERS_,
|
||||
ol.xml.makeSimpleNodeFactory('Native'), options.nativeElements,
|
||||
|
||||
@@ -38,7 +38,7 @@ ol.format.WKT = function(opt_options) {
|
||||
* @private
|
||||
*/
|
||||
this.splitCollection_ = options.splitCollection !== undefined ?
|
||||
options.splitCollection : false;
|
||||
options.splitCollection : false;
|
||||
|
||||
};
|
||||
ol.inherits(ol.format.WKT, ol.format.TextFeature);
|
||||
@@ -330,7 +330,7 @@ ol.format.WKT.prototype.readGeometryFromText = function(text, opt_options) {
|
||||
var geometry = this.parse_(text);
|
||||
if (geometry) {
|
||||
return /** @type {ol.geom.Geometry} */ (
|
||||
ol.format.Feature.transformWithOptions(geometry, false, opt_options));
|
||||
ol.format.Feature.transformWithOptions(geometry, false, opt_options));
|
||||
} else {
|
||||
return null;
|
||||
}
|
||||
@@ -405,7 +405,7 @@ ol.format.WKT.prototype.writeGeometry;
|
||||
*/
|
||||
ol.format.WKT.prototype.writeGeometryText = function(geometry, opt_options) {
|
||||
return ol.format.WKT.encode_(/** @type {ol.geom.Geometry} */ (
|
||||
ol.format.Feature.transformWithOptions(geometry, true, opt_options)));
|
||||
ol.format.Feature.transformWithOptions(geometry, true, opt_options)));
|
||||
};
|
||||
|
||||
|
||||
@@ -535,7 +535,7 @@ ol.format.WKT.Lexer.prototype.readNumber_ = function() {
|
||||
}
|
||||
c = this.nextChar_();
|
||||
} while (
|
||||
this.isNumeric_(c, decimal) ||
|
||||
this.isNumeric_(c, decimal) ||
|
||||
// if we haven't detected a scientific number before, 'e' or 'E'
|
||||
// hint that we should continue to read
|
||||
!scientificNotation && (c == 'e' || c == 'E') ||
|
||||
|
||||
@@ -71,7 +71,7 @@ ol.format.WMSCapabilities.prototype.readFromNode = function(node) {
|
||||
*/
|
||||
ol.format.WMSCapabilities.readAttribution_ = function(node, objectStack) {
|
||||
return ol.xml.pushParseAndPop(
|
||||
{}, ol.format.WMSCapabilities.ATTRIBUTION_PARSERS_, node, objectStack);
|
||||
{}, ol.format.WMSCapabilities.ATTRIBUTION_PARSERS_, node, objectStack);
|
||||
};
|
||||
|
||||
|
||||
@@ -110,9 +110,9 @@ ol.format.WMSCapabilities.readBoundingBox_ = function(node, objectStack) {
|
||||
*/
|
||||
ol.format.WMSCapabilities.readEXGeographicBoundingBox_ = function(node, objectStack) {
|
||||
var geographicBoundingBox = ol.xml.pushParseAndPop(
|
||||
{},
|
||||
ol.format.WMSCapabilities.EX_GEOGRAPHIC_BOUNDING_BOX_PARSERS_,
|
||||
node, objectStack);
|
||||
{},
|
||||
ol.format.WMSCapabilities.EX_GEOGRAPHIC_BOUNDING_BOX_PARSERS_,
|
||||
node, objectStack);
|
||||
if (!geographicBoundingBox) {
|
||||
return undefined;
|
||||
}
|
||||
@@ -143,7 +143,7 @@ ol.format.WMSCapabilities.readEXGeographicBoundingBox_ = function(node, objectSt
|
||||
*/
|
||||
ol.format.WMSCapabilities.readCapability_ = function(node, objectStack) {
|
||||
return ol.xml.pushParseAndPop(
|
||||
{}, ol.format.WMSCapabilities.CAPABILITY_PARSERS_, node, objectStack);
|
||||
{}, ol.format.WMSCapabilities.CAPABILITY_PARSERS_, node, objectStack);
|
||||
};
|
||||
|
||||
|
||||
@@ -155,7 +155,7 @@ ol.format.WMSCapabilities.readCapability_ = function(node, objectStack) {
|
||||
*/
|
||||
ol.format.WMSCapabilities.readService_ = function(node, objectStack) {
|
||||
return ol.xml.pushParseAndPop(
|
||||
{}, ol.format.WMSCapabilities.SERVICE_PARSERS_, node, objectStack);
|
||||
{}, ol.format.WMSCapabilities.SERVICE_PARSERS_, node, objectStack);
|
||||
};
|
||||
|
||||
|
||||
@@ -167,8 +167,8 @@ ol.format.WMSCapabilities.readService_ = function(node, objectStack) {
|
||||
*/
|
||||
ol.format.WMSCapabilities.readContactInformation_ = function(node, objectStack) {
|
||||
return ol.xml.pushParseAndPop(
|
||||
{}, ol.format.WMSCapabilities.CONTACT_INFORMATION_PARSERS_,
|
||||
node, objectStack);
|
||||
{}, ol.format.WMSCapabilities.CONTACT_INFORMATION_PARSERS_,
|
||||
node, objectStack);
|
||||
};
|
||||
|
||||
|
||||
@@ -180,8 +180,8 @@ ol.format.WMSCapabilities.readContactInformation_ = function(node, objectStack)
|
||||
*/
|
||||
ol.format.WMSCapabilities.readContactPersonPrimary_ = function(node, objectStack) {
|
||||
return ol.xml.pushParseAndPop(
|
||||
{}, ol.format.WMSCapabilities.CONTACT_PERSON_PARSERS_,
|
||||
node, objectStack);
|
||||
{}, ol.format.WMSCapabilities.CONTACT_PERSON_PARSERS_,
|
||||
node, objectStack);
|
||||
};
|
||||
|
||||
|
||||
@@ -193,8 +193,8 @@ ol.format.WMSCapabilities.readContactPersonPrimary_ = function(node, objectStack
|
||||
*/
|
||||
ol.format.WMSCapabilities.readContactAddress_ = function(node, objectStack) {
|
||||
return ol.xml.pushParseAndPop(
|
||||
{}, ol.format.WMSCapabilities.CONTACT_ADDRESS_PARSERS_,
|
||||
node, objectStack);
|
||||
{}, ol.format.WMSCapabilities.CONTACT_ADDRESS_PARSERS_,
|
||||
node, objectStack);
|
||||
};
|
||||
|
||||
|
||||
@@ -206,7 +206,7 @@ ol.format.WMSCapabilities.readContactAddress_ = function(node, objectStack) {
|
||||
*/
|
||||
ol.format.WMSCapabilities.readException_ = function(node, objectStack) {
|
||||
return ol.xml.pushParseAndPop(
|
||||
[], ol.format.WMSCapabilities.EXCEPTION_PARSERS_, node, objectStack);
|
||||
[], ol.format.WMSCapabilities.EXCEPTION_PARSERS_, node, objectStack);
|
||||
};
|
||||
|
||||
|
||||
@@ -218,7 +218,7 @@ ol.format.WMSCapabilities.readException_ = function(node, objectStack) {
|
||||
*/
|
||||
ol.format.WMSCapabilities.readCapabilityLayer_ = function(node, objectStack) {
|
||||
return ol.xml.pushParseAndPop(
|
||||
{}, ol.format.WMSCapabilities.LAYER_PARSERS_, node, objectStack);
|
||||
{}, ol.format.WMSCapabilities.LAYER_PARSERS_, node, objectStack);
|
||||
};
|
||||
|
||||
|
||||
@@ -233,7 +233,7 @@ ol.format.WMSCapabilities.readLayer_ = function(node, objectStack) {
|
||||
(objectStack[objectStack.length - 1]);
|
||||
|
||||
var layerObject = ol.xml.pushParseAndPop(
|
||||
{}, ol.format.WMSCapabilities.LAYER_PARSERS_, node, objectStack);
|
||||
{}, ol.format.WMSCapabilities.LAYER_PARSERS_, node, objectStack);
|
||||
|
||||
if (!layerObject) {
|
||||
return undefined;
|
||||
@@ -246,7 +246,7 @@ ol.format.WMSCapabilities.readLayer_ = function(node, objectStack) {
|
||||
layerObject['queryable'] = queryable !== undefined ? queryable : false;
|
||||
|
||||
var cascaded = ol.format.XSD.readNonNegativeIntegerString(
|
||||
node.getAttribute('cascaded'));
|
||||
node.getAttribute('cascaded'));
|
||||
if (cascaded === undefined) {
|
||||
cascaded = parentLayerObject['cascaded'];
|
||||
}
|
||||
@@ -279,7 +279,7 @@ ol.format.WMSCapabilities.readLayer_ = function(node, objectStack) {
|
||||
}
|
||||
layerObject['fixedHeight'] = fixedHeight;
|
||||
|
||||
// See 7.2.4.8
|
||||
// See 7.2.4.8
|
||||
var addKeys = ['Style', 'CRS', 'AuthorityURL'];
|
||||
addKeys.forEach(function(key) {
|
||||
if (key in parentLayerObject) {
|
||||
@@ -314,9 +314,9 @@ ol.format.WMSCapabilities.readDimension_ = function(node, objectStack) {
|
||||
'unitSymbol': node.getAttribute('unitSymbol'),
|
||||
'default': node.getAttribute('default'),
|
||||
'multipleValues': ol.format.XSD.readBooleanString(
|
||||
node.getAttribute('multipleValues')),
|
||||
node.getAttribute('multipleValues')),
|
||||
'nearestValue': ol.format.XSD.readBooleanString(
|
||||
node.getAttribute('nearestValue')),
|
||||
node.getAttribute('nearestValue')),
|
||||
'current': ol.format.XSD.readBooleanString(node.getAttribute('current')),
|
||||
'values': ol.format.XSD.readString(node)
|
||||
};
|
||||
@@ -332,8 +332,8 @@ ol.format.WMSCapabilities.readDimension_ = function(node, objectStack) {
|
||||
*/
|
||||
ol.format.WMSCapabilities.readFormatOnlineresource_ = function(node, objectStack) {
|
||||
return ol.xml.pushParseAndPop(
|
||||
{}, ol.format.WMSCapabilities.FORMAT_ONLINERESOURCE_PARSERS_,
|
||||
node, objectStack);
|
||||
{}, ol.format.WMSCapabilities.FORMAT_ONLINERESOURCE_PARSERS_,
|
||||
node, objectStack);
|
||||
};
|
||||
|
||||
|
||||
@@ -345,7 +345,7 @@ ol.format.WMSCapabilities.readFormatOnlineresource_ = function(node, objectStack
|
||||
*/
|
||||
ol.format.WMSCapabilities.readRequest_ = function(node, objectStack) {
|
||||
return ol.xml.pushParseAndPop(
|
||||
{}, ol.format.WMSCapabilities.REQUEST_PARSERS_, node, objectStack);
|
||||
{}, ol.format.WMSCapabilities.REQUEST_PARSERS_, node, objectStack);
|
||||
};
|
||||
|
||||
|
||||
@@ -357,7 +357,7 @@ ol.format.WMSCapabilities.readRequest_ = function(node, objectStack) {
|
||||
*/
|
||||
ol.format.WMSCapabilities.readDCPType_ = function(node, objectStack) {
|
||||
return ol.xml.pushParseAndPop(
|
||||
{}, ol.format.WMSCapabilities.DCPTYPE_PARSERS_, node, objectStack);
|
||||
{}, ol.format.WMSCapabilities.DCPTYPE_PARSERS_, node, objectStack);
|
||||
};
|
||||
|
||||
|
||||
@@ -369,7 +369,7 @@ ol.format.WMSCapabilities.readDCPType_ = function(node, objectStack) {
|
||||
*/
|
||||
ol.format.WMSCapabilities.readHTTP_ = function(node, objectStack) {
|
||||
return ol.xml.pushParseAndPop(
|
||||
{}, ol.format.WMSCapabilities.HTTP_PARSERS_, node, objectStack);
|
||||
{}, ol.format.WMSCapabilities.HTTP_PARSERS_, node, objectStack);
|
||||
};
|
||||
|
||||
|
||||
@@ -381,7 +381,7 @@ ol.format.WMSCapabilities.readHTTP_ = function(node, objectStack) {
|
||||
*/
|
||||
ol.format.WMSCapabilities.readOperationType_ = function(node, objectStack) {
|
||||
return ol.xml.pushParseAndPop(
|
||||
{}, ol.format.WMSCapabilities.OPERATIONTYPE_PARSERS_, node, objectStack);
|
||||
{}, ol.format.WMSCapabilities.OPERATIONTYPE_PARSERS_, node, objectStack);
|
||||
};
|
||||
|
||||
|
||||
@@ -448,7 +448,7 @@ ol.format.WMSCapabilities.readMetadataURL_ = function(node, objectStack) {
|
||||
*/
|
||||
ol.format.WMSCapabilities.readStyle_ = function(node, objectStack) {
|
||||
return ol.xml.pushParseAndPop(
|
||||
{}, ol.format.WMSCapabilities.STYLE_PARSERS_, node, objectStack);
|
||||
{}, ol.format.WMSCapabilities.STYLE_PARSERS_, node, objectStack);
|
||||
};
|
||||
|
||||
|
||||
@@ -460,7 +460,7 @@ ol.format.WMSCapabilities.readStyle_ = function(node, objectStack) {
|
||||
*/
|
||||
ol.format.WMSCapabilities.readKeywordList_ = function(node, objectStack) {
|
||||
return ol.xml.pushParseAndPop(
|
||||
[], ol.format.WMSCapabilities.KEYWORDLIST_PARSERS_, node, objectStack);
|
||||
[], ol.format.WMSCapabilities.KEYWORDLIST_PARSERS_, node, objectStack);
|
||||
};
|
||||
|
||||
|
||||
|
||||
@@ -64,7 +64,7 @@ ol.format.WMTSCapabilities.prototype.readFromNode = function(node) {
|
||||
}
|
||||
WMTSCapabilityObject['version'] = version;
|
||||
WMTSCapabilityObject = ol.xml.pushParseAndPop(WMTSCapabilityObject,
|
||||
ol.format.WMTSCapabilities.PARSERS_, node, []);
|
||||
ol.format.WMTSCapabilities.PARSERS_, node, []);
|
||||
return WMTSCapabilityObject ? WMTSCapabilityObject : null;
|
||||
};
|
||||
|
||||
@@ -77,7 +77,7 @@ ol.format.WMTSCapabilities.prototype.readFromNode = function(node) {
|
||||
*/
|
||||
ol.format.WMTSCapabilities.readContents_ = function(node, objectStack) {
|
||||
return ol.xml.pushParseAndPop({},
|
||||
ol.format.WMTSCapabilities.CONTENTS_PARSERS_, node, objectStack);
|
||||
ol.format.WMTSCapabilities.CONTENTS_PARSERS_, node, objectStack);
|
||||
};
|
||||
|
||||
|
||||
@@ -89,7 +89,7 @@ ol.format.WMTSCapabilities.readContents_ = function(node, objectStack) {
|
||||
*/
|
||||
ol.format.WMTSCapabilities.readLayer_ = function(node, objectStack) {
|
||||
return ol.xml.pushParseAndPop({},
|
||||
ol.format.WMTSCapabilities.LAYER_PARSERS_, node, objectStack);
|
||||
ol.format.WMTSCapabilities.LAYER_PARSERS_, node, objectStack);
|
||||
};
|
||||
|
||||
|
||||
|
||||
@@ -3,15 +3,16 @@
|
||||
goog.provide('ol.Geolocation');
|
||||
|
||||
goog.require('ol');
|
||||
goog.require('ol.Object');
|
||||
goog.require('ol.GeolocationProperty');
|
||||
goog.require('ol.Object');
|
||||
goog.require('ol.Sphere');
|
||||
goog.require('ol.events');
|
||||
goog.require('ol.events.EventType');
|
||||
goog.require('ol.geom.Polygon');
|
||||
goog.require('ol.has');
|
||||
goog.require('ol.math');
|
||||
goog.require('ol.proj');
|
||||
goog.require('ol.sphere.WGS84');
|
||||
goog.require('ol.proj.EPSG4326');
|
||||
|
||||
|
||||
/**
|
||||
@@ -59,6 +60,12 @@ ol.Geolocation = function(opt_options) {
|
||||
*/
|
||||
this.transform_ = ol.proj.identityTransform;
|
||||
|
||||
/**
|
||||
* @private
|
||||
* @type {ol.Sphere}
|
||||
*/
|
||||
this.sphere_ = new ol.Sphere(ol.proj.EPSG4326.RADIUS);
|
||||
|
||||
/**
|
||||
* @private
|
||||
* @type {number|undefined}
|
||||
@@ -73,7 +80,7 @@ ol.Geolocation = function(opt_options) {
|
||||
this.handleTrackingChanged_, this);
|
||||
|
||||
if (options.projection !== undefined) {
|
||||
this.setProjection(ol.proj.get(options.projection));
|
||||
this.setProjection(options.projection);
|
||||
}
|
||||
if (options.trackingOptions !== undefined) {
|
||||
this.setTrackingOptions(options.trackingOptions);
|
||||
@@ -140,9 +147,9 @@ ol.Geolocation.prototype.positionChange_ = function(position) {
|
||||
coords.altitude === null ? undefined : coords.altitude);
|
||||
this.set(ol.GeolocationProperty.ALTITUDE_ACCURACY,
|
||||
coords.altitudeAccuracy === null ?
|
||||
undefined : coords.altitudeAccuracy);
|
||||
undefined : coords.altitudeAccuracy);
|
||||
this.set(ol.GeolocationProperty.HEADING, coords.heading === null ?
|
||||
undefined : ol.math.toRadians(coords.heading));
|
||||
undefined : ol.math.toRadians(coords.heading));
|
||||
if (!this.position_) {
|
||||
this.position_ = [coords.longitude, coords.latitude];
|
||||
} else {
|
||||
@@ -154,7 +161,7 @@ ol.Geolocation.prototype.positionChange_ = function(position) {
|
||||
this.set(ol.GeolocationProperty.SPEED,
|
||||
coords.speed === null ? undefined : coords.speed);
|
||||
var geometry = ol.geom.Polygon.circular(
|
||||
ol.sphere.WGS84, this.position_, coords.accuracy);
|
||||
this.sphere_, this.position_, coords.accuracy);
|
||||
geometry.applyTransform(this.transform_);
|
||||
this.set(ol.GeolocationProperty.ACCURACY_GEOMETRY, geometry);
|
||||
this.changed();
|
||||
@@ -186,7 +193,7 @@ ol.Geolocation.prototype.positionError_ = function(error) {
|
||||
*/
|
||||
ol.Geolocation.prototype.getAccuracy = function() {
|
||||
return /** @type {number|undefined} */ (
|
||||
this.get(ol.GeolocationProperty.ACCURACY));
|
||||
this.get(ol.GeolocationProperty.ACCURACY));
|
||||
};
|
||||
|
||||
|
||||
@@ -198,7 +205,7 @@ ol.Geolocation.prototype.getAccuracy = function() {
|
||||
*/
|
||||
ol.Geolocation.prototype.getAccuracyGeometry = function() {
|
||||
return /** @type {?ol.geom.Polygon} */ (
|
||||
this.get(ol.GeolocationProperty.ACCURACY_GEOMETRY) || null);
|
||||
this.get(ol.GeolocationProperty.ACCURACY_GEOMETRY) || null);
|
||||
};
|
||||
|
||||
|
||||
@@ -211,7 +218,7 @@ ol.Geolocation.prototype.getAccuracyGeometry = function() {
|
||||
*/
|
||||
ol.Geolocation.prototype.getAltitude = function() {
|
||||
return /** @type {number|undefined} */ (
|
||||
this.get(ol.GeolocationProperty.ALTITUDE));
|
||||
this.get(ol.GeolocationProperty.ALTITUDE));
|
||||
};
|
||||
|
||||
|
||||
@@ -224,7 +231,7 @@ ol.Geolocation.prototype.getAltitude = function() {
|
||||
*/
|
||||
ol.Geolocation.prototype.getAltitudeAccuracy = function() {
|
||||
return /** @type {number|undefined} */ (
|
||||
this.get(ol.GeolocationProperty.ALTITUDE_ACCURACY));
|
||||
this.get(ol.GeolocationProperty.ALTITUDE_ACCURACY));
|
||||
};
|
||||
|
||||
|
||||
@@ -236,7 +243,7 @@ ol.Geolocation.prototype.getAltitudeAccuracy = function() {
|
||||
*/
|
||||
ol.Geolocation.prototype.getHeading = function() {
|
||||
return /** @type {number|undefined} */ (
|
||||
this.get(ol.GeolocationProperty.HEADING));
|
||||
this.get(ol.GeolocationProperty.HEADING));
|
||||
};
|
||||
|
||||
|
||||
@@ -249,7 +256,7 @@ ol.Geolocation.prototype.getHeading = function() {
|
||||
*/
|
||||
ol.Geolocation.prototype.getPosition = function() {
|
||||
return /** @type {ol.Coordinate|undefined} */ (
|
||||
this.get(ol.GeolocationProperty.POSITION));
|
||||
this.get(ol.GeolocationProperty.POSITION));
|
||||
};
|
||||
|
||||
|
||||
@@ -262,7 +269,7 @@ ol.Geolocation.prototype.getPosition = function() {
|
||||
*/
|
||||
ol.Geolocation.prototype.getProjection = function() {
|
||||
return /** @type {ol.proj.Projection|undefined} */ (
|
||||
this.get(ol.GeolocationProperty.PROJECTION));
|
||||
this.get(ol.GeolocationProperty.PROJECTION));
|
||||
};
|
||||
|
||||
|
||||
@@ -275,7 +282,7 @@ ol.Geolocation.prototype.getProjection = function() {
|
||||
*/
|
||||
ol.Geolocation.prototype.getSpeed = function() {
|
||||
return /** @type {number|undefined} */ (
|
||||
this.get(ol.GeolocationProperty.SPEED));
|
||||
this.get(ol.GeolocationProperty.SPEED));
|
||||
};
|
||||
|
||||
|
||||
@@ -287,7 +294,7 @@ ol.Geolocation.prototype.getSpeed = function() {
|
||||
*/
|
||||
ol.Geolocation.prototype.getTracking = function() {
|
||||
return /** @type {boolean} */ (
|
||||
this.get(ol.GeolocationProperty.TRACKING));
|
||||
this.get(ol.GeolocationProperty.TRACKING));
|
||||
};
|
||||
|
||||
|
||||
@@ -302,19 +309,19 @@ ol.Geolocation.prototype.getTracking = function() {
|
||||
*/
|
||||
ol.Geolocation.prototype.getTrackingOptions = function() {
|
||||
return /** @type {GeolocationPositionOptions|undefined} */ (
|
||||
this.get(ol.GeolocationProperty.TRACKING_OPTIONS));
|
||||
this.get(ol.GeolocationProperty.TRACKING_OPTIONS));
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* Set the projection to use for transforming the coordinates.
|
||||
* @param {ol.proj.Projection} projection The projection the position is
|
||||
* @param {ol.ProjectionLike} projection The projection the position is
|
||||
* reported in.
|
||||
* @observable
|
||||
* @api
|
||||
*/
|
||||
ol.Geolocation.prototype.setProjection = function(projection) {
|
||||
this.set(ol.GeolocationProperty.PROJECTION, projection);
|
||||
this.set(ol.GeolocationProperty.PROJECTION, ol.proj.get(projection));
|
||||
};
|
||||
|
||||
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user