Compare commits

..

567 Commits

Author SHA1 Message Date
ahocevar
f02f6a11ab Version and beta tag for v6.0.0-beta.1 2019-02-04 14:00:42 +01:00
Andreas Hocevar
83e7e3ad5c Merge pull request #9178 from ahocevar/sources-for-typescript
Sources in npm package for TypeScript support
2019-02-04 13:55:04 +01:00
Andreas Hocevar
47adce4786 Merge pull request #9181 from ahocevar/test-removefeature-on-point
Add test to verify that removefeature is triggered
2019-02-04 13:02:35 +01:00
ahocevar
ce7a1b4365 Add test to verify that removefeature is triggered 2019-02-04 12:46:51 +01:00
ahocevar
686e493288 Document TypeScript configuration in the README 2019-02-03 23:46:37 +01:00
ahocevar
5e16bae134 Provide sources in ol package 2019-02-03 23:46:37 +01:00
Andreas Hocevar
53fc082fc2 Merge pull request #9173 from ahocevar/render-event-docs
Document the correct render events
2019-01-31 15:50:39 +01:00
ahocevar
47679a9686 Document the correct render events 2019-01-31 14:05:10 +01:00
Andreas Hocevar
b76626071b Merge pull request #9167 from ahocevar/jsdoc-fixes
JSDoc fixes
2019-01-30 12:44:08 +01:00
ahocevar
37eb6de37d JSDoc fixes 2019-01-30 09:42:20 +01:00
Marc Jansen
5e7cf6da66 Merge pull request #9164 from KlausBenndorf/doc
event chain documentation
2019-01-28 21:27:36 +01:00
simonseyock
c18a833880 event chain documentation 2019-01-28 20:50:33 +01:00
Frédéric Junod
8674da9a3e Merge pull request #9157 from fredj/rm_inherits
Remove deprecated inherits function
2019-01-28 11:01:07 +01:00
Andreas Hocevar
61b20da539 Merge pull request #9152 from ahocevar/vectortile-optimizations
Vector tile optimizations
2019-01-25 17:03:42 +01:00
Frederic Junod
1ba85a11e9 Change 'cacheSize' description in typedef 2019-01-25 16:50:17 +01:00
ahocevar
59cf0c31b6 Allow bigger cache now that we do less clipping 2019-01-25 16:50:12 +01:00
ahocevar
4f487c4df1 Update comment 2019-01-25 16:49:35 +01:00
ahocevar
6e58796f66 Do not keep potentially unused tiles in the render queue 2019-01-25 16:49:34 +01:00
ahocevar
26ff8899c3 Do not load new tiles when low on frame budget 2019-01-25 16:49:34 +01:00
Frederic Junod
fe5da2e160 Remove deprecated inherits function 2019-01-25 16:33:02 +01:00
Andreas Hocevar
862553509a Merge pull request #9154 from ahocevar/screen-self
Safer check for window.screen
2019-01-25 13:55:45 +01:00
ahocevar
164635f28c Safer check for window.screen 2019-01-25 12:01:36 +01:00
Andreas Hocevar
3e6425db86 Merge pull request #9150 from ahocevar/no-clipping
Avoid clipping when rendering to tiles that don't exceed the clip extent
2019-01-24 10:33:40 +01:00
ahocevar
09a1c1ef1b Avoid clipping when rendering to tiles that don't exceed the clip extent 2019-01-24 09:09:22 +01:00
Andreas Hocevar
f74e56c939 Merge pull request #9149 from ahocevar/label-consumers
Keep track of used labels
2019-01-24 09:07:32 +01:00
ahocevar
592b6cf362 Keep track of used labels 2019-01-23 21:52:22 +01:00
Andreas Hocevar
ba0ffea262 Merge pull request #9148 from openlayers/greenkeeper/karma-4.0.0
Update karma to the latest version 🚀
2019-01-23 20:33:49 +01:00
greenkeeper[bot]
0a1fe16ea2 chore(package): update karma to version 4.0.0 2019-01-23 18:21:26 +00:00
Frédéric Junod
ea45068335 Merge pull request #9131 from fredj/opacity_cmp
Don't use strict comparison with style.opacity
2019-01-23 08:32:11 +01:00
Tim Schaub
63c079257f Merge pull request #9013 from weskamm/scalebar
Added scalebar option to ol.control.scaleline
2019-01-22 18:04:08 -07:00
Frederic Junod
8dbe8bc34e Parse the opacity from style as float 2019-01-22 12:48:14 +01:00
Frederic Junod
af8a22d34d Keep two digits for the opacity value in layer state 2019-01-22 12:47:34 +01:00
Andreas Hocevar
ab04df8f9d Merge pull request #9133 from ahocevar/smart-tile-cache
Reduce memory footprint of tiles and labels
2019-01-22 10:46:38 +01:00
ahocevar
e37734826c Release canvas memory faster 2019-01-21 23:04:31 +01:00
ahocevar
b6d115d868 Make tile cache smaller and screen size dependant 2019-01-21 22:35:48 +01:00
ahocevar
a5d93117ed Also consider lower resolution tiles as used tiles 2019-01-21 22:34:01 +01:00
Frédéric Junod
2078b5d355 Merge pull request #9129 from fredj/tmp_array
Reduce garbage generation
2019-01-21 14:29:44 +01:00
Andreas Hocevar
1d4a767f86 Merge pull request #9128 from ahocevar/less-render-cycles
Use less render cycles for vector tile layers
2019-01-21 14:14:39 +01:00
Frederic Junod
89ca596eaf Reduce garbage generation 2019-01-21 10:18:19 +01:00
Johannes Weskamm
347e721025 Fixup prop evaluation 2019-01-21 09:33:29 +01:00
ahocevar
cd6d195e3f Render whole image queue in hifi mode to avoid extra render cycles 2019-01-20 23:44:28 +01:00
ahocevar
a0de38c1f3 Use a more resource demanding mapbox style 2019-01-20 23:43:01 +01:00
Andreas Hocevar
0daa27eab3 Merge pull request #9124 from openlayers/greenkeeper/sinon-7.2.3
Update sinon to the latest version 🚀
2019-01-20 19:47:31 +01:00
Andreas Hocevar
576fc015a6 Merge pull request #9127 from openlayers/greenkeeper/webpack-4.29.0
Update webpack to the latest version 🚀
2019-01-20 19:47:07 +01:00
greenkeeper[bot]
4f51914994 chore(package): update webpack to version 4.29.0 2019-01-20 17:46:30 +00:00
greenkeeper[bot]
3290559c1f chore(package): update sinon to version 7.2.3 2019-01-19 14:11:43 +00:00
Frédéric Junod
be03ac4c50 Merge pull request #9120 from fredj/update_dev_deps
Update all dev dependencies
2019-01-18 08:31:49 +01:00
Frederic Junod
2a07db201f Update typescript to version 3.2.2 2019-01-17 15:08:22 +01:00
greenkeeper[bot]
13cdb8365a chore(package): update webpack-dev-middleware to version 3.5.1 2019-01-17 15:07:08 +01:00
greenkeeper[bot]
46494c79cc chore(package): update @types/geojson to version 7946.0.5 2019-01-17 15:06:10 +01:00
greenkeeper[bot]
d0a9003b55 chore(package): update ol-mapbox-style to version 3.6.2 2019-01-17 15:05:47 +01:00
greenkeeper[bot]
fde58ee2a2 chore(package): update webpack-cli to version 3.2.0 2019-01-17 15:04:56 +01:00
greenkeeper[bot]
0c63112332 chore(package): update terser-webpack-plugin to version 1.2.1 2019-01-17 15:03:27 +01:00
greenkeeper[bot]
1df40fe3d6 chore(package): update webpack-dev-server to version 3.1.14 2019-01-17 15:03:01 +01:00
greenkeeper[bot]
3878190b12 chore(package): update karma to version 3.1.4 2019-01-17 15:02:21 +01:00
greenkeeper[bot]
e4fa3f0520 chore(package): update url-polyfill to version 1.1.3 2019-01-17 15:01:32 +01:00
greenkeeper[bot]
48833d60e3 chore(package): update puppeteer to version 1.11.0 2019-01-17 15:01:10 +01:00
greenkeeper[bot]
17ab5c2084 chore(package): update fs-extra to version 7.0.1 2019-01-17 15:00:43 +01:00
greenkeeper[bot]
c05bb30183 chore(package): update front-matter to version 3.0.1 2019-01-17 14:59:37 +01:00
greenkeeper[bot]
2f0723f557 chore(package): update copy-webpack-plugin to version 4.6.0 2019-01-17 14:59:10 +01:00
greenkeeper[bot]
5dfda3f4bd chore(package): update buble to version 0.19.6 2019-01-17 14:58:46 +01:00
Frédéric Junod
62f270a172 Merge pull request #9118 from fredj/format_read_no_event
Don't dispatch change events when reading features
2019-01-15 09:49:23 +01:00
Andreas Hocevar
2364a75f20 Merge pull request #9114 from ahocevar/extent-garbage
Faster extent calculation with less garbage
2019-01-15 09:18:41 +01:00
Frederic Junod
787fd4aa44 Don't dispatch change events when reading features
Based on initial work by https://github.com/Jinkwon
2019-01-15 09:08:15 +01:00
ahocevar
5389e9675c Faster extent calculation with less garbage 2019-01-15 00:30:39 +01:00
Andreas Hocevar
aa0bc8175b Merge pull request #9109 from JosephSamela/master
Make package.json valid json object
2019-01-14 18:05:23 +01:00
Andreas Hocevar
62288139d6 Clarify where package.json is created and how start and build are added 2019-01-14 18:00:22 +01:00
Joseph Samela
af74a476dc show full package.json + emphasize npm init 2019-01-14 10:24:32 -05:00
Andreas Hocevar
79f5283ce9 Merge pull request #9112 from ahocevar/preparetile-listener
Properly unregister prepareTile listeners
2019-01-14 10:58:42 +01:00
ahocevar
90c8fc7888 Properly unregister prepareTile listeners 2019-01-13 23:09:24 +01:00
Joseph Samela
7f0fc2a821 Make package.json valid json object 2019-01-11 13:43:22 -05:00
Andreas Hocevar
e6ca241a27 Merge pull request #9103 from ahocevar/fix-examples
Make examples more user friendly
2019-01-11 18:36:59 +01:00
ahocevar
f0d3f80663 Support scoped packages as dependencies 2019-01-11 18:16:23 +01:00
Andreas Hocevar
6258b6efc4 Merge pull request #9108 from openlayers/greenkeeper/webpack-4.28.4
Update webpack to the latest version 🚀
2019-01-11 08:46:36 +01:00
ahocevar
138cc55b34 Add Edit button for editing in codesandbox 2019-01-10 22:14:05 +01:00
greenkeeper[bot]
4d3968d35b chore(package): update webpack to version 4.28.4 2019-01-10 19:34:11 +00:00
ahocevar
9372bc9157 Add package.json source 2019-01-10 18:31:26 +01:00
Andreas Hocevar
4e8048cbd6 Merge pull request #9107 from webgeodatavore/fix-cgiar-csi
Fix cgiar csi URL due to #9106
2019-01-10 15:57:48 +01:00
ThomasG77
919cc85714 Fix cgiar csi URL due to #9106 2019-01-10 14:47:57 +01:00
ahocevar
f368fa1a28 Improve layout 2019-01-09 21:50:50 +01:00
ahocevar
c4c6f84bca Separate html and js example code 2019-01-09 21:50:49 +01:00
Andreas Hocevar
c8df836ce1 Merge pull request #9058 from ahocevar/slim-vectorimagetile
Move all tile loading from the VectorImageTile to the source
2019-01-09 13:58:13 +01:00
ahocevar
54f48e9c03 Re-add missing import after rebase 2019-01-09 13:45:01 +01:00
ahocevar
0f3c0d1af4 Rename VectorImageTile to VectorRenderTile 2019-01-09 13:45:01 +01:00
ahocevar
32696638d2 Simplify vector tile code 2019-01-09 13:45:01 +01:00
ahocevar
ab797b7160 Let source set the key, like other sources do 2019-01-08 13:44:20 +01:00
ahocevar
523d3a4e8c Let the source load source tiles 2019-01-08 13:44:19 +01:00
Frédéric Junod
831c7621c7 Merge pull request #9102 from openlayers/f_9100
Use dom-to-image library in export-pdf example
2019-01-07 13:08:31 +01:00
Frederic Junod
d426e80c6b Use dom-to-image library in export-pdf example
fixes #9100
2019-01-07 10:35:56 +01:00
Frédéric Junod
cf6b1ca1cc Merge pull request #9072 from fredj/rm_layerStates
Remove 'layerStates' property from the FrameState
2019-01-07 10:11:52 +01:00
Andreas Hocevar
0f3e410428 Merge pull request #9101 from ahocevar/load-tiles-while-animating-and-interacting
Always load tiles while animating and interacting
2019-01-07 10:11:08 +01:00
ahocevar
2e21b9f975 Always load tiles while animating and interacting 2019-01-06 21:29:24 +01:00
Andreas Hocevar
ad794cea14 Merge pull request #9099 from ahocevar/tracking-opt-out
Allow users to opt out of tracking
2019-01-06 19:41:46 +01:00
ahocevar
56a60631bc Allow users to opt out of tracking 2019-01-02 07:36:25 +01:00
Andreas Hocevar
3e1fce0e22 Merge pull request #9098 from ahocevar/jsdoc-plugin
External types bugfix for jsdoc-plugin-typescript
2019-01-02 07:10:31 +01:00
ahocevar
c2ffba1fda External types bugfix for jsdoc-plugin-typescript 2019-01-02 07:05:46 +01:00
Tim Schaub
a94632376c Merge pull request #9095 from openlayers/greenkeeper/marked-0.6.0
Update marked to the latest version 🚀
2019-01-01 08:16:11 -07:00
greenkeeper[bot]
ad84c37c86 chore(package): update marked to version 0.6.0 2019-01-01 00:51:39 +00:00
Andreas Hocevar
06e30e8884 Merge pull request #9083 from ahocevar/fix-draw-condition
Reset lastDragTime when condition is not met
2018-12-31 11:24:33 +01:00
Tim Schaub
511e580c76 Merge pull request #9090 from jahow/add-webgl-points-example
Add texture & color to the WebGL points renderer
2018-12-29 22:12:12 -07:00
Tim Schaub
117f0d21fc Merge pull request #9092 from openlayers/greenkeeper/webpack-4.28.3
Update webpack to the latest version 🚀
2018-12-29 21:53:34 -07:00
Andreas Hocevar
ba49f2d2db Merge pull request #9091 from jahow/fix-heatmap-ie
Fix heatmap example in IE
2018-12-29 17:18:09 +01:00
greenkeeper[bot]
b22b62f647 chore(package): update webpack to version 4.28.3 2018-12-29 12:53:11 +00:00
Olivier Guyot
831c23d212 Fix heatmap example for IE 2018-12-28 16:24:56 +01:00
Olivier Guyot
33c717e159 Use a cleaner way to create a webgl context 2018-12-28 16:10:38 +01:00
jahow
fad7c7edb1 Added a new example for webgl icons rendering 2018-12-28 15:53:08 +01:00
Olivier Guyot
62c7a49943 Webgl points / added a texture option & improved doc 2018-12-28 15:53:07 +01:00
Olivier Guyot
0acfd7ab59 WebGL points / Added a color attribute 2018-12-28 15:53:07 +01:00
Andreas Hocevar
435ef3070c Merge pull request #9089 from ThomasG77/fix-rawgit
Replace rawgit with jsdelivr due to #9082 comment
2018-12-27 19:22:52 +01:00
ThomasG77
a7305be824 Replace rawgit with jsdelivr due to #9082 comment 2018-12-27 13:20:19 +01:00
Andreas Hocevar
76b31be9fc Merge pull request #9085 from openlayers/greenkeeper/webpack-4.28.2
Update webpack to the latest version 🚀
2018-12-22 19:42:16 +01:00
greenkeeper[bot]
c35cc93ade chore(package): update webpack to version 4.28.2 2018-12-22 13:53:38 +00:00
Andreas Hocevar
8978d86f35 Merge pull request #9079 from ahocevar/fullscreen-event
Listen to all fullscreen event types
2018-12-21 22:27:55 +01:00
ahocevar
409c962caf Reset lastDragTime when condition is not met 2018-12-21 22:26:05 +01:00
Frederic Junod
a0f15e1eb6 Only schedule the unused layers renderer removal when it's needed 2018-12-21 10:37:03 +01:00
Andreas Hocevar
d8156577c9 Merge pull request #9080 from openlayers/greenkeeper/webpack-4.28.1
Update webpack to the latest version 🚀
2018-12-21 00:13:40 +01:00
greenkeeper[bot]
3b57de3c7a chore(package): update webpack to version 4.28.1 2018-12-20 22:21:40 +00:00
ahocevar
9cfb46f7a4 Listen to all fullscreen event types 2018-12-20 08:39:24 +01:00
Andreas Hocevar
100e69e286 Merge pull request #9076 from openlayers/greenkeeper/webpack-4.28.0
Update webpack to the latest version 🚀
2018-12-19 15:07:13 +01:00
Frederic Junod
3193de0906 Only schedule the icon cache expire when it's needed 2018-12-19 14:34:22 +01:00
greenkeeper[bot]
372cb52f83 chore(package): update webpack to version 4.28.0 2018-12-19 13:12:23 +00:00
Frederic Junod
a4fe067aad Create a layer state map instead of an array of uids 2018-12-19 12:45:39 +01:00
Andreas Hocevar
6967e5b60b Merge pull request #9070 from ludvigeriksson/remove-point-return-value
Modify.removePoint returns true only when a vertex was removed
2018-12-18 21:57:02 +01:00
Frederic Junod
016d738269 Move frameState test on top in removeUnusedLayerRenderers_ 2018-12-18 13:34:19 +01:00
Frederic Junod
5d1c27d05d Don't create an array of managed layers 2018-12-18 13:17:00 +01:00
Frederic Junod
1750ff43e0 Always schedule unused layers removal function 2018-12-18 09:49:47 +01:00
Frederic Junod
5195adea85 Remove 'layerStates' property from the FrameState 2018-12-18 09:49:38 +01:00
Frédéric Junod
348186e2f8 Merge pull request #9068 from fredj/mvt_types
Use 'PBF' type instead of 'Object' in ol/format/MVT
2018-12-17 17:02:11 +01:00
Ludvig Eriksson
412d9a9713 Modify.removePoint returns true only when a vertex was removed 2018-12-17 16:02:16 +01:00
Frederic Junod
3b57f6693c Use 'PBF' type instead of 'Object' 2018-12-17 10:30:48 +01:00
Frederic Junod
483c442621 Remove suppress jsdoc tags 2018-12-17 09:55:28 +01:00
Frédéric Junod
b4bd447d34 Merge pull request #9066 from fredj/transformGeometryWithOptions
Rework transformWithOptions
2018-12-17 08:29:58 +01:00
Frederic Junod
d838de32b7 Rework transformWithOptions
Create one function per input/output type: `transformGeometryWithOptions` and `transformExtentWithOptions`.
2018-12-16 08:28:26 +01:00
Frédéric Junod
b546eafeae Merge pull request #9064 from fredj/rm_atlas
Remove Atlas, AtlasManager and getChecksum functions
2018-12-14 14:56:23 +01:00
Frederic Junod
2e1ab8234e Add note in upgrade-notes about the AtlasManager removal 2018-12-14 13:00:35 +01:00
Frederic Junod
0ec769c234 Remove getChecksum functions 2018-12-14 13:00:35 +01:00
Frederic Junod
1bb1e3c542 Remove Atlas and AtlasManager 2018-12-14 13:00:35 +01:00
Andreas Hocevar
f948577a1a Merge pull request #9060 from ahocevar/coordinate-convenience
Avoid unexpected behavior when passing string coordinates
2018-12-14 09:36:12 +01:00
Frédéric Junod
193749f4fd Merge pull request #9063 from oterral/master
Fix module name
2018-12-14 09:15:11 +01:00
Olivier Terral
6858a5cde7 Fix module name 2018-12-14 08:57:00 +01:00
ahocevar
80ebb8142c Avoid unexpected behavior when passing string coordinates 2018-12-13 19:07:12 +01:00
Frédéric Junod
e426af29c2 Merge pull request #9056 from fredj/rm_typecast
Remove typecast for object literals
2018-12-12 16:25:41 +01:00
Frédéric Junod
68d4d244f3 Merge pull request #9057 from fredj/feature_like
Use FeatureLike typedef
2018-12-12 16:24:52 +01:00
Frederic Junod
39a21f177d Use FeatureLike typedef 2018-12-12 15:03:54 +01:00
Frederic Junod
29702e3750 Remove type cast in ol/structs/LRUCache 2018-12-12 14:48:24 +01:00
Frederic Junod
056568c936 Remove type cast in ol/render/canvas/TextBuilder 2018-12-12 14:47:46 +01:00
Frederic Junod
d2cae9d3b7 Remove type cast in ol/style/AtlasManager 2018-12-12 14:45:51 +01:00
Frederic Junod
701e19c1c9 Remove type cast in ol/interaction/Snap 2018-12-12 14:43:51 +01:00
Frederic Junod
4010a644c0 Remove type cast in ol/format/EsriJSON 2018-12-12 14:41:12 +01:00
Frederic Junod
480b064f5d Remove type cast in ol/events 2018-12-12 14:29:18 +01:00
Frédéric Junod
daa92c105d Merge pull request #9055 from fredj/less_typecast
Remove type cast in ol.View
2018-12-12 14:10:59 +01:00
Frederic Junod
b1602877d9 Remove type cast in ol.View 2018-12-12 12:54:41 +01:00
Andreas Hocevar
0cda18f58a Merge pull request #9008 from ahocevar/decouple-group-creation
Decouple render instruction creation from rendering
2018-12-07 14:33:54 +01:00
Frédéric Junod
89af80241e Merge pull request #9045 from openlayers/rm_CANVAS_LINE_DASH
Remove CANVAS_LINE_DASH from ol/has
2018-12-07 13:54:19 +01:00
Frederic Junod
b3520f8217 Remove CANVAS_LINE_DASH from ol/has
Test if `context.setLineDash` is defined instead.
2018-12-07 13:15:23 +01:00
Frédéric Junod
bbbed30848 Merge pull request #9044 from openlayers/indent
Fix comments indentation
2018-12-07 13:06:27 +01:00
Frederic Junod
1be17e44a2 Fix comments indentation 2018-12-07 11:57:58 +01:00
Frédéric Junod
d0f03f1257 Merge pull request #9043 from openlayers/examples_types
Fix type notation in examples
2018-12-07 11:15:17 +01:00
Frederic Junod
457e7b96dd Remove extra param to function 2018-12-07 11:00:05 +01:00
Frederic Junod
759b317707 Fix type notation in examples 2018-12-07 10:55:26 +01:00
Andreas Hocevar
30947c0de8 Merge pull request #9041 from jahow/fix-webgl-ff-bug
Reworked the Webgl Heatmap layer & associated utilities
2018-12-07 10:28:44 +01:00
Frederic Junod
cd3e65e3df Remove unneeded type cast in examples 2018-12-07 09:55:09 +01:00
Frédéric Junod
76bd75ebb1 Merge pull request #9042 from openlayers/opt_onBoxEnd
Change onBoxEnd property in DragBox options to optional
2018-12-07 09:36:27 +01:00
Olivier Guyot
27b0cf18e7 Update default shaders in documentation of webgl classes 2018-12-07 09:32:52 +01:00
Frederic Junod
bade38ecc8 Change onBoxEnd property in DragBox options to optional 2018-12-07 09:17:34 +01:00
Olivier Guyot
8e4c66a49e Regenerate new test renders & remove the --ignore-gpu-blacklist flag 2018-12-07 09:09:19 +01:00
Olivier Guyot
2c4a959e55 Generally fixed the webgl heatmap layer
Things done:
- stay closer to the original rendering in canvas
- get rid of the intermediary blur step
- use the new callbacks in the webgl points renderer
- premultiply alpha in the last postprocessing step
2018-12-07 09:02:02 +01:00
Olivier Guyot
b532a489d4 Webgl points / fix weird glitches by premultiplying alpha 2018-12-07 09:02:02 +01:00
Olivier Guyot
f177a2bcd5 Simple handling of layer opacity in webgl points layer
Now the layer opacity is simply handled by a CSS property on the layer DOM element. As such it does not have to be
taken into account in shaders.
2018-12-07 09:02:02 +01:00
Olivier Guyot
a6989af00a Webgl points layer / added callbacks for attributes
Now opacity, rotateWithView and tex coords can be set with callbacks per feature.
2018-12-07 08:57:12 +01:00
Olivier Guyot
2367fbb1ea Webgl / do not enable missing attributes
Some expected attributes might not end up in the compiled shader. In this case, skip calling enableVertexAttrib
2018-12-07 08:57:03 +01:00
Andreas Hocevar
4ce5379a4b Merge pull request #9039 from OSHistory/tsFunctionReturnVoid
Add ': void' to non returning functions (error TS7014)
2018-12-07 07:58:40 +01:00
Andreas Hocevar
1c4cfc9559 Merge pull request #9024 from ahocevar/imagelayer-events
Add prerender and postrender events for Image layer
2018-12-07 07:46:39 +01:00
Niklas Alt
4bc9216e41 Add ': void' to non returning functions (error TS7014) 2018-12-06 19:57:45 +01:00
Andreas Hocevar
97ab5133a0 Merge pull request #9028 from OSHistory/specifyArrayType
Specify the return array as coordinates
2018-12-06 14:50:47 +01:00
Niklas Alt
d00bfe8fe7 Use generic * for Coordinate array returns 2018-12-06 14:36:33 +01:00
Andreas Hocevar
e4e0e61731 Merge pull request #9037 from openlayers/greenkeeper/webpack-4.27.1
Update webpack to the latest version 🚀
2018-12-05 21:39:57 +01:00
greenkeeper[bot]
88db530c43 chore(package): update webpack to version 4.27.1 2018-12-05 19:36:50 +00:00
Andreas Hocevar
9cf58e412f Merge pull request #9036 from ahocevar/modify-drag-segments
Remove drag segments of removed features
2018-12-05 12:58:33 +01:00
ahocevar
6cabb9dd0b Remove drag segments of removed features 2018-12-05 12:02:35 +01:00
Andreas Hocevar
b71e391e3b Merge pull request #9031 from ludvigeriksson/insertVertexCondition-fix
Call insertVertexCondition only when a vertex acually can be inserted
2018-12-04 13:22:42 +01:00
Andreas Hocevar
e92e03eb1b Merge pull request #9032 from openlayers/greenkeeper/webpack-4.27.0
Update webpack to the latest version 🚀
2018-12-04 13:13:48 +01:00
ahocevar
df59b894b1 Make tile keys stable to avoid TileQueue confusion 2018-12-04 11:09:51 +01:00
ahocevar
6202a0cf05 Bring back interim tiles, but don't block user interaction 2018-12-04 11:09:51 +01:00
greenkeeper[bot]
4a28155f2b chore(package): update webpack to version 4.27.0 2018-12-04 09:52:16 +00:00
Ludvig Eriksson
a50fda5ac8 Call insertVertexCondition only when a vertex acually can be inserted 2018-12-04 09:55:31 +01:00
Andreas Hocevar
56201b9295 Merge pull request #9029 from OSHistory/inheritDoc
Use camel-cased inheritDoc for consistency
2018-12-03 20:48:21 +01:00
Niklas Alt
3ef6e39c26 Use camel-cased inheritDoc for consistency 2018-12-03 20:42:03 +01:00
Niklas Alt
8f7d0c8a4b Specify the return array as coordinates 2018-12-03 20:22:46 +01:00
Andreas Hocevar
fd0e7782ed Merge pull request #9026 from ahocevar/dependencies
Update ol-mapbox-style and jsdoc-plugin-typescript
2018-12-03 06:31:33 +01:00
Andreas Hocevar
3790007226 Merge pull request #9025 from ahocevar/render-event
Remove unused render event
2018-12-03 06:31:03 +01:00
ahocevar
976863c376 Add prerender and postrender events for Image layer 2018-12-02 21:05:20 +01:00
ahocevar
4256932cee Update ol-mapbox-style and jsdoc-plugin-typescript 2018-12-02 17:17:19 +01:00
ahocevar
be52368006 Remove unused render event 2018-12-02 17:13:03 +01:00
Tim Schaub
3944f0e62b Merge pull request #9023 from jahow/fix-webgl-points-layer
Fix webgl PointsLayer not rendering anything
2018-11-30 21:38:43 -07:00
jahow
8bb7d77f68 Update PointsLayer documentation 2018-12-01 00:11:27 +01:00
jahow
55c36b5aab Shader compilation errors are now logged even when the compilation succeeded 2018-12-01 00:03:05 +01:00
jahow
78028893e2 Added missing attributes in PointsLayer
Attributes were used in the shader but not bound to a buffer, which made the
rendering failed in some implementations.
2018-12-01 00:01:55 +01:00
Andreas Hocevar
171f1a5bac Merge pull request #9022 from ahocevar/webgl-performance-caveat
Use WebGL even with major performance caveat
2018-11-30 15:53:27 +01:00
ahocevar
a77ed76443 Use WebGL even with major performance caveat 2018-11-30 14:20:59 +01:00
Andreas Hocevar
e9e804a836 Merge pull request #9020 from ahocevar/remove-superfluous-settileurlfunction
Remove superfluous setTileUrlFunction call
2018-11-30 11:09:46 +01:00
ahocevar
1d243a7f37 Add comments and TODOs 2018-11-29 22:35:46 +01:00
ahocevar
fbf98a44ea Streamline tile preparation and remove unused code 2018-11-29 22:35:46 +01:00
ahocevar
9720db2041 Remove superfluous setTileUrlFunction call 2018-11-29 21:20:35 +01:00
Andreas Hocevar
65a10db432 Merge pull request #9018 from OSHistory/docFixes
Duplicate @property for style and renderOrder
2018-11-29 17:12:43 +01:00
Niklas Alt
e73931a9b2 Duplicate @property for style and renderOrder 2018-11-29 16:51:01 +01:00
Johannes Weskamm
d4c14da4b5 Rename props, localization, fix example 2018-11-29 15:24:41 +01:00
Frédéric Junod
aad836dfb2 Merge pull request #9012 from fredj/misc
Change projection and urls properties in sources options to optional
2018-11-29 07:08:21 +01:00
Johannes Weskamm
97618c8611 Added scalebar option to ol.control.scaleline 2018-11-28 16:25:55 +01:00
Frederic Junod
769d7dd732 Change urls property in TileArcGISRest to optional
The `urls`property is optional if `url` is defined.
2018-11-28 16:00:56 +01:00
Frederic Junod
28bdbeb869 Change projection property in sources options to optional
The `projection` property is not mandatory, the view's projection is used if not provided.
2018-11-28 15:59:47 +01:00
ahocevar
2ce8fa6f10 Render only when we have time, and not during interaction/animation 2018-11-28 14:42:41 +01:00
ahocevar
82e2a84862 Remove interim tile handling for now 2018-11-28 14:42:41 +01:00
ahocevar
43759fd846 Decouple executor group creation from rendering 2018-11-28 14:42:40 +01:00
Tim Schaub
85abe3695a Merge pull request #9010 from fredj/ExecutorGroup_import
Fix ExecutorGroup.js file location in comments
2018-11-27 13:04:37 -07:00
Tim Schaub
74225188f4 Merge pull request #9009 from fredj/revert_9005
Revert "Simplify import path in examples"
2018-11-27 12:58:15 -07:00
Frederic Junod
4caabee792 Fix ExecutorGroup.js file location in comments
`src/ol/render/ExecutorGroup.js` was removed in #9003
2018-11-27 17:13:54 +01:00
Frederic Junod
63de0aefbe Remove '.js' from the imports 2018-11-27 17:00:18 +01:00
Frederic Junod
4a3f70c09b Revert "Simplify import path in examples"
This reverts commit 79c8afdba8.
2018-11-27 16:49:55 +01:00
Frédéric Junod
eaa29b2e63 Merge pull request #9005 from fredj/examples_import
Simplify import path in examples
2018-11-27 13:50:38 +01:00
Frederic Junod
79c8afdba8 Simplify import path in examples
To have the same path (starting with `ol/`, without `.js`) as in the documentation.
The support was added in the webpack config in #8928
2018-11-26 17:18:52 +01:00
Andreas Hocevar
4b784f06e9 Merge pull request #9003 from ahocevar/remove-duplicate-functions
Remove unused Builder/Executor functions and members
2018-11-26 12:10:40 +01:00
Andreas Hocevar
b03a42c81a Merge pull request #9004 from openlayers/greenkeeper/webpack-4.26.1
Update webpack to the latest version 🚀
2018-11-25 23:57:02 +01:00
greenkeeper[bot]
49b1310b19 chore(package): update webpack to version 4.26.1 2018-11-25 21:17:50 +00:00
ahocevar
f4aec3fd01 Remove unused Builder/Executor functions and members 2018-11-25 20:06:37 +01:00
Andreas Hocevar
b71a8aa006 Merge pull request #9002 from openlayers/fix-module-path
Fix module path
2018-11-25 14:51:42 +01:00
Andreas Hocevar
66ec9983b2 Fix module path 2018-11-25 14:19:56 +01:00
Frédéric Junod
4910933a9b Merge pull request #8996 from fredj/image-vector-ratio
Add imageRatio option for VectorImage layers
2018-11-23 14:29:51 +01:00
Tim Schaub
8cea28e102 Add missing full stop in comment
Co-Authored-By: fredj <frederic.junod@camptocamp.com>
2018-11-23 08:24:20 +01:00
Andreas Hocevar
d1df9dae0d Pass baseOptions to parent constructor
Co-Authored-By: fredj <frederic.junod@camptocamp.com>
2018-11-22 10:27:29 +01:00
Frederic Junod
e66a84c897 Add imageRatio option for VectorImage layers 2018-11-22 09:38:08 +01:00
Frédéric Junod
5951e147c0 Merge pull request #8995 from fredj/vec_render_mode
Remove leftover comments and code for 'vector' render mode
2018-11-22 08:44:37 +01:00
Tim Schaub
7b6f86abc7 Merge pull request #8992 from tschaub/tilecoord
Use standard tile coords
2018-11-21 15:18:51 -07:00
Tim Schaub
0f5439e16e Add upgrade notes regarding internal tile coordinates 2018-11-21 11:53:12 -07:00
Tim Schaub
e9a30c5cb7 Use standard tile coords 2018-11-21 11:14:17 -07:00
Tim Schaub
37c987de0a Move quadKey function to the one place it is used 2018-11-21 10:10:51 -07:00
Frederic Junod
cb44775306 Remove leftover comments and code for 'vector' render mode 2018-11-21 16:58:27 +01:00
Frédéric Junod
60b3370bba Merge pull request #8994 from fredj/misc
Set projection property in sources options to optional
2018-11-21 16:52:34 +01:00
Frederic Junod
a8799e1d60 Fix typo 2018-11-21 16:23:54 +01:00
Frederic Junod
087b024a24 Change projection property in sources options to optional
The `projection` property is not mandatory, the view's projection is used if not provided.
2018-11-21 16:23:29 +01:00
Tim Schaub
c6be2c7ff5 Merge pull request #8977 from jahow/add-webgl-rendering-tests
Add WebGL rendering tests & improve the WebGLHelper API
2018-11-20 03:59:06 -08:00
Olivier Guyot
662d9122f5 Use --ignore-gpu-blacklist to fix Webgl rendering in CircleCI 2018-11-20 11:52:32 +01:00
Andreas Hocevar
a137eabc5d Merge pull request #8990 from nicholas-l/remove-unneededCall
[Client] Remove renderFrame
2018-11-20 09:24:06 +01:00
Nicholas L
a9d336d0f1 [Client] Remove renderFrame 2018-11-20 18:52:43 +13:00
Tim Schaub
1133a5bfb7 Merge pull request #8989 from openlayers/greenkeeper/marked-0.5.2
Update marked to the latest version 🚀
2018-11-19 16:30:30 -08:00
greenkeeper[bot]
432ac856b6 chore(package): update marked to version 0.5.2 2018-11-20 00:06:25 +00:00
Tim Schaub
0fd4af670b Merge pull request #8988 from tschaub/measure-and-cache-text-width
Pass along the ability to measure and cache text width
2018-11-19 15:21:49 -08:00
Tim Schaub
8b50c3c6cb Pass along the ability to measure and cache text width 2018-11-19 15:34:48 -07:00
Tim Schaub
e058eb3164 Merge pull request #8987 from tschaub/rendering-updates
Rendering test updates
2018-11-19 13:40:46 -08:00
Tim Schaub
2131cc460c Dash delimited lower case words describe the cases 2018-11-19 14:03:51 -07:00
Tim Schaub
4ff7b0a379 Merge pull request #8983 from openlayers/issue-templates
Add issue templates
2018-11-19 12:53:57 -08:00
Tim Schaub
7036064ffc Add tiles to avoid 404s in rendering tests 2018-11-19 13:50:52 -07:00
Tim Schaub
9863e25f5e Only try to run cases with main.js 2018-11-19 13:49:50 -07:00
Tim Schaub
61baa8a4a2 Merge pull request #8982 from tschaub/stacking
Stacking context for layers, overlays, and controls
2018-11-19 12:49:36 -08:00
Tim Schaub
e4b00be9d6 Add labels to issue templates 2018-11-19 11:37:49 -07:00
Tim Schaub
0c27cee2a6 Add issue templates 2018-11-19 11:26:39 -07:00
Tim Schaub
898c349fbf Stacking contexts for layers, overlays, and controls 2018-11-19 11:00:33 -07:00
Frédéric Junod
5d14666376 Merge pull request #8980 from fredj/cleanup
Change travis references to circleci in doc
2018-11-19 15:53:36 +01:00
Olivier Guyot
0b23e94a2a Fixed internal var name on WebGLPoints renderer. 2018-11-19 13:11:23 +01:00
jahow
6b82cf0b84 Simplified the API of WebGLHelper
Now the shader and program caches are simply arrays of native WebGL created objects.
The WebGLHelper simply takes the sources of the frag and vert shader and produces a program.

This removes 2 classes & reduces the general verbosity of the API.

Also a `getShaderCompilationErrors` was added on `WebGLHelper` to help debug GLSL errors.
2018-11-19 13:11:23 +01:00
Frederic Junod
da8ee157b8 Remove Makefile entry in editorconfig 2018-11-19 13:11:19 +01:00
Frederic Junod
18eef152c4 Change travis references to circleci in doc 2018-11-19 13:09:55 +01:00
Frédéric Junod
066e5b7ed3 Merge pull request #8978 from openlayers/greenkeeper/webpack-4.26.0
Update webpack to the latest version 🚀
2018-11-19 11:40:33 +01:00
greenkeeper[bot]
4b060224f2 chore(package): update webpack to version 4.26.0 2018-11-19 09:34:22 +00:00
jahow
76b1a7f96b Add a rendering test for basic points rendering in webgl. 2018-11-19 09:41:29 +01:00
jahow
d0e0c8fc3a Add rendering test for heatmap layer 2018-11-19 09:41:20 +01:00
Andreas Hocevar
eb700a3c5e Merge pull request #8976 from ahocevar/unscale-tile-canvas
Scale tiles instead of canvas
2018-11-18 20:37:16 +01:00
ahocevar
5cc74ee1d2 Scale tiles instead of canvas 2018-11-18 19:31:14 +01:00
Andreas Hocevar
2eeef29ab2 Merge pull request #8970 from ahocevar/zindex
Fix zIndex positioning
2018-11-18 17:06:55 +01:00
Frédéric Junod
140e8b59bb Merge pull request #8968 from fredj/Object.values
Use Object.values if available
2018-11-18 00:16:01 +01:00
Andreas Hocevar
b4b9b35ef7 Merge pull request #8972 from ahocevar/no-rollup
Remove unused rollup dependency
2018-11-17 23:10:45 +01:00
ahocevar
a4d84b616f Remove unused rollup dependency 2018-11-17 22:03:47 +01:00
ahocevar
366588d07e Avoid layers getting rendered above the overlay container 2018-11-17 18:12:43 +01:00
Frédéric Junod
d030f092a2 Merge pull request #8967 from fredj/ts_checks_fix_webgl
Fix webgl types in ol/webgl/PostProcessingPass
2018-11-17 16:54:20 +01:00
Tim Schaub
ba609a67ba Merge pull request #8969 from tschaub/inverse-transforms
Create and use inverse pixel transforms during render
2018-11-17 16:41:41 +01:00
Tim Schaub
5d528dca3b Target, source arg order for make* transform functions 2018-11-17 16:28:29 +01:00
Tim Schaub
c169fec4a8 Invert and set transform in one step 2018-11-17 16:28:28 +01:00
Tim Schaub
06a0a7f33b Use the inverse pixel transform when clipping and getting pixel data 2018-11-17 16:28:28 +01:00
Tim Schaub
1cc49e0b23 Clearer function name for getting a render pixel 2018-11-17 16:28:28 +01:00
Tim Schaub
af10f6a75c Use the inverse pixel transform in pre/post render events 2018-11-17 16:28:28 +01:00
Tim Schaub
686847f491 Make forward and inverse pixel transforms during render 2018-11-17 16:28:27 +01:00
Tim Schaub
db1f432197 Function for making a scale transform 2018-11-17 16:28:27 +01:00
Tim Schaub
63cf21b668 Dedicated function for inverting a transform without modifying the source 2018-11-17 16:28:27 +01:00
Frederic Junod
4a3a53c725 Use Object.values if available
As `Object.values`, the arguments now can't be `null` or `undefined`.
2018-11-17 14:59:36 +01:00
Frederic Junod
42a8c7983f Fix webgl types in ol/webgl/PostProcessingPass 2018-11-17 11:20:11 +01:00
Frédéric Junod
06ae175cef Merge pull request #8964 from fredj/col_evt_index
Add index to the Collection events
2018-11-17 11:00:19 +01:00
Frédéric Junod
93140d9495 Merge pull request #8915 from fredj/layer_zIndex
Use CSS z-index to order layers
2018-11-17 10:59:54 +01:00
Frédéric Junod
c39471aa93 Merge pull request #8966 from openlayers/greenkeeper/rollup-0.67.3
Update rollup to the latest version 🚀
2018-11-17 10:27:13 +01:00
greenkeeper[bot]
6a5651cc87 chore(package): update rollup to version 0.67.3 2018-11-17 08:46:27 +00:00
Frederic Junod
a64ca2b4bf Use CSS z-index to order layers 2018-11-17 09:03:59 +01:00
Frédéric Junod
97ed71f683 Merge pull request #8963 from openlayers/greenkeeper/rollup-0.67.2
Update rollup to the latest version 🚀
2018-11-17 08:46:15 +01:00
Frederic Junod
6219e31e40 Add index to the Collection events 2018-11-17 08:43:35 +01:00
greenkeeper[bot]
7f55424fda chore(package): update rollup to version 0.67.2 2018-11-17 07:20:16 +00:00
Tim Schaub
a81c2ad995 Merge pull request #8923 from tschaub/composite
Use the composite renderer
2018-11-16 18:42:24 +01:00
ahocevar
c004e9d644 More upgrade notes 2018-11-16 18:38:51 +01:00
Tim Schaub
6c4845a304 Upgrade notes 2018-11-16 18:32:12 +01:00
Tim Schaub
358d86c33e Raster source listens for layer change 2018-11-16 18:10:10 +01:00
ahocevar
95c16cfa11 Fix vector tile renderer test 2018-11-16 17:05:44 +01:00
Tim Schaub
5aa8db15f4 Lint 2018-11-16 16:25:39 +01:00
Tim Schaub
6cfb8f275b Fix magnify example 2018-11-16 16:16:28 +01:00
ahocevar
edbe2316ef Lazily create interim tiles (fixes most tests) 2018-11-16 15:03:28 +01:00
Tim Schaub
d6add33df0 Use map and new method 2018-11-16 14:58:02 +01:00
Tim Schaub
a490c658fb Overscale canvas if sources have non-zero min zoom 2018-11-16 14:57:18 +01:00
Tim Schaub
9eb5808844 Test that postrender is dispatched (again) 2018-11-16 14:57:18 +01:00
Tim Schaub
96437e3875 Test prerender and postrender events for a vector layer 2018-11-16 14:57:18 +01:00
Tim Schaub
3ecc6d60d2 The forEachLayerAtPixel method calls getDataAtPixel for each layer renderer 2018-11-16 14:57:17 +01:00
Tim Schaub
47ecd508fa Test hybrid mode in vt constructor 2018-11-16 14:57:17 +01:00
Frederic Junod
98a780e5f9 Add missing '.js' in import 2018-11-16 14:57:17 +01:00
Tim Schaub
038f122d11 Clip tile layers by extent 2018-11-16 14:57:17 +01:00
ahocevar
73ffda10db Smarter interim tile creation 2018-11-16 14:57:17 +01:00
Tim Schaub
b3bcf7dac1 Add 2% tolerance to vector rendering tests 2018-11-16 14:57:17 +01:00
Tim Schaub
4a3dbb0e24 Use the main map in rendering tests 2018-11-16 14:57:17 +01:00
Florent gravin
90d46cb539 Remove blend-modes example
As we are not doing canvas composition anymore
2018-11-16 14:57:16 +01:00
Florent gravin
7831a591f7 Fix igc example migrating map postcompose event 2018-11-16 14:57:16 +01:00
Florent gravin
1dbe52d738 Fix layer-clipping example using right postrender events 2018-11-16 14:57:16 +01:00
Florent gravin
f73c6fab35 Fix igc example migrating map postcompose event 2018-11-16 14:57:16 +01:00
Florent gravin
eafe1bf8a3 Fix geolocation-orientation example migrating map postcompose event 2018-11-16 14:57:16 +01:00
Florent gravin
039af41af1 Unbind postrender event in feature-move-animation example 2018-11-16 14:57:16 +01:00
Florent gravin
a924834920 Fix feature-animation example migrating map postcompose event 2018-11-16 14:57:15 +01:00
Florent gravin
3bf9a54ed5 Fix dynamic-data example migrating map postcompose event 2018-11-16 14:57:15 +01:00
Florent gravin
91bd144f0e Update post/pre render event doc usage in examples 2018-11-16 14:57:15 +01:00
Florent gravin
160e9e8056 Fix image-filter example using right postrender events 2018-11-16 14:57:15 +01:00
Florent gravin
c5b7c5febb Fix magnify example using right postrender events 2018-11-16 14:57:15 +01:00
Florent gravin
3cba5ffbe2 Fix swipe example using right post/pre render events 2018-11-16 14:57:15 +01:00
Florent gravin
4d54549b5f Fix flight-animation example with postrender event 2018-11-16 14:57:15 +01:00
Florent gravin
45cd573768 Fix layer-spy example using right post/pre render events 2018-11-16 14:57:14 +01:00
Tim Schaub
358f58ba3a Doc for transform toString function 2018-11-16 14:57:14 +01:00
Tim Schaub
cc9b7b6259 Work around a TypeScript issue with inheritdoc 2018-11-16 14:57:14 +01:00
Tim Schaub
5ad73f8bbd Implement getDataAtPixel for all layer renderers 2018-11-16 14:57:14 +01:00
Tim Schaub
832dadb3af Dedicated transforms 2018-11-16 14:57:14 +01:00
Tim Schaub
ac3a1fb953 Dispatch layer changed event when layer needs a re-render 2018-11-16 14:57:13 +01:00
Tim Schaub
7a82904a3b Unused intermediate canvas renderer 2018-11-16 14:57:13 +01:00
Tim Schaub
666f57bd4c Unused transforms 2018-11-16 14:57:13 +01:00
Tim Schaub
32495388b9 Transform origin top left 2018-11-16 14:57:13 +01:00
ahocevar
5bb110f157 Fix render context utility functions and feature-move-animation example 2018-11-16 14:57:13 +01:00
Tim Schaub
aa4237539f Provide a pixel transform from the tile renderer 2018-11-16 14:57:13 +01:00
ahocevar
ee536fb70d Remove unused code and imports 2018-11-16 14:57:12 +01:00
Tim Schaub
bc347e3eb0 Provide a pixel transform to render events 2018-11-16 14:57:12 +01:00
ahocevar
65ceb9264e Remove accidently committed changes 2018-11-16 14:57:12 +01:00
ahocevar
6c0b3f773b New render event API (non functional yet) 2018-11-16 14:57:12 +01:00
Tim Schaub
f90efac131 Smaller canvas when rotating vector layers 2018-11-16 14:57:11 +01:00
Tim Schaub
26de43de0c Unused imports 2018-11-16 14:57:11 +01:00
Tim Schaub
ed7825e13a Render vector images 2018-11-16 14:57:11 +01:00
Tim Schaub
8b077c66d8 Rotate images 2018-11-16 14:57:11 +01:00
Tim Schaub
b5378deb45 Create context in the canvas layer base class 2018-11-16 14:57:11 +01:00
Tim Schaub
33f6d6f110 One fewer transform 2018-11-16 14:57:11 +01:00
Tim Schaub
a9f98f2b1e Rotation for image layers 2018-11-16 14:57:10 +01:00
Tim Schaub
8822690cf4 Work with sources that have a max zoom 2018-11-16 14:57:10 +01:00
ahocevar
9a4e665c3b Position tiles by offset instead of extent 2018-11-16 14:56:50 +01:00
Tim Schaub
6edac64b81 Use the regular map in the rendering tests 2018-11-16 14:56:50 +01:00
Tim Schaub
f9ebb0c917 Return two canvases from the vector tile layer renderer 2018-11-16 14:56:50 +01:00
Tim Schaub
c137b68938 Dispatch pre-render before rendering 2018-11-16 14:56:50 +01:00
ahocevar
8eb48604e9 Round tile x and y and reuse w and h 2018-11-16 14:56:50 +01:00
ahocevar
5fffb67242 Clear canvas when nothing to replay 2018-11-16 14:56:49 +01:00
ahocevar
c37b6202a0 Use Map 2018-11-16 14:56:49 +01:00
Tim Schaub
610fcab79e Dispatch pre and post render events 2018-11-16 14:56:49 +01:00
Tim Schaub
489af4023d Work with high dpi tiles 2018-11-16 14:56:49 +01:00
Tim Schaub
87e5bbac4d Image layer renderer 2018-11-16 14:56:49 +01:00
Tim Schaub
20e5841aed Remove vector mode for vector tile rendering 2018-11-16 14:56:48 +01:00
Tim Schaub
39a4f42e3d Resize canvas to handle rotation 2018-11-16 14:56:48 +01:00
Tim Schaub
6234b69512 Handle opacity and rotation in canvas intermediate renderer 2018-11-16 14:56:48 +01:00
Tim Schaub
5ba8795355 Tile layer rendering with the composite renderer 2018-11-16 14:56:48 +01:00
Tim Schaub
433ab97d1c End of composeFrame 2018-11-16 14:56:48 +01:00
Tim Schaub
f416cf742d Workaround for raster source 2018-11-16 14:56:48 +01:00
Tim Schaub
c612cce591 Give the map some height for the box tests 2018-11-16 14:56:47 +01:00
Tim Schaub
f2cab1fcbb Give the map some height for scale line tests 2018-11-16 14:56:47 +01:00
Tim Schaub
b3903df156 Use the composite renderer 2018-11-16 14:56:47 +01:00
Tim Schaub
dd23055db1 Merge pull request #8951 from jahow/remove-webgl
Remove legacy WebGL code & implement a lightweight API for point rendering
2018-11-16 14:55:00 +01:00
Olivier Guyot
1ae1b60308 Rename webgl-new to webgl 2018-11-16 14:05:06 +01:00
Olivier Guyot
40d5f4efe7 Added unit tests for the WebGLHelper class 2018-11-16 14:05:06 +01:00
Frederic Junod
0189e8345d Remove WebGL references in comments 2018-11-16 14:05:06 +01:00
Olivier Guyot
72cf7b13fa removed existing webgl rendering unit tests 2018-11-16 14:05:04 +01:00
Olivier Guyot
66a74ac019 Renamed WebGLBuffer to WebGLArrayBuffer to avoid conflicts
In the future this should be reworked to have a clearer API in general.
2018-11-16 14:02:10 +01:00
Olivier Guyot
a84559d1fb Added documentation & fixed linting for WebGL classes 2018-11-16 14:02:10 +01:00
Olivier Guyot
cb77e10179 Removed the legacy shader build system 2018-11-16 14:02:10 +01:00
Olivier Guyot
874047a928 The heatmap layer now has a configurable blur 2018-11-16 14:02:10 +01:00
Olivier Guyot
530bcd0c88 Improve handling of uniforms in webgl helper 2018-11-16 14:02:10 +01:00
Olivier Guyot
94524fb431 Webgl Helper now handles uniforms with framestate as input 2018-11-16 14:02:10 +01:00
Olivier Guyot
716256e8f3 Cleaned up the heatmap layer & use dynamic radius 2018-11-16 14:02:10 +01:00
Olivier Guyot
fb8bf785dd Use the gradient texture in the heatmap layer 2018-11-16 14:02:10 +01:00
Olivier Guyot
4a275c543a Use post-processes in the heatmap example 2018-11-16 14:02:10 +01:00
Olivier Guyot
0c1424c5bb Added the concept of post process passes for webgl 2018-11-16 14:02:10 +01:00
Olivier Guyot
7fa2189fe9 Remove the bulk of the WebGL legacy code.
Things left to do:
* redo an icon layer example
* redo a clipping layer example
* update docs where WebGL renderers are mentioned
2018-11-16 14:02:08 +01:00
Olivier Guyot
d3294730f1 Renamed WebGLContext to Helper for clarity 2018-11-16 14:01:21 +01:00
Olivier Guyot
494b817f47 Use the new webgl renderer in the heatmap layer 2018-11-16 14:01:21 +01:00
Olivier Guyot
51becf1c2e Allow custom post processing & improve blending 2018-11-16 14:01:21 +01:00
Olivier Guyot
298af9ca0f added the concept of frame buffer in webgl context 2018-11-16 14:01:21 +01:00
Olivier Guyot
81807c5910 Added size & position callbacks 2018-11-16 14:01:21 +01:00
Olivier Guyot
3c5eac13c9 Handle alpha & custom shaders in renderer 2018-11-16 14:01:21 +01:00
Olivier Guyot
154a046130 Added texcoord in default shader 2018-11-16 14:01:20 +01:00
Olivier Guyot
583dfb8e9d Actually make the renderer work 2018-11-16 14:01:20 +01:00
Olivier Guyot
1c11dc5311 Improved shader compilation & fixed PointsLayer ones 2018-11-16 14:01:20 +01:00
Olivier Guyot
97b16be572 Added attribute handling 2018-11-16 14:01:20 +01:00
Olivier Guyot
fc20dc986c Better handle uniform locations in shaders 2018-11-16 14:01:20 +01:00
Olivier Guyot
66efee9e22 Add vertex shaders to pointslayer 2018-11-16 14:01:20 +01:00
Olivier Guyot
71270efa75 Added a new WebGLPointsRenderer 2018-11-16 14:01:20 +01:00
Olivier Guyot
0a0d6c22f5 Modified the WebGLContext to be used independantly 2018-11-16 14:01:20 +01:00
Andreas Hocevar
36cf7227c0 Merge pull request #8926 from gberaudo/replay_refactoring
Uncouple replay creation and rendering
2018-11-16 13:54:18 +01:00
Frédéric Junod
9937fd5963 Merge pull request #8952 from fredj/polygon-style_tests
Port polygon-style rendering test
2018-11-16 13:52:52 +01:00
ahocevar
8d51e0d487 Remove resolved FIXMEs 2018-11-16 13:50:42 +01:00
ahocevar
981b398042 Add a FIXME for the measure function to go away 2018-11-16 13:49:50 +01:00
Frédéric Junod
2e32ac7254 Merge pull request #8939 from fredj/rework_d3_example
Use ol/layer/Layer instead of ol/source/ImageCanvas in d3 example
2018-11-16 13:45:30 +01:00
Frederic Junod
0ed7f76ad0 Port polygon-style rendering test 2018-11-16 13:40:11 +01:00
ahocevar
6cbde797be Use NaN for unavailable values and handle text creation separately 2018-11-16 13:35:15 +01:00
ahocevar
d3355f613c Combine if blocks 2018-11-16 13:04:03 +01:00
Guillaume Beraudo
81d0bc21d5 Pass instructions to executor constructor 2018-11-16 12:36:50 +01:00
Frédéric Junod
2cb9d47547 Merge pull request #8957 from fredj/misc
Fix JSdoc type cast format
2018-11-16 11:25:16 +01:00
Frederic Junod
e991dcc38c Fix JSdoc type cast format 2018-11-16 11:12:17 +01:00
Frederic Junod
bf9171a689 Add examples/d3.css 2018-11-16 10:47:07 +01:00
Tim Schaub
bdbf00f055 Merge pull request #8934 from fgravin/renderingtest
Port layer tiles rendering tests
2018-11-16 10:42:17 +01:00
Guillaume Beraudo
ce44a9a3e4 Final renamings 2018-11-15 23:46:20 +01:00
Guillaume Beraudo
89fed65f07 Fix incorrect Executor/Builder types 2018-11-15 23:27:43 +01:00
Guillaume Beraudo
da92b2ab3f Improve text replay test 2018-11-15 23:01:45 +01:00
Guillaume Beraudo
eaed37da96 Fix width comparison 2018-11-15 20:03:35 +01:00
Guillaume Beraudo
b1a5f4855f Create geometryWidths array only when needed 2018-11-15 20:03:34 +01:00
ahocevar
94bf02176e Rename ExecutorGroup and move getMaxExtent to Executor 2018-11-15 20:03:34 +01:00
Frederic Junod
178061ab9d Use ol/layer/Layer instead of ol/source/ImageCanvas in d3 example 2018-11-15 18:30:39 +01:00
Florent gravin
f9c64e52af Add rendering test for vector tile layer rotation w/ layer on top 2018-11-15 18:16:58 +01:00
Tim Schaub
00cf75c837 Merge pull request #8944 from jahow/fix-graticule
Use a layer for the graticule instead of a control
2018-11-15 18:07:15 +01:00
Tim Schaub
f95070a34d Merge pull request #8948 from fgravin/mapbox-rotation
Add rotation in mapbox-gl example
2018-11-15 18:04:41 +01:00
Frédéric Junod
5bbfeef12b Merge pull request #8953 from fredj/ci_order
Store rendering artifacts immediately after run tests
2018-11-15 17:42:33 +01:00
Frederic Junod
00d9740a58 Store rendering artifacts immediately after run tests 2018-11-15 17:36:34 +01:00
Florent gravin
7630fafcf2 Add rendering test for vector tile layer rotation 2018-11-15 17:32:50 +01:00
Olivier Guyot
a3f9c6b724 Update change log w/ breaking changes 2018-11-15 17:13:46 +01:00
Frederic Junod
05bf1d8f4a Remove the resolutions list in sphere-mollweide example 2018-11-15 17:12:40 +01:00
Olivier Guyot
3ac46ad10b Removed old control 2018-11-15 17:12:40 +01:00
Olivier Guyot
d5c390e726 Fixed tests & linting 2018-11-15 17:12:40 +01:00
Olivier Guyot
1b8a6baa35 Added extent handling to graticule layer 2018-11-15 17:12:40 +01:00
Olivier Guyot
94bcb8a0f6 Added wrapX option on graticule 2018-11-15 17:12:40 +01:00
Olivier Guyot
c69366ec0a Updated the sphere mollweide example 2018-11-15 17:12:40 +01:00
Olivier Guyot
4ee75359c0 Implemented a feature pool for lines and labels 2018-11-15 17:12:40 +01:00
Olivier Guyot
adb1bd7a31 First version to handle lines only 2018-11-15 17:12:40 +01:00
Olivier Guyot
dbd6dad4f3 Add a new Graticule layer, nothing rendered for now 2018-11-15 17:12:40 +01:00
Frédéric Junod
d7a6c4dbe3 Merge pull request #8950 from fredj/shx
Use shx to run unix commands in package.json
2018-11-15 17:12:01 +01:00
Tim Schaub
56131cf6ea Merge pull request #8946 from tschaub/renderer-fixes
Make the map renderer tolerant of layers without renderers
2018-11-15 15:53:49 +01:00
Florent gravin
12f6ce7a44 Add rendering test for vector tile layer 2018-11-15 15:53:06 +01:00
Frederic Junod
52f4f61a6c Use shx to run unix commands in package.json 2018-11-15 15:52:35 +01:00
Guillaume Beraudo
f9dcadb982 Remove unused methods 2018-11-15 15:20:41 +01:00
Guillaume Beraudo
0f5ced8483 Reduce usage of "replay" term 2018-11-15 15:20:41 +01:00
Guillaume Beraudo
5ecd832c92 Adapt test to new text builder behaviour 2018-11-15 15:20:41 +01:00
Guillaume Beraudo
87a1b926c9 Cleanup executor of unused properties 2018-11-15 15:20:41 +01:00
Guillaume Beraudo
4ba84d7926 Cleanly separate text building and execution 2018-11-15 15:20:41 +01:00
Guillaume Beraudo
afc946b215 Cleanup duplicated and unused code 2018-11-15 15:20:41 +01:00
Guillaume Beraudo
c0df61468f Move drawText along line to executor 2018-11-15 15:20:41 +01:00
Guillaume Beraudo
0ece0fb002 Cleanup unused text replay code 2018-11-15 15:20:41 +01:00
ahocevar
4ce19530ce Remove unused methods 2018-11-15 15:20:41 +01:00
ahocevar
3d203f990e Move measureTextWidths to render/canvas 2018-11-15 15:20:41 +01:00
Guillaume Beraudo
3170355b07 Remove unused function from executor 2018-11-15 15:20:41 +01:00
Guillaume Beraudo
f5a8ad63f9 Improve typing 2018-11-15 15:20:41 +01:00
Guillaume Beraudo
ba6a6fff7d Module renaming 2018-11-15 15:20:41 +01:00
Guillaume Beraudo
951d4d5ade Fix tests 2018-11-15 15:20:41 +01:00
Guillaume Beraudo
e299863117 More renaming 2018-11-15 15:20:41 +01:00
Guillaume Beraudo
f3bd08321a Rename Replay to InstructionsBuilder 2018-11-15 15:20:41 +01:00
Guillaume Beraudo
8097be8419 Remove replay code from Instruction Builder class 2018-11-15 15:20:41 +01:00
Guillaume Beraudo
fcf470fc8d Introduce Instruction executors
Executors are use to render instructions.
They do not contain cod for building instructions.

Signed-off-by: Guillaume Beraudo <guillaume.beraudo@camptocamp.com>
2018-11-15 15:20:41 +01:00
Guillaume Beraudo
ecf79a9ec2 First step in uncoupling replay creation and rendering
Signed-off-by: Guillaume Beraudo <guillaume.beraudo@camptocamp.com>
2018-11-15 15:20:41 +01:00
Florent gravin
4988a50760 Add Stamen-label tiles for rendering tests 2018-11-15 15:20:36 +01:00
Florent gravin
ebbb54456a Add rendering test for layer 2 tiles extent clipping 2018-11-15 15:20:36 +01:00
Florent gravin
081c677ea2 Add rendering test for layer tile simple 2018-11-15 15:20:36 +01:00
Florent gravin
fc85b2ba78 Add rendering test for layer tile transition 2018-11-15 15:20:36 +01:00
Frédéric Junod
d0f66b7cec Merge pull request #8943 from fredj/text-style-tests
Port text style rendering tests
2018-11-15 15:20:11 +01:00
Florent gravin
40b2922b4e Add rotation in mapbox-gl example 2018-11-15 12:55:37 +01:00
Frederic Junod
63b04210ab Allow tolerance to be passed to the render function 2018-11-15 12:51:15 +01:00
Frederic Junod
87c721b071 Port text style rendering tests 2018-11-15 12:51:15 +01:00
Tim Schaub
edeb5d3e71 Remove unused getLayerRenderersByKey method 2018-11-15 12:36:31 +01:00
Tim Schaub
3f624ec0c0 Make map methods tolerant of layers without renderers 2018-11-15 12:35:54 +01:00
Frédéric Junod
0d94b1a566 Merge pull request #8940 from jahow/fix-overview
Make layers mandatory in the OverviewMap control
2018-11-15 12:18:29 +01:00
Olivier Guyot
593632daea Fix the OverviewMap control & example
Layers must now always be specified for the control.
Base example was amended to reflect that.

The breaking change was added in the update notes.
2018-11-15 12:04:49 +01:00
Frédéric Junod
96dd5417e3 Merge pull request #8938 from fredj/render-toContext-tests
Port render-toContext rendering test
2018-11-15 11:31:13 +01:00
Frederic Junod
68b4ef5ec8 Store rendering artifacts 2018-11-15 11:27:48 +01:00
Frederic Junod
6e964c7934 Port render-toContext rendering test 2018-11-15 11:27:48 +01:00
Frédéric Junod
50ae34fcc6 Merge pull request #8941 from fredj/render_message
Rendering tests render message
2018-11-15 10:36:16 +01:00
Frederic Junod
f295a97894 Rendering tests render message 2018-11-14 21:37:45 +01:00
Frédéric Junod
aa841c7de2 Merge pull request #8933 from fredj/icon-symbol-svg
Port icon-symbol-svg rendering test
2018-11-14 20:42:33 +01:00
Tim Schaub
0452da92d3 Merge pull request #8931 from fgravin/mapbox-layer
Add Mapbox-gl-js example
2018-11-14 17:14:05 +01:00
Tim Schaub
7ae051c07a Merge pull request #8937 from tschaub/debug-tiles
Make the tile debug source useful for understanding tiles
2018-11-14 17:06:52 +01:00
Frederic Junod
bed9c6b09a Don't add mapbox-gl into dependencies 2018-11-14 16:34:36 +01:00
Florent gravin
cac323a785 Add mapboxgl npm dependency 2018-11-14 16:30:52 +01:00
Florent gravin
c62ebb9f61 Add mapbox-gl-js example 2018-11-14 16:30:52 +01:00
Frederic Junod
488a104a92 Port icon-symbol-svg rendering tests 2018-11-14 16:26:10 +01:00
Frédéric Junod
7a472321c4 Merge pull request #8930 from fredj/better_export_example
Give the layers container a CSS class name
2018-11-14 16:24:12 +01:00
Frédéric Junod
4adcb5ae6c Merge pull request #8914 from fredj/layer_className
Add new className property to ol/layer/Base
2018-11-14 16:23:56 +01:00
Frédéric Junod
19541699c3 Merge pull request #8910 from fredj/containsXY
Implements containsXY for all geometries
2018-11-14 16:23:26 +01:00
Tim Schaub
d6e8711172 Merge pull request #8922 from fgravin/layerrenderapi
Layer is reponsible for its renderer
2018-11-14 16:09:23 +01:00
Tim Schaub
46b8f39c71 Merge pull request #8936 from tschaub/rendering-sourcemaps
Serve sourcemaps from webpack during rendering tests
2018-11-14 16:00:20 +01:00
Tim Schaub
0e91365859 Make the tile debug source useful for understanding tiles 2018-11-14 15:58:08 +01:00
Tim Schaub
c74d80504e Serve sourcemaps from webpack 2018-11-14 15:51:56 +01:00
Frédéric Junod
f9a7cf2251 Merge pull request #8932 from fredj/dt_pbf
Add pbf TypeScript type definitions
2018-11-14 14:02:38 +01:00
Frederic Junod
5afd8178f4 Add pbf TypeScript type definitions 2018-11-13 18:25:42 +01:00
Andreas Hocevar
82ab50a22b Merge pull request #8924 from ahocevar/reuse-vt-replays
Reuse vector tile replays for interim tiles
2018-11-13 17:21:38 +01:00
Frederic Junod
bdf98d9003 Give the layers container an CSS class name 2018-11-13 17:04:07 +01:00
Frédéric Junod
2bc0d7f2ce Merge pull request #8918 from fredj/dom-to-image-more
Use dom-to-image-more library in export-map
2018-11-13 16:59:06 +01:00
ahocevar
30909ddbcd When rendering interim tiles, reuse existing replay groups 2018-11-13 16:08:49 +01:00
Andreas Hocevar
cda23e0d53 Merge pull request #8928 from ahocevar/mapbox-style
Add vector tile example using ol-mapbox-style
2018-11-13 16:03:31 +01:00
ahocevar
5bfe7089af Update keywords 2018-11-13 15:58:33 +01:00
Frédéric Junod
9c0a7b9ba7 Fix typo
Co-Authored-By: ahocevar <andreas.hocevar@gmail.com>
2018-11-13 15:49:39 +01:00
ahocevar
391fff38aa Add vector tile example using ol-mapbox-style 2018-11-13 15:47:11 +01:00
Frédéric Junod
fd0acaccd1 Merge pull request #8925 from fredj/misc
Don't compute value more that once, remove unneeded type cast
2018-11-13 15:16:33 +01:00
Tim Schaub
96cca7ac18 Merge pull request #8927 from tschaub/local
Use local data for rendering tests
2018-11-13 05:50:59 -07:00
Tim Schaub
c3c5b3b314 Use local data for rendering tests 2018-11-13 13:37:14 +01:00
Frederic Junod
22eb96637f Add new className property to ol/layer/Base 2018-11-13 13:09:06 +01:00
Florent gravin
c2c599a517 Layer is now responsible of its rendering 2018-11-13 12:51:04 +01:00
Florent gravin
d21a88edce Remove map renderer dependency in layer renderer 2018-11-13 12:51:04 +01:00
Frederic Junod
1e1dca5342 Remove unneeded type cast 2018-11-13 12:09:09 +01:00
Frederic Junod
5eed22286b Don't compute value more that once 2018-11-13 12:08:53 +01:00
Frédéric Junod
647421f07b Merge pull request #8920 from fredj/rm_relative
Remove unneeded 'relative' positioning
2018-11-13 11:46:39 +01:00
Frederic Junod
09d87bf33d Remove unneeded 'relative' positioning 2018-11-13 11:36:45 +01:00
Tim Schaub
2caa74a4e9 Merge pull request #8913 from fgravin/intermediatecanvas-renderframe
Implement renderFrame function for intermediate canvas renderer
2018-11-13 03:06:21 -07:00
Florent gravin
a6f94f865b Clear canvas in prepareFrame() 2018-11-12 21:51:39 +01:00
Florent gravin
697e475ee4 Add composite renderFrame() in IntermediateCanvas 2018-11-12 21:51:39 +01:00
Florent gravin
4c787c7f57 Set composite root div position relative 2018-11-12 21:51:39 +01:00
Frederic Junod
d02730abc1 Use dom-to-image-more library in export-map 2018-11-12 21:41:49 +01:00
Tim Schaub
04077675e1 Merge pull request #8916 from tschaub/intermediate-context
Move canvas creation to intermediate canvas renderer constructor
2018-11-12 13:07:01 -07:00
Tim Schaub
1c3e7a548f Merge pull request #8917 from tschaub/layer-transforms
Apply all transforms in the layer renderer
2018-11-12 13:06:43 -07:00
Tim Schaub
432b74d64d Apply all transforms in the layer renderer 2018-11-12 20:57:36 +01:00
Tim Schaub
55a963e0a9 Move canvas creation to intermediate canvas renderer constructor 2018-11-12 20:57:07 +01:00
Tim Schaub
0c97fd63e2 Merge pull request #8912 from tschaub/rotation
Rotation support in the composite renderer
2018-11-12 10:50:02 -07:00
Tim Schaub
edaa615333 Less typing to run the examples 2018-11-12 18:33:07 +01:00
Tim Schaub
afc64258af Support for rotation 2018-11-12 18:33:02 +01:00
timkeane
7274798aa1 Implement ol/geom/Geometry#containsXY
Fixes issue #8863
ol/source/Vector#getFeaturesAtCoordinate and
implementations of ol/geom/Geometry#containsXY
2018-11-12 17:15:44 +01:00
timkeane
5967bc75ba ol/geom/MultiLineString#containsXY 2018-11-12 17:15:22 +01:00
timkeane
c1963ba369 ol/geom/LineString#containsXY 2018-11-12 17:15:10 +01:00
timkeane
58b474225c ol/geom/MultiPoint#containsXY 2018-11-12 17:14:38 +01:00
timkeane
daffbde80b ol/geom/Point#containsXY 2018-11-12 17:14:07 +01:00
Tim Schaub
4a5fa1f840 Merge pull request #8908 from tschaub/opacity
Handle layer opacity in the composite renderer
2018-11-12 07:55:26 -07:00
Tim Schaub
8bf252e70f Handle layer opacity in the composite renderer 2018-11-12 15:16:06 +01:00
Tim Schaub
95c363075c Merge pull request #8848 from tschaub/renderers
Make layer renderers explicit layer dependencies
2018-11-12 07:10:00 -07:00
Tim Schaub
a9b2952be4 Add support for running a subset of rendering tests 2018-11-12 14:54:52 +01:00
Tim Schaub
dc05f48294 Use composite renderer in linestring test 2018-11-12 14:54:52 +01:00
Tim Schaub
43ed2c1764 Composite renderer 2018-11-12 14:54:52 +01:00
Tim Schaub
fc6882f146 Utility method for efficiently managing child nodes 2018-11-12 14:54:12 +01:00
Tim Schaub
a69eeceeba Switch map and layer constructor in tests
The webgl tests do not run currently (which is why these have not been failing).
2018-11-12 14:54:12 +01:00
Tim Schaub
ca5b0c63a5 Remove LayerType 2018-11-12 14:54:11 +01:00
Tim Schaub
c50b9b2c25 Fix examples that use WebGLMap 2018-11-12 14:54:11 +01:00
Tim Schaub
f6b838c635 Make webgl layer renderers dependencies of webgl layers 2018-11-12 14:54:11 +01:00
Tim Schaub
7374e32007 Canvas layer renderers are now dependencies of layers 2018-11-12 14:54:11 +01:00
Tim Schaub
2ec509fbca Add an image vector layer for rendering vectors to an image 2018-11-12 14:54:11 +01:00
Tim Schaub
ae1f3afd66 Base for tile layers, renderer-specific tile layer types 2018-11-12 14:54:11 +01:00
Tim Schaub
285a610c46 Base for image layers, renderer-specific image layer types 2018-11-12 14:54:10 +01:00
Tim Schaub
c9529b9acd Create the appropriate renderer for vector tile layers 2018-11-12 14:54:10 +01:00
Tim Schaub
7ffaa134c7 Conditionally get renderer from the layer 2018-11-12 14:54:10 +01:00
Tim Schaub
6c052c0dab Split vector layer into Canvas and WebGL implementations 2018-11-12 14:54:09 +01:00
Frédéric Junod
6e27b47fc3 Merge pull request #8892 from fredj/do_typo
Use the right device orientation property in example
2018-11-12 11:57:00 +01:00
Frédéric Junod
cbcd1fdcec Merge pull request #8905 from openlayers/greenkeeper/rollup-0.67.1
Update rollup to the latest version 🚀
2018-11-11 21:05:40 +01:00
greenkeeper[bot]
b6ca51a9e6 chore(package): update rollup to version 0.67.1 2018-11-11 15:03:46 +00:00
Tim Schaub
cb9925034c Merge pull request #8904 from tschaub/default-index
Add support for a default index page in the rendering tests
2018-11-10 15:57:24 -07:00
Tim Schaub
767aa7b7a4 Add support for a default index page 2018-11-10 12:44:31 -07:00
Tim Schaub
83c988eed5 Merge pull request #8903 from tschaub/rendering-tests
Additional render tests
2018-11-10 12:22:18 -07:00
Tim Schaub
f67e5642ab Rendering test for an icon 2018-11-10 09:36:23 -07:00
Tim Schaub
7dc5bf3e8d Limit requests sent to webpack middleware 2018-11-10 09:35:32 -07:00
Tim Schaub
0ebc023223 Test a rotated view 2018-11-10 08:31:36 -07:00
Tim Schaub
14d59623aa Expose headless flag 2018-11-10 08:18:41 -07:00
Tim Schaub
67b08a302e Use configured logger 2018-11-10 08:16:56 -07:00
Tim Schaub
93ff80449f Merge pull request #8902 from openlayers/greenkeeper/rollup-0.67.0
Update rollup to the latest version 🚀
2018-11-10 07:10:30 -07:00
greenkeeper[bot]
6aed520d8f chore(package): update rollup to version 0.67.0 2018-11-10 06:59:01 -07:00
Tim Schaub
c43b0cb520 Merge pull request #8895 from tschaub/rendering-tests
New rendering tests
2018-11-09 17:46:32 -07:00
Tim Schaub
6f238a8d09 Add stub support for interactive mode 2018-11-09 15:06:27 -07:00
Tim Schaub
800776b6cb Only test outdated cases by default 2018-11-09 14:43:11 -07:00
Frederic Junod
f444da29bc Add linestring-style rendering test 2018-11-09 13:51:41 -07:00
Tim Schaub
4923fac359 Avoid 404 for favicon.ico 2018-11-09 13:45:19 -07:00
Tim Schaub
8c89e17618 Avoid headless mode in CI 2018-11-09 12:41:48 -07:00
Tim Schaub
1253558006 Register new handler for render with each page navigation 2018-11-09 09:02:08 -07:00
Tim Schaub
67ee32fdea New rendering tests 2018-11-09 09:02:08 -07:00
Frédéric Junod
aab9ff023c Merge pull request #8893 from fredj/proj_sideEffects
Add proj.js to the sideEffects list
2018-11-08 11:42:48 +01:00
Frederic Junod
a73e9607a8 Add proj.js to the sideEffects list 2018-11-07 16:26:04 +01:00
Frederic Junod
017a78d2d1 Use the right device orientation property in example 2018-11-07 15:58:23 +01:00
Tim Schaub
7321541de8 Merge pull request #8887 from openlayers/release-v5.3.0
Changes for 5.3.0
2018-11-06 09:46:18 -07:00
567 changed files with 91544 additions and 18617 deletions

View File

@@ -2,7 +2,7 @@ version: 2
jobs:
build:
docker:
- image: circleci/node:10-browsers
- image: circleci/node:latest-browsers
working_directory: ~/repo
@@ -27,6 +27,10 @@ jobs:
name: Run Tests
command: npm test
- store_artifacts:
path: rendering/cases/
destination: rendering
- run:
name: Build Examples
command: npm run build-examples

View File

@@ -11,7 +11,3 @@ insert_final_newline = true
[*.md]
indent_size = 2
trim_trailing_whitespace = false
[Makefile]
indent_style = tab
indent_size = 4

View File

@@ -1,9 +0,0 @@
<!--
Thank you for your interest in making OpenLayers better!
If you are reporting a bug, please link to an example that reproduces the problem. This will make it easier for people who may want to help you debug.
If you have a usage question, you might want to try Stack Overflow first: https://stackoverflow.com/questions/tagged/openlayers
Thanks
-->

19
.github/ISSUE_TEMPLATE/bug_report.md vendored Normal file
View File

@@ -0,0 +1,19 @@
---
name: Bug report
about: Create a report to help us improve
labels:
- bug
---
**Describe the bug**
A clear and concise description of what the bug is.
**To Reproduce**
Steps to reproduce the behavior:
1. Go to '...'
2. Click on '....'
3. See error
**Expected behavior**
A clear and concise description of what you expected to happen.

View File

@@ -0,0 +1,13 @@
---
name: Feature request
about: Suggest an idea for this project
labels:
- feature request
---
**Is your feature request related to a problem? Please describe.**
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
**Describe the solution you'd like**
A clear and concise description of what you want to happen.

View File

@@ -42,7 +42,7 @@ Your pull request must:
* Follow OpenLayers's coding style.
* Pass the integration tests run automatically by the Travis Continuous
* Pass the integration tests run automatically by the CircleCI Continuous
Integration system.
* Address a single issue or add a single item of functionality.

View File

@@ -5,9 +5,9 @@
You will obviously start by
[forking](https://github.com/openlayers/openlayers/fork) the OpenLayers repository.
### Travis CI
### CircleCI
The Travis CI hook is enabled on the Github repository. This means every pull request
The CircleCI hook is enabled on the Github repository. This means every pull request
is run through a full test suite to ensure it compiles and passes the tests. Failing
pull requests will not be merged.

View File

@@ -1,13 +0,0 @@
SRC_GLSL := $(shell find src -type f -name '*.glsl')
SRC_SHADER_JS := $(patsubst %shader.glsl,%shader.js,$(SRC_GLSL))
SRC_SHADERLOCATIONS_JS := $(patsubst %shader.glsl,%shader/Locations.js,$(SRC_GLSL))
.PHONY: shaders
shaders: $(SRC_SHADER_JS) $(SRC_SHADERLOCATIONS_JS)
%shader.js: %shader.glsl src/ol/webgl/shader.mustache tasks/glslunit.js
@node tasks/glslunit.js --input $< | ./node_modules/.bin/mustache - src/ol/webgl/shader.mustache > $@
%shader/Locations.js: %shader.glsl src/ol/webgl/shaderlocations.mustache tasks/glslunit.js
@mkdir -p $(@D)
@node tasks/glslunit.js --input $< | ./node_modules/.bin/mustache - src/ol/webgl/shaderlocations.mustache > $@

View File

@@ -41,6 +41,28 @@ See the following examples for more detail on bundling OpenLayers with your appl
* Using [Parcel](https://github.com/openlayers/ol-parcel)
* Using [Browserify](https://github.com/openlayers/ol-browserify)
## TypeScript and VS Code IntelliSense support
The `ol` package contains a `src/` folder with JSDoc annotated sources. TypeScript can get type definitions from these sources with a `tsconfig.json` like this:
```js
{
"compilerOptions": {
// Enable JavaScript support
"allowJs": true,
// Point to the JSDoc typed sources when using modules from the ol package
"baseUrl": "./",
"paths": {
"ol": ["node_modules/ol/src"],
"ol/*": ["node_modules/ol/src/*"]
}
},
"include": [
// Include JavaScript files from the ol package
"node_modules/ol/**/*.js"
]
}
```
## Supported Browsers
OpenLayers runs on all modern browsers that support [HTML5](https://html.spec.whatwg.org/multipage/) and [ECMAScript 5](http://www.ecma-international.org/ecma-262/5.1/). This includes Chrome, Firefox, Safari and Edge. For older browsers and platforms like Internet Explorer (down to version 9) and Android 4.x, [polyfills](http://polyfill.io) for `requestAnimationFrame` and `Element.prototype.classList` are required, and using the KML format requires a polyfill for `URL`.
@@ -62,4 +84,4 @@ Please see our guide on [contributing](CONTRIBUTING.md) if you're interested in
- Need help? Find it on [Stack Overflow using the tag 'openlayers'](http://stackoverflow.com/questions/tagged/openlayers)
- Follow [@openlayers](https://twitter.com/openlayers) on Twitter
[![Build Status](https://travis-ci.org/openlayers/openlayers.svg?branch=master)](https://travis-ci.org/openlayers/openlayers)
[![CircleCI](https://circleci.com/gh/openlayers/openlayers/tree/master.svg?style=svg)](https://circleci.com/gh/openlayers/openlayers/tree/master)

View File

@@ -2,6 +2,128 @@
### Next version
#### Backwards incompatible changes
##### Removal of the deprecated "inherits" function
The `inherits` function that was used to inherit the prototype methods from one constructor into another has been removed.
The standard ECMAScript classes should be used instead.
##### New internal tile coordinates
Previously, the internal tile coordinates used in the library had an unusual row order the origin of the tile coordinate system was at the top left as expected, but the rows increased upwards. This meant that all tile coordinates within a tile grid's extent had negative `y` values.
Now, the internal tile coordinates used in the library have the same row order as standard (e.g. XYZ) tile coordinates. The origin is at the top left (as before), and rows or `y` values increase downward. So the top left tile of a tile grid is now `0, 0`, whereas it was `0, -1` before.
```
x, y values for tile coordinates
origin
*__________________________
| | | |
| 0, 0 | 1, 0 | 2, 0 |
|________|________|________|
| | | |
| 0, 1 | 1, 1 | 2, 1 |
|________|________|________|
| | | |
| 0, 2 | 1, 2 | 2, 2 |
|________|________|________|
```
This change should only affect you if you were using a custom `tileLoadFunction` or `tileUrlFunction`. For example, if you used to have a `tileUrlFunction` that looked like this:
```js
// before
function tileUrlFunction(tileCoord) {
const z = tileCoord[0];
const x = tileCoord[1];
const y = -tileCoord[2] - 1;
// do something with z, x, y
}
```
You would now do something like this:
```js
// after
function tileUrlFunction(tileCoord) {
const z = tileCoord[0];
const x = tileCoord[1];
const y = tileCoord[2];
// do something with z, x, y
}
```
In addition (this should be exceedingly rare), if you previously created a `ol/tilegrid/WMTS` by hand and you were providing an array of `sizes`, you no longer have to provide a negative height if your tile origin is the top-left corner (the common case). On the other hand, if you are providing a custom array of `sizes` and your origin is the bottom of the grid (this is uncommon), your height values must now be negative.
##### Removal of the "vector" render mode for vector tile layers
If you were previously using `VectorTile` layers with `renderMode: 'vector'`, you have to remove this configuration option. That mode was removed. `'hybrid'` (default) and `'image'` are still available.
##### New `prerender` and `postrender` layer events replace old `precompose`, `render` and `postcompose` events
If you were previously registering for `precompose` and `postcompose` events, you should now register for `prerender` and `postrender` events on layers. Instead of the previous `render` event, you should now listen for `postrender`. Layers are no longer composed to a single Canvas element. Instead, they are added to the map viewport as individual elements.
##### New `getVectorContext` function provides access to the immediate vector rendering API
Previously, render events included a `vectorContext` property that allowed you to render features or geometries directly to the map. This is still possible, but you now have to explicitly create a vector context with the `getVectorContext` function. This change makes the immediate rendering API an explicit dependency if your application uses it. If you don't use this API, your application bundle will not include the vector rendering modules (as it did before).
Here is an abbreviated example of how to use the `getVectorContext` function:
```js
import {getVectorContext} from 'ol/render';
// construct your map and layers as usual
layer.on('postrender', function(event) {
const vectorContext = getVectorContext(event);
// use any of the drawing methods on the vector context
});
```
##### Layers can only be added to a single map
Previously, it was possible to render a single layer in two maps. Now, each layer can only belong to a single map (in the same way that a single DOM element can only have one parent).
##### The `OverviewMap` requires a list of layers.
Due to the constraint above (layers can only be added to a single map), the overview map needs to be constructed with a list of layers.
##### The `ol/Graticule` has been replaced by `ol/layer/Graticule`
Previously, a graticule was not a layer. Now it is. See the graticule example for details on how to add a graticule layer to your map.
##### Drop of support for the experimental WebGL renderer
The WebGL map and layers renderers are gone, replaced by a `WebGLHelper` function that provides a lightweight,
low-level access to the WebGL API. This is implemented in a new `WebGLPointsLayer` which does simple rendering of large number
of points with custom shaders.
This is now used in the `Heatmap` layer.
The removed classes and components are:
* `WebGLMap` and `WebGLMapRenderer`
* `WebGLLayerRenderer`
* `WebGLImageLayer` and `WebGLImageLayerRenderer`
* `WebGLTileLayer` and `WebGLTileLayerRenderer`
* `WebGLVectorLayer` and `WebGLVectorLayerRenderer`
* `WebGLReplay` and derived classes, along with associated shaders
* `WebGLReplayGroup`
* `WebGLImmediateRenderer`
* `WebGLMap`
* The shader build process using `mustache` and the `Makefile` at the root
##### Removal of the AtlasManager
Following the removal of the experimental WebGL renderer, the AtlasManager has been removed as well. The atlas was only used by this renderer.
The non API `getChecksum` functions of the style is also removed.
#### Other changes
##### Always load tiles while animating or interacting
`ol/PluggableMap` and subclasses no longer support the `loadTilesWhileAnimating` and `loadTilesWhileInteracting` options. These options were used to enable tile loading during animations and interactions. With the new DOM composition render strategy, it is no longer necessary to postpone tile loading until after animations or interactions.
### v5.3.0
#### The `getUid` function returns string

View File

@@ -1,6 +0,0 @@
# 5.3.1
The 5.3.1 release is a patch that addresses an issue when using `angular-cli` to build an OpenLayers-based application.
* [#9253](https://github.com/openlayers/openlayers/pull/9253) - Add proj.js to the sideEffects list ([@romanzoller](https://github.com/romanzoller))

View File

@@ -1,6 +0,0 @@
# 5.3.2
The 5.3.2 release is a patch that addresses a tile source issue with old tile data when the source revision changed.
* [#9422](https://github.com/openlayers/openlayers/pull/9422) - Clear context when source revision changed (v5.3.x fix) ([@elemoine](https://github.com/elemoine))

View File

@@ -4,12 +4,62 @@ var version = obj.packageInfo.version;
<!DOCTYPE html>
<html lang="en">
<head>
<script>
var gaProperty = 'UA-2577926-1';
// Disable tracking if the opt-out cookie exists.
var disableStr = 'ga-disable-' + gaProperty;
if (document.cookie.indexOf(disableStr + '=true') > -1) {
window[disableStr] = true;
}
function gaOptout() {
document.cookie = disableStr + '=true; expires=Thu, 31 Dec 2099 23:59:59 UTC; path=/';
window[disableStr] = true;
}
function gaOptoutRevoke() {
document.cookie = disableStr + '=false; expires=Thu, 31 Dec 2099 23:59:59 UTC; path=/';
window[disableStr] = false;
}
</script>
<!-- Global site tag (gtag.js) - Google Analytics -->
<script async src="https://www.googletagmanager.com/gtag/js?id=UA-2577926-1"></script>
<script>
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('js', new Date());
gtag('config', 'UA-2577926-1');
gtag('config', 'UA-2577926-1', { 'anonymize_ip': true });
</script>
<link rel="stylesheet" type="text/css" href="//cdnjs.cloudflare.com/ajax/libs/cookieconsent2/3.1.0/cookieconsent.min.css" />
<script src="//cdnjs.cloudflare.com/ajax/libs/cookieconsent2/3.1.0/cookieconsent.min.js"></script>
<script>
window.addEventListener("load", function() {
window.cookieconsent.initialise({
'palette': {
'popup': {
'background': '#eaf7f7',
'text': '#5c7291'
},
'button': {
'background': '#56cbdb',
'text': '#ffffff'
}
},
'theme': 'edgeless',
'type': 'opt-out',
'onInitialise': function (status) {
if (!this.hasConsented()) {
gaOptout()
}
},
'onStatusChange': function(status, chosenBefore) {
if (!this.hasConsented()) {
gaOptout()
}
},
'onRevokeChoice': function() {
gaOptoutRevoke()
}
})
});
</script>
<meta charset="utf-8">
<title>OpenLayers v<?js= version ?> API - <?js= title ?></title>

View File

@@ -0,0 +1,64 @@
{
"compilerOptions": {
/* Basic Options */
"target": "ES5", /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017','ES2018' or 'ESNEXT'. */
"module": "es2015", /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', or 'ESNext'. */
// "lib": [], /* Specify library files to be included in the compilation. */
"allowJs": true, /* Allow javascript files to be compiled. */
// "checkJs": true, /* Report errors in .js files. */
// "jsx": "preserve", /* Specify JSX code generation: 'preserve', 'react-native', or 'react'. */
// "declaration": true, /* Generates corresponding '.d.ts' file. */
// "declarationMap": true, /* Generates a sourcemap for each corresponding '.d.ts' file. */
"sourceMap": true, /* Generates corresponding '.map' file. */
// "outFile": "./", /* Concatenate and emit output to single file. */
"outDir": "../build/ol", /* Redirect output structure to the directory. */
// "rootDir": "./", /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */
// "composite": true, /* Enable project compilation */
// "removeComments": true, /* Do not emit comments to output. */
// "noEmit": true, /* Do not emit outputs. */
"importHelpers": false, /* Import emit helpers from 'tslib'. */
// "downlevelIteration": true, /* Provide full support for iterables in 'for-of', spread, and destructuring when targeting 'ES5' or 'ES3'. */
// "isolatedModules": true, /* Transpile each file as a separate module (similar to 'ts.transpileModule'). */
/* Strict Type-Checking Options */
"strict": false, /* Enable all strict type-checking options. */
// "noImplicitAny": true, /* Raise error on expressions and declarations with an implied 'any' type. */
// "strictNullChecks": true, /* Enable strict null checks. */
// "strictFunctionTypes": true, /* Enable strict checking of function types. */
// "strictBindCallApply": true, /* Enable strict 'bind', 'call', and 'apply' methods on functions. */
// "strictPropertyInitialization": true, /* Enable strict checking of property initialization in classes. */
// "noImplicitThis": true, /* Raise error on 'this' expressions with an implied 'any' type. */
// "alwaysStrict": true, /* Parse in strict mode and emit "use strict" for each source file. */
/* Additional Checks */
// "noUnusedLocals": true, /* Report errors on unused locals. */
// "noUnusedParameters": true, /* Report errors on unused parameters. */
// "noImplicitReturns": true, /* Report error when not all code paths in function return a value. */
// "noFallthroughCasesInSwitch": true, /* Report errors for fallthrough cases in switch statement. */
/* Module Resolution Options */
// "moduleResolution": "node", /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */
// "baseUrl": "./", /* Base directory to resolve non-absolute module names. */
// "paths": {}, /* A series of entries which re-map imports to lookup locations relative to the 'baseUrl'. */
// "rootDirs": [], /* List of root folders whose combined content represents the structure of the project at runtime. */
// "typeRoots": [], /* List of folders to include type definitions from. */
// "types": [], /* Type declaration files to be included in compilation. */
// "allowSyntheticDefaultImports": true, /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */
"esModuleInterop": false, /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */
// "preserveSymlinks": true, /* Do not resolve the real path of symlinks. */
/* Source Map Options */
// "sourceRoot": "", /* Specify the location where debugger should locate TypeScript files instead of source locations. */
// "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */
// "inlineSourceMap": true, /* Emit a single file with source maps instead of having a separate file. */
"inlineSources": false /* Emit the source alongside the sourcemaps within a single file; requires '--inlineSourceMap' or '--sourceMap' to be set. */
/* Experimental Options */
// "experimentalDecorators": true, /* Enables experimental support for ES7 decorators. */
// "emitDecoratorMetadata": true, /* Enables experimental support for emitting type metadata for decorators. */
},
"include": [
"../build/ol/src/**/*.js"
],
"exclude": []
}

View File

@@ -111,7 +111,7 @@ Features for `updates` must have an id set by the feature reader or `ol.Feature#
### 28
`renderMode` must be `'image'`, `'hybrid'` or `'vector'`.
`renderMode` must be `'image'` or `'hybrid'`.
### 29

View File

@@ -18,14 +18,14 @@ Below you'll find a complete working example. Create a new file, copy in the co
<!doctype html>
<html lang="en">
<head>
<link rel="stylesheet" href="https://cdn.rawgit.com/openlayers/openlayers.github.io/master/en/{{ latest }}/css/ol.css" type="text/css">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/openlayers/openlayers.github.io@master/en/{{ latest }}/css/ol.css" type="text/css">
<style>
.map {
height: 400px;
width: 100%;
}
</style>
<script src="https://cdn.rawgit.com/openlayers/openlayers.github.io/master/en/{{ latest }}/build/ol.js"></script>
<script src="https://cdn.jsdelivr.net/gh/openlayers/openlayers.github.io@master/en/{{ latest }}/build/ol.js"></script>
<title>OpenLayers example</title>
</head>
<body>
@@ -60,7 +60,7 @@ To include a map a web page you will need 3 things:
### Include OpenLayers
```xml
<script src="https://cdn.rawgit.com/openlayers/openlayers.github.io/master/en/{{ latest }}/build/ol.js"></script>
<script src="https://cdn.jsdelivr.net/gh/openlayers/openlayers.github.io@master/en/{{ latest }}/build/ol.js"></script>
```
The first part is to include the JavaScript library. For the purpose of this tutorial, here we simply point to the openlayers.org website to get the whole library. In a production environment, we would build a custom version of the library including only the module needed for our application.

View File

@@ -17,7 +17,7 @@ OpenLayers is available as [`ol` npm package](https://npmjs.com/package/ol), whi
## Renderers and Browser Support
By default, OpenLayers uses a performance optimized Canvas renderer. An experimental WebGL renderer (without text rendering support) is also available.
By default, OpenLayers uses a performance optimized Canvas renderer.
OpenLayers runs on all modern browsers that support [HTML5](https://html.spec.whatwg.org/multipage/) and [ECMAScript 5](http://www.ecma-international.org/ecma-262/5.1/). This includes Chrome, Firefox, Safari and Edge. For older browsers and platforms like Internet Explorer (down to version 9) and Android 4.x, [polyfills](http://polyfill.io), the application bundle needs to be transpiled (e.g. using [Babel](https://babeljs.io)) and bundled with polyfills for `requestAnimationFrame`, `Element.prototype.classList` and `URL`.
@@ -44,6 +44,6 @@ import {Tile, Vector} from 'ol/layer';
In addition to these re-exported classes, modules with lowercase names also provide constants or functions as named exports:
```js
import {inherits} from 'ol';
import {getUid} from 'ol';
import {fromLonLat} from 'ol/proj';
```

View File

@@ -11,9 +11,11 @@ In this tutorial, we will be using [Parcel](https://parceljs.org) to bundle our
## 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 with
Add OpenLayers as dependency to your application with
npm init
This will create a `package.json` file in your working directory. Add OpenLayers as dependency to your application with
npm install ol
@@ -69,13 +71,21 @@ You will also need an `index.html` file that will use your bundle. Here is a sim
## 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 two additional lines in `package.json` you can introduce the commands `npm run build` and `npm start` to manually build your bundle and watch for changes, respectively. The final `package.json` with the two additional commands `"start"` and `"build"` should look like this:
```json
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"start": "parcel index.html",
"build": "parcel build --public-url . index.html"
{
"name": "test",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"start": "parcel index.html",
"build": "parcel build --public-url . index.html"
},
"author": "",
"license": "ISC"
}
```
That's it. Now to run your application, enter

View File

@@ -5,10 +5,12 @@
"common": false,
"createMapboxStreetsV6Style": false,
"d3": false,
"domtoimage": false,
"geojsonvt": false,
"GyroNorm": false,
"jsPDF": false,
"jsts": false,
"mapboxgl": false,
"saveAs": false,
"toastr": false,
"topojson": false,

View File

@@ -24,9 +24,6 @@ const map = new Map({
source: new OSM()
})
],
// Improve user experience by loading tiles while animating. Will make
// animations stutter on mobile or slow devices.
loadTilesWhileAnimating: true,
view: view
});

View File

@@ -29,9 +29,6 @@ for (i = 0, ii = styles.length; i < ii; ++i) {
}
const map = new Map({
layers: layers,
// Improve user experience by loading tiles while dragging/zooming. Will make
// zooming choppy on mobile or slow devices.
loadTilesWhileInteracting: true,
target: 'map',
view: new View({
center: [-6655.5402445057125, 6709968.258934638],

View File

@@ -1,4 +0,0 @@
.map{
background-repeat: repeat;
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAN1wAADdcBQiibeAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAApSURBVBiVY7x///5/BjSgqKjIiC7GhC6ACwygQgxHMzAwMGDz4FDwDAD5/wevjSk4mwAAAABJRU5ErkJggg==);
}

View File

@@ -1,68 +0,0 @@
---
layout: example.html
title: Blend Modes
shortdesc: Shows how to change the canvas compositing / blending mode in post- and precompose eventhandlers.
docs: >
<p>This example shows how to change the canvas compositing / blending mode in
post- and precompose event handlers. The Canvas 2D API provides the property
<code>globalCompositeOperation</code> with which one can influence which
composition operation will be used when drawing on the canvas. The various
options are well described on the <a href="https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/globalCompositeOperation">MDN
documentation page</a>.</p>
<p>In this example three circles on the corners of an equilateral triangle are
drawn with red, green or blue styles respectively. By setting the
<code>globalCompositeOperation</code> you can change how these colors turn out
when they are combined on the map.</p>
<p>You can select an operation in the select-field and you can also control
which layers will be affected by the chosen operation through the layer
checkboxes.</p>
tags: "blendmode, blend-mode, blend mode, blendingmode, blending-mode, blending mode, composition, compositing, canvas, vector"
---
<div id="map" class="map"></div>
<form class="form-horizontal">
<label>
<select id="blend-mode" class="form-control">
<option value="source-over">source-over (default)</option>
<option>source-in</option>
<option>source-out</option>
<option>source-atop</option>
<option>destination-over</option>
<option>destination-in</option>
<option>destination-out</option>
<option>destination-atop</option>
<option>lighter</option>
<option>copy</option>
<option>xor</option>
<option>multiply</option>
<option>screen</option>
<option>overlay</option>
<option>darken</option>
<option>lighten</option>
<option>color-dodge</option>
<option>color-burn</option>
<option>hard-light</option>
<option>soft-light</option>
<option selected>difference</option>
<option>exclusion</option>
<option>hue</option>
<option>saturation</option>
<option>color</option>
<option>luminosity</option>
</select>
Canvas compositing / blending mode
</label>
<label>
<input type="checkbox" id="affect-red" checked>
Red circle affected
</label>
<label>
<input type="checkbox" id="affect-green" checked>
Green circle affected
</label>
<label>
<input type="checkbox" id="affect-blue" checked>
Blue circle affected
</label>
</form>

View File

@@ -1,173 +0,0 @@
import Feature from '../src/ol/Feature.js';
import Map from '../src/ol/Map.js';
import View from '../src/ol/View.js';
import Point from '../src/ol/geom/Point.js';
import VectorLayer from '../src/ol/layer/Vector.js';
import VectorSource from '../src/ol/source/Vector.js';
import {Circle as CircleStyle, Fill, Stroke, Style} from '../src/ol/style.js';
// Create separate layers for red, green an blue circles.
//
// Every layer has one feature that is styled with a circle, together the
// features form the corners of an equilateral triangle and their styles overlap
const redLayer = new VectorLayer({
source: new VectorSource({
features: [new Feature(new Point([0, 0]))]
}),
style: new Style({
image: new CircleStyle({
fill: new Fill({
color: 'rgba(255,0,0,0.8)'
}),
stroke: new Stroke({
color: 'rgb(255,0,0)',
width: 15
}),
radius: 120
})
})
});
const greenLayer = new VectorLayer({
source: new VectorSource({
// 433.013 is roughly 250 * Math.sqrt(3)
features: [new Feature(new Point([250, 433.013]))]
}),
style: new Style({
image: new CircleStyle({
fill: new Fill({
color: 'rgba(0,255,0,0.8)'
}),
stroke: new Stroke({
color: 'rgb(0,255,0)',
width: 15
}),
radius: 120
})
})
});
const blueLayer = new VectorLayer({
source: new VectorSource({
features: [new Feature(new Point([500, 0]))]
}),
style: new Style({
image: new CircleStyle({
fill: new Fill({
color: 'rgba(0,0,255,0.8)'
}),
stroke: new Stroke({
color: 'rgb(0,0,255)',
width: 15
}),
radius: 120
})
})
});
// Create the map, the view is centered on the triangle. Zooming and panning is
// restricted to a sane area
const map = new Map({
layers: [
redLayer,
greenLayer,
blueLayer
],
target: 'map',
view: new View({
center: [250, 220],
extent: [0, 0, 500, 500],
resolution: 4,
minResolution: 2,
maxResolution: 32
})
});
// Get the form elements and bind the listeners
const select = document.getElementById('blend-mode');
const affectRed = document.getElementById('affect-red');
const affectGreen = document.getElementById('affect-green');
const affectBlue = document.getElementById('affect-blue');
/**
* This method sets the globalCompositeOperation to the value of the select
* field and it is bound to the precompose event of the layers.
*
* @param {module:ol/render/Event~RenderEvent} evt The render event.
*/
const setBlendModeFromSelect = function(evt) {
evt.context.globalCompositeOperation = select.value;
};
/**
* This method resets the globalCompositeOperation to the default value of
* 'source-over' and it is bound to the postcompose event of the layers.
*
* @param {module:ol/render/Event~RenderEvent} evt The render event.
*/
const resetBlendModeFromSelect = function(evt) {
evt.context.globalCompositeOperation = 'source-over';
};
/**
* Bind the pre- and postcompose handlers to the passed layer.
*
* @param {module:ol/layer/Vector} layer The layer to bind the handlers to.
*/
const bindLayerListeners = function(layer) {
layer.on('precompose', setBlendModeFromSelect);
layer.on('postcompose', resetBlendModeFromSelect);
};
/**
* Unind the pre- and postcompose handlers to the passed layers.
*
* @param {module:ol/layer/Vector} layer The layer to unbind the handlers from.
*/
const unbindLayerListeners = function(layer) {
layer.un('precompose', setBlendModeFromSelect);
layer.un('postcompose', resetBlendModeFromSelect);
};
/**
* Handler for the click event of the 'affect-XXX' checkboxes.
*
* @this {HTMLInputElement}
*/
const affectLayerClicked = function() {
let layer;
if (this.id == 'affect-red') {
layer = redLayer;
} else if (this.id == 'affect-green') {
layer = greenLayer;
} else {
layer = blueLayer;
}
if (this.checked) {
bindLayerListeners(layer);
} else {
unbindLayerListeners(layer);
}
map.render();
};
// Rerender map when blend mode changes
select.addEventListener('change', function() {
map.render();
});
// Unbind / bind listeners depending on the checked state when the checkboxes
// are clicked
affectRed.addEventListener('click', affectLayerClicked);
affectGreen.addEventListener('click', affectLayerClicked);
affectBlue.addEventListener('click', affectLayerClicked);
// Initially bind listeners
bindLayerListeners(redLayer);
bindLayerListeners(greenLayer);
bindLayerListeners(blueLayer);

View File

@@ -61,8 +61,8 @@ const style = new Style({
* The styling function for the vector layer, will return an array of styles
* which either contains the aboove gradient or pattern.
*
* @param {module:ol/Feature~Feature} feature The feature to style.
* @return {module:ol/style/Style} The style to use for the feature.
* @param {import("../src/ol/Feature.js").default} feature The feature to style.
* @return {Style} The style to use for the feature.
*/
const getStackedStyle = function(feature) {
const id = feature.getId();

View File

@@ -4,10 +4,7 @@ title: Canvas Tiles
shortdesc: Renders tiles with coordinates for debugging.
docs: >
The black grid tiles are generated on the client with an HTML5 canvas. The
displayed tile coordinates are OpenLayers tile coordinates. These increase
from bottom to top, but standard XYZ tiling scheme coordinates increase from
top to bottom. To calculate the `y` for a standard XYZ tile coordinate, use
`-y - 1`.
displayed tile coordinates are the XYZ tile coordinates.
tags: "layers, openstreetmap, canvas"
---
<div id="map" class="map"></div>

View File

@@ -1,26 +1,21 @@
import Map from '../src/ol/Map.js';
import View from '../src/ol/View.js';
import TileLayer from '../src/ol/layer/Tile.js';
import {fromLonLat} from '../src/ol/proj.js';
import {OSM, TileDebug} from '../src/ol/source.js';
const osmSource = new OSM();
const map = new Map({
layers: [
new TileLayer({
source: osmSource
source: new OSM()
}),
new TileLayer({
source: new TileDebug({
projection: 'EPSG:3857',
tileGrid: osmSource.getTileGrid()
})
source: new TileDebug()
})
],
target: 'map',
view: new View({
center: fromLonLat([-0.1275, 51.507222]),
zoom: 10
center: [0, 0],
zoom: 1
})
});

View File

@@ -50,7 +50,7 @@ const map = new Map({
const zoomtoswitzerlandbest = document.getElementById('zoomtoswitzerlandbest');
zoomtoswitzerlandbest.addEventListener('click', function() {
const feature = source.getFeatures()[0];
const polygon = /** @type {module:ol/geom/SimpleGeometry~SimpleGeometry} */ (feature.getGeometry());
const polygon = /** @type {import("../src/ol/geom/SimpleGeometry.js").default} */ (feature.getGeometry());
view.fit(polygon, {padding: [170, 50, 30, 150], constrainResolution: false});
}, false);
@@ -58,7 +58,7 @@ const zoomtoswitzerlandconstrained =
document.getElementById('zoomtoswitzerlandconstrained');
zoomtoswitzerlandconstrained.addEventListener('click', function() {
const feature = source.getFeatures()[0];
const polygon = /** @type {module:ol/geom/SimpleGeometry~SimpleGeometry} */ (feature.getGeometry());
const polygon = /** @type {import("../src/ol/geom/SimpleGeometry.js").default} */ (feature.getGeometry());
view.fit(polygon, {padding: [170, 50, 30, 150]});
}, false);
@@ -66,21 +66,21 @@ const zoomtoswitzerlandnearest =
document.getElementById('zoomtoswitzerlandnearest');
zoomtoswitzerlandnearest.addEventListener('click', function() {
const feature = source.getFeatures()[0];
const polygon = /** @type {module:ol/geom/SimpleGeometry~SimpleGeometry} */ (feature.getGeometry());
const polygon = /** @type {import("../src/ol/geom/SimpleGeometry.js").default} */ (feature.getGeometry());
view.fit(polygon, {padding: [170, 50, 30, 150], nearest: true});
}, false);
const zoomtolausanne = document.getElementById('zoomtolausanne');
zoomtolausanne.addEventListener('click', function() {
const feature = source.getFeatures()[1];
const point = /** @type {module:ol/geom/SimpleGeometry~SimpleGeometry} */ (feature.getGeometry());
const point = /** @type {import("../src/ol/geom/SimpleGeometry.js").default} */ (feature.getGeometry());
view.fit(point, {padding: [170, 50, 30, 150], minResolution: 50});
}, false);
const centerlausanne = document.getElementById('centerlausanne');
centerlausanne.addEventListener('click', function() {
const feature = source.getFeatures()[1];
const point = /** @type {module:ol/geom/Point~Point} */ (feature.getGeometry());
const size = /** @type {module:ol/size~Size} */ (map.getSize());
const point = /** @type {import("../src/ol/geom/Point.js").default} */ (feature.getGeometry());
const size = map.getSize();
view.centerOn(point.getCoordinates(), size, [570, 500]);
}, false);

View File

@@ -9,14 +9,11 @@ import OSM from '../src/ol/source/OSM.js';
// Define rotate to north control.
//
/**
* @constructor
* @extends {module:ol/control/Control~Control}
* @param {Object=} opt_options Control options.
*/
class RotateNorthControl extends Control {
/**
* @param {Object=} opt_options Control options.
*/
constructor(opt_options) {
const options = opt_options || {};

View File

@@ -8,10 +8,6 @@ import {TileJSON, Vector as VectorSource} from '../src/ol/source.js';
import {Fill, Icon, Stroke, Style} from '../src/ol/style.js';
/**
* @constructor
* @extends {module:ol/interaction/Pointer}
*/
class Drag extends PointerInteraction {
constructor() {
super({
@@ -22,7 +18,7 @@ class Drag extends PointerInteraction {
});
/**
* @type {module:ol/pixel~Pixel}
* @type {import("../src/ol/coordinate.js").Coordinate}
* @private
*/
this.coordinate_ = null;
@@ -34,7 +30,7 @@ class Drag extends PointerInteraction {
this.cursor_ = 'pointer';
/**
* @type {module:ol/Feature~Feature}
* @type {Feature}
* @private
*/
this.feature_ = null;
@@ -49,7 +45,7 @@ class Drag extends PointerInteraction {
/**
* @param {module:ol/MapBrowserEvent~MapBrowserEvent} evt Map browser event.
* @param {import("../src/ol/MapBrowserEvent.js").default} evt Map browser event.
* @return {boolean} `true` to start the drag sequence.
*/
function handleDownEvent(evt) {
@@ -70,7 +66,7 @@ function handleDownEvent(evt) {
/**
* @param {module:ol/MapBrowserEvent~MapBrowserEvent} evt Map browser event.
* @param {import("../src/ol/MapBrowserEvent.js").default} evt Map browser event.
*/
function handleDragEvent(evt) {
const deltaX = evt.coordinate[0] - this.coordinate_[0];
@@ -85,7 +81,7 @@ function handleDragEvent(evt) {
/**
* @param {module:ol/MapBrowserEvent~MapBrowserEvent} evt Event.
* @param {import("../src/ol/MapBrowserEvent.js").default} evt Event.
*/
function handleMoveEvent(evt) {
if (this.cursor_) {
@@ -141,13 +137,13 @@ const map = new Map({
features: [pointFeature, lineFeature, polygonFeature]
}),
style: new Style({
image: new Icon(/** @type {module:ol/style/Icon~Options} */ ({
image: new Icon({
anchor: [0.5, 46],
anchorXUnits: 'fraction',
anchorYUnits: 'pixels',
opacity: 0.95,
src: 'data/icon.png'
})),
}),
stroke: new Stroke({
width: 3,
color: [255, 0, 0, 1]

4
examples/d3.css Normal file
View File

@@ -0,0 +1,4 @@
path.boundary {
fill: none;
stroke: #777;
}

View File

@@ -3,7 +3,7 @@ layout: example.html
title: d3 Integration
shortdesc: Example of using OpenLayers and d3 together.
docs: >
<p>The example loads TopoJSON geometries and uses d3 (<code>d3.geo.path</code>) to render these geometries to a canvas element that is then used as the image of an OpenLayers image layer.</p>
The example loads TopoJSON geometries and uses d3 (<code>d3.geo.path</code>) to render these geometries to a SVG element.
tags: "d3"
resources:
- https://unpkg.com/d3@4.12.0/build/d3.js

122
examples/d3.js vendored
View File

@@ -1,10 +1,70 @@
import Map from '../src/ol/Map.js';
import View from '../src/ol/View.js';
import {getWidth, getCenter} from '../src/ol/extent.js';
import {Image as ImageLayer, Tile as TileLayer} from '../src/ol/layer.js';
import {Layer, Tile as TileLayer} from '../src/ol/layer.js';
import SourceState from '../src/ol/source/State';
import {fromLonLat, toLonLat} from '../src/ol/proj.js';
import {ImageCanvas as ImageCanvasSource, Stamen} from '../src/ol/source.js';
import Stamen from '../src/ol/source/Stamen.js';
class CanvasLayer extends Layer {
constructor(options) {
super(options);
this.features = options.features;
this.svg = d3.select(document.createElement('div')).append('svg')
.style('position', 'absolute');
this.svg.append('path')
.datum(this.features)
.attr('class', 'boundary');
}
getSourceState() {
return SourceState.READY;
}
render(frameState) {
const width = frameState.size[0];
const height = frameState.size[1];
const projection = frameState.viewState.projection;
const d3Projection = d3.geoMercator().scale(1).translate([0, 0]);
let d3Path = d3.geoPath().projection(d3Projection);
const pixelBounds = d3Path.bounds(this.features);
const pixelBoundsWidth = pixelBounds[1][0] - pixelBounds[0][0];
const pixelBoundsHeight = pixelBounds[1][1] - pixelBounds[0][1];
const geoBounds = d3.geoBounds(this.features);
const geoBoundsLeftBottom = fromLonLat(geoBounds[0], projection);
const geoBoundsRightTop = fromLonLat(geoBounds[1], projection);
let geoBoundsWidth = geoBoundsRightTop[0] - geoBoundsLeftBottom[0];
if (geoBoundsWidth < 0) {
geoBoundsWidth += getWidth(projection.getExtent());
}
const geoBoundsHeight = geoBoundsRightTop[1] - geoBoundsLeftBottom[1];
const widthResolution = geoBoundsWidth / pixelBoundsWidth;
const heightResolution = geoBoundsHeight / pixelBoundsHeight;
const r = Math.max(widthResolution, heightResolution);
const scale = r / frameState.viewState.resolution;
const center = toLonLat(getCenter(frameState.extent), projection);
d3Projection.scale(scale).center(center).translate([width / 2, height / 2]);
d3Path = d3Path.projection(d3Projection);
d3Path(this.features);
this.svg.attr('width', width);
this.svg.attr('height', height);
this.svg.select('path')
.attr('d', d3Path);
return this.svg.node();
}
}
const map = new Map({
layers: [
@@ -26,62 +86,10 @@ const map = new Map({
* Load the topojson data and create an ol/layer/Image for that data.
*/
d3.json('data/topojson/us.json', function(error, us) {
const features = topojson.feature(us, us.objects.counties);
/**
* This function uses d3 to render the topojson features to a canvas.
* @param {module:ol/extent~Extent} extent Extent.
* @param {number} resolution Resolution.
* @param {number} pixelRatio Pixel ratio.
* @param {module:ol/size~Size} size Size.
* @param {module:ol/proj/Projection~Projection} projection Projection.
* @return {HTMLCanvasElement} A canvas element.
*/
const canvasFunction = function(extent, resolution, pixelRatio, size, projection) {
const canvasWidth = size[0];
const canvasHeight = size[1];
const canvas = d3.select(document.createElement('canvas'));
canvas.attr('width', canvasWidth).attr('height', canvasHeight);
const context = canvas.node().getContext('2d');
const d3Projection = d3.geoMercator().scale(1).translate([0, 0]);
let d3Path = d3.geoPath().projection(d3Projection);
const pixelBounds = d3Path.bounds(features);
const pixelBoundsWidth = pixelBounds[1][0] - pixelBounds[0][0];
const pixelBoundsHeight = pixelBounds[1][1] - pixelBounds[0][1];
const geoBounds = d3.geoBounds(features);
const geoBoundsLeftBottom = fromLonLat(geoBounds[0], projection);
const geoBoundsRightTop = fromLonLat(geoBounds[1], projection);
let geoBoundsWidth = geoBoundsRightTop[0] - geoBoundsLeftBottom[0];
if (geoBoundsWidth < 0) {
geoBoundsWidth += getWidth(projection.getExtent());
}
const geoBoundsHeight = geoBoundsRightTop[1] - geoBoundsLeftBottom[1];
const widthResolution = geoBoundsWidth / pixelBoundsWidth;
const heightResolution = geoBoundsHeight / pixelBoundsHeight;
const r = Math.max(widthResolution, heightResolution);
const scale = r / (resolution / pixelRatio);
const center = toLonLat(getCenter(extent), projection);
d3Projection.scale(scale).center(center)
.translate([canvasWidth / 2, canvasHeight / 2]);
d3Path = d3Path.projection(d3Projection).context(context);
d3Path(features);
context.stroke();
return canvas.node();
};
const layer = new ImageLayer({
source: new ImageCanvasSource({
canvasFunction: canvasFunction,
projection: 'EPSG:3857'
})
const layer = new CanvasLayer({
features: topojson.feature(us, us.objects.counties)
});
map.addLayer(layer);
});

File diff suppressed because it is too large Load Diff

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.8 KiB

View File

@@ -29,7 +29,7 @@ gn.init().then(function() {
gn.start(function(event) {
const center = view.getCenter();
const resolution = view.getResolution();
const alpha = toRadians(event.do.beta);
const alpha = toRadians(event.do.alpha);
const beta = toRadians(event.do.beta);
const gamma = toRadians(event.do.gamma);

View File

@@ -3,7 +3,7 @@ layout: example.html
title: Drag-and-Drop Image Vector
shortdesc: Example of using the drag-and-drop interaction with image vector rendering.
docs: >
Example of using the drag-and-drop interaction with an `ol/layer/Vector` with `renderMode: 'image'`. Drag and drop GPX, GeoJSON, IGC, KML, or TopoJSON files on to the map. Each file is rendered to an image on the client.
Example of using the drag-and-drop interaction with an `ol/layer/VectorImage` layer. Drag and drop GPX, GeoJSON, IGC, KML, or TopoJSON files on to the map. Each file is rendered to an image on the client.
tags: "drag-and-drop-image-vector, gpx, geojson, igc, kml, topojson, vector, image"
cloak:
- key: As1HiMj1PvLPlqc_gtM7AqZfBL8ZL3VrjaS3zIb22Uvb9WKhuJObROC-qUpa81U5

View File

@@ -2,7 +2,7 @@ import Map from '../src/ol/Map.js';
import View from '../src/ol/View.js';
import {GPX, GeoJSON, IGC, KML, TopoJSON} from '../src/ol/format.js';
import {defaults as defaultInteractions, DragAndDrop} from '../src/ol/interaction.js';
import {Vector as VectorLayer, Tile as TileLayer} from '../src/ol/layer.js';
import {VectorImage as VectorImageLayer, Tile as TileLayer} from '../src/ol/layer.js';
import {BingMaps, Vector as VectorSource} from '../src/ol/source.js';
const dragAndDropInteraction = new DragAndDrop({
@@ -36,8 +36,7 @@ dragAndDropInteraction.on('addfeatures', function(event) {
const vectorSource = new VectorSource({
features: event.features
});
map.addLayer(new VectorLayer({
renderMode: 'image',
map.addLayer(new VectorImageLayer({
source: vectorSource
}));
map.getView().fit(vectorSource.getExtent());

View File

@@ -4,14 +4,14 @@ import {MultiPoint, Point} from '../src/ol/geom.js';
import TileLayer from '../src/ol/layer/Tile.js';
import OSM from '../src/ol/source/OSM.js';
import {Circle as CircleStyle, Fill, Stroke, Style} from '../src/ol/style.js';
import {getVectorContext} from '../src/ol/render.js';
const tileLayer = new TileLayer({
source: new OSM()
});
const map = new Map({
layers: [
new TileLayer({
source: new OSM()
})
],
layers: [tileLayer],
target: 'map',
view: new View({
center: [0, 0],
@@ -46,8 +46,8 @@ const omegaTheta = 30000; // Rotation period in ms
const R = 7e6;
const r = 2e6;
const p = 2e6;
map.on('postcompose', function(event) {
const vectorContext = event.vectorContext;
tileLayer.on('postrender', function(event) {
const vectorContext = getVectorContext(event);
const frameState = event.frameState;
const theta = 2 * Math.PI * frameState.time / omegaTheta;
const coordinates = [];

View File

@@ -3,12 +3,12 @@ layout: example.html
title: Map Export
shortdesc: Example of exporting a map as a PNG image.
docs: >
Example of exporting a map as a PNG image. This example requires a browser
that supports <a href="https://developer.mozilla.org/de/docs/Web/API/HTMLCanvasElement/toBlob#Browser_compatibility">
<code>canvas.toBlob()</code></a>.
Example of exporting a map as a PNG image. This example use the <a href="https://www.npmjs.com/package/dom-to-image-more">dom-to-image-more</a>
library.
tags: "export, png, openstreetmap"
resources:
- https://cdnjs.cloudflare.com/ajax/libs/FileSaver.js/1.3.3/FileSaver.min.js
- https://unpkg.com/dom-to-image-more@2.7.1/dist/dom-to-image-more.min.js
---
<div id="map" class="map"></div>
<a id="export-png" class="btn btn-default"><i class="fa fa-download"></i> Download PNG</a>
<a id="image-download" download="map.png"></a>

View File

@@ -24,15 +24,13 @@ const map = new Map({
});
document.getElementById('export-png').addEventListener('click', function() {
map.once('rendercomplete', function(event) {
const canvas = event.context.canvas;
if (navigator.msSaveBlob) {
navigator.msSaveBlob(canvas.msToBlob(), 'map.png');
} else {
canvas.toBlob(function(blob) {
saveAs(blob, 'map.png');
map.once('rendercomplete', function() {
domtoimage.toPng(map.getViewport().querySelector('.ol-layers'))
.then(function(dataURL) {
const link = document.getElementById('image-download');
link.href = dataURL;
link.click();
});
}
});
map.renderSync();
});

View File

@@ -7,6 +7,7 @@ docs: >
tags: "export, pdf, openstreetmap"
resources:
- https://cdnjs.cloudflare.com/ajax/libs/jspdf/1.2.61/jspdf.min.js
- https://unpkg.com/dom-to-image-more@2.7.1/dist/dom-to-image-more.min.js
---
<div class="row-fluid">
<div class="span12">

View File

@@ -53,20 +53,20 @@ exportButton.addEventListener('click', function() {
const dim = dims[format];
const width = Math.round(dim[0] * resolution / 25.4);
const height = Math.round(dim[1] * resolution / 25.4);
const size = /** @type {module:ol/size~Size} */ (map.getSize());
const size = map.getSize();
const extent = map.getView().calculateExtent(size);
map.once('rendercomplete', function(event) {
const canvas = event.context.canvas;
const data = canvas.toDataURL('image/jpeg');
const pdf = new jsPDF('landscape', undefined, format);
pdf.addImage(data, 'JPEG', 0, 0, dim[0], dim[1]);
pdf.save('map.pdf');
// Reset original map size
map.setSize(size);
map.getView().fit(extent, {size});
exportButton.disabled = false;
document.body.style.cursor = 'auto';
map.once('rendercomplete', function() {
domtoimage.toJpeg(map.getViewport().querySelector('.ol-layers')).then(function(dataUrl) {
const pdf = new jsPDF('landscape', undefined, format);
pdf.addImage(dataUrl, 'JPEG', 0, 0, dim[0], dim[1]);
pdf.save('map.pdf');
// Reset original map size
map.setSize(size);
map.getView().fit(extent, {size});
exportButton.disabled = false;
document.body.style.cursor = 'auto';
});
});
// Set print size

View File

@@ -3,7 +3,7 @@ layout: example.html
title: Custom Animation
shortdesc: Demonstrates how to animate features.
docs: >
This example shows how to use <b>postcompose</b> and <b>vectorContext</b> to
This example shows how to use <b>postrender</b> and <b>vectorContext</b> to
animate features. Here we choose to do a flash animation each time a feature
is added to the layer.
tags: "animation, vector, feature, flash"

View File

@@ -8,16 +8,16 @@ import {Tile as TileLayer, Vector as VectorLayer} from '../src/ol/layer.js';
import {fromLonLat} from '../src/ol/proj.js';
import {OSM, Vector as VectorSource} from '../src/ol/source.js';
import {Circle as CircleStyle, Stroke, Style} from '../src/ol/style.js';
import {getVectorContext} from '../src/ol/render.js';
const tileLayer = new TileLayer({
source: new OSM({
wrapX: false
})
});
const map = new Map({
layers: [
new TileLayer({
source: new OSM({
wrapX: false
})
})
],
layers: [tileLayer],
target: 'map',
view: new View({
center: [0, 0],
@@ -44,10 +44,10 @@ function addRandomFeature() {
const duration = 3000;
function flash(feature) {
const start = new Date().getTime();
const listenerKey = map.on('postcompose', animate);
const listenerKey = tileLayer.on('postrender', animate);
function animate(event) {
const vectorContext = event.vectorContext;
const vectorContext = getVectorContext(event);
const frameState = event.frameState;
const flashGeom = feature.getGeometry().clone();
const elapsed = frameState.time - start;
@@ -72,7 +72,7 @@ function flash(feature) {
unByKey(listenerKey);
return;
}
// tell OpenLayers to continue postcompose animation
// tell OpenLayers to continue postrender animation
map.render();
}
}

View File

@@ -3,10 +3,10 @@ layout: example.html
title: Marker Animation
shortdesc: Demonstrates how to move a feature along a line.
docs: >
This example shows how to use <b>postcompose</b> and <b>vectorContext</b> to
animate a (marker) feature along a line. In this example an encoded polyline
This example shows how to use <b>postrender</b> events and a <b>vector context</b> to
animate a marker feature along a line. In this example an encoded polyline
is being used.
tags: "animation, feature, postcompose, polyline"
tags: "animation, feature, postrender, polyline"
cloak:
- key: As1HiMj1PvLPlqc_gtM7AqZfBL8ZL3VrjaS3zIb22Uvb9WKhuJObROC-qUpa81U5
value: Your Bing Maps Key from http://www.bingmapsportal.com/ here

View File

@@ -7,6 +7,7 @@ import {Tile as TileLayer, Vector as VectorLayer} from '../src/ol/layer.js';
import BingMaps from '../src/ol/source/BingMaps.js';
import VectorSource from '../src/ol/source/Vector.js';
import {Circle as CircleStyle, Fill, Icon, Stroke, Style} from '../src/ol/style.js';
import {getVectorContext} from '../src/ol/render.js';
// This long string is placed here due to jsFiddle limitations.
// It is usually loaded with AJAX.
@@ -52,7 +53,7 @@ const polyline = [
'~@ym@yjA??a@cFd@kBrCgDbAUnAcBhAyAdk@et@??kF}D??OL'
].join('');
const route = /** @type {module:ol/geom/LineString~LineString} */ (new Polyline({
const route = /** @type {import("../src/ol/geom/LineString.js").default} */ (new Polyline({
factor: 1e6
}).readGeometry(polyline, {
dataProjection: 'EPSG:4326',
@@ -123,7 +124,6 @@ const vectorLayer = new VectorLayer({
const center = [-5639523.95, -3501274.52];
const map = new Map({
target: document.getElementById('map'),
loadTilesWhileAnimating: true,
view: new View({
center: center,
zoom: 10,
@@ -142,7 +142,7 @@ const map = new Map({
});
const moveFeature = function(event) {
const vectorContext = event.vectorContext;
const vectorContext = getVectorContext(event);
const frameState = event.frameState;
if (animating) {
@@ -160,7 +160,7 @@ const moveFeature = function(event) {
const feature = new Feature(currentPoint);
vectorContext.drawFeature(feature, styles.geoMarker);
}
// tell OpenLayers to continue the postcompose animation
// tell OpenLayers to continue the postrender animation
map.render();
};
@@ -176,7 +176,7 @@ function startAnimation() {
geoMarker.setStyle(null);
// just in case you pan somewhere else
map.getView().setCenter(center);
map.on('postcompose', moveFeature);
vectorLayer.on('postrender', moveFeature);
map.render();
}
}
@@ -191,10 +191,10 @@ function stopAnimation(ended) {
// if animation cancelled set the marker at the beginning
const coord = ended ? routeCoords[routeLength - 1] : routeCoords[0];
/** @type {module:ol/geom/Point~Point} */ (geoMarker.getGeometry())
.setCoordinates(coord);
const geometry = /** @type {import("../src/ol/geom/Point").default} */ (geoMarker.getGeometry());
geometry.setCoordinates(coord);
//remove listener
map.un('postcompose', moveFeature);
vectorLayer.un('postrender', moveFeature);
}
startButton.addEventListener('click', startAnimation, false);

View File

@@ -1,12 +1,12 @@
---
layout: example.html
title: Flight Animation
shortdesc: Demonstrates how to animate flights with ´postcompose´.
shortdesc: Demonstrates how to animate flights with ´postrender´.
docs: >
This example shows how to use <b>postcompose</b> and <b>vectorContext</b> to
This example shows how to use <b>postrender</b> and <b>vectorContext</b> to
animate flights. A great circle arc between two airports is calculated using
<a href="https://github.com/springmeyer/arc.js">arc.js</a> and then the flight
paths are animated with <b>postcompose</b>. The flight data is provided by
paths are animated with <b>postrender</b>. The flight data is provided by
<a href="http://openflights.org/data.html">OpenFlights</a> (a simplified data
set from the <a href="https://www.mapbox.com/mapbox.js/example/v1.0.0/animating-flight-paths/">
Mapbox.js documentation</a> is used).

View File

@@ -6,14 +6,17 @@ import {Tile as TileLayer, Vector as VectorLayer} from '../src/ol/layer.js';
import Stamen from '../src/ol/source/Stamen.js';
import VectorSource from '../src/ol/source/Vector.js';
import {Stroke, Style} from '../src/ol/style.js';
import {getVectorContext} from '../src/ol/render.js';
const tileLayer = new TileLayer({
source: new Stamen({
layer: 'toner'
})
});
const map = new Map({
layers: [
new TileLayer({
source: new Stamen({
layer: 'toner'
})
})
tileLayer
],
target: 'map',
view: new View({
@@ -63,7 +66,7 @@ const flightsSource = new VectorSource({
addLater(feature, i * 50);
}
}
map.on('postcompose', animateFlights);
tileLayer.on('postrender', animateFlights);
});
}
});
@@ -85,7 +88,7 @@ map.addLayer(flightsLayer);
const pointsPerMs = 0.1;
function animateFlights(event) {
const vectorContext = event.vectorContext;
const vectorContext = getVectorContext(event);
const frameState = event.frameState;
vectorContext.setStyle(style);

View File

@@ -77,7 +77,7 @@ fetch(url).then(function(response) {
tileLoadFunction: function(tile) {
const format = tile.getFormat();
const tileCoord = tile.getTileCoord();
const data = tileIndex.getTile(tileCoord[0], tileCoord[1], -tileCoord[2] - 1);
const data = tileIndex.getTile(tileCoord[0], tileCoord[1], tileCoord[2]);
const features = format.readFeatures(
JSON.stringify({

View File

@@ -13,13 +13,13 @@ const view = new View({
zoom: 19
});
const tileLayer = new TileLayer({
source: new OSM()
});
// creating the map
const map = new Map({
layers: [
new TileLayer({
source: new OSM()
})
],
layers: [tileLayer],
target: 'map',
view: view
});
@@ -36,7 +36,7 @@ map.addOverlay(marker);
// LineString to store the different geolocation positions. This LineString
// is time aware.
// The Z dimension is actually used to store the rotation (heading).
const positions = new LineString([], /** @type {module:ol/geom/GeometryLayout} */ ('XYZM'));
const positions = new LineString([], 'XYZM');
// Geolocation Control
const geolocation = new Geolocation({
@@ -155,7 +155,7 @@ const geolocateBtn = document.getElementById('geolocate');
geolocateBtn.addEventListener('click', function() {
geolocation.setTracking(true); // Start position tracking
map.on('postcompose', updateView);
tileLayer.on('postrender', updateView);
map.render();
disableButtons();
@@ -197,7 +197,7 @@ simulateBtn.addEventListener('click', function() {
}
geolocate();
map.on('postcompose', updateView);
tileLayer.on('postrender', updateView);
map.render();
disableButtons();

View File

@@ -1,9 +1,9 @@
---
layout: example.html
title: Map Graticule
shortdesc: This example shows how to add a graticule overlay to a map.
shortdesc: This example shows how to add a graticule layer to a map.
docs: >
This example shows how to add a graticule overlay to a map.
This example shows how to add a graticule layer to a map.
tags: "graticule"
---
<div id="map" class="map"></div>

View File

@@ -1,4 +1,4 @@
import Graticule from '../src/ol/Graticule.js';
import Graticule from '../src/ol/layer/Graticule.js';
import Map from '../src/ol/Map.js';
import View from '../src/ol/View.js';
import TileLayer from '../src/ol/layer/Tile.js';
@@ -13,6 +13,16 @@ const map = new Map({
source: new OSM({
wrapX: false
})
}),
new Graticule({
// the style to use for the lines, optional.
strokeStyle: new Stroke({
color: 'rgba(255,120,0,0.9)',
width: 2,
lineDash: [0.5, 4]
}),
showLabels: true,
wrapX: false
})
],
target: 'map',
@@ -21,16 +31,3 @@ const map = new Map({
zoom: 5
})
});
// Create the graticule component
const graticule = new Graticule({
// the style to use for the lines, optional.
strokeStyle: new Stroke({
color: 'rgba(255,120,0,0.9)',
width: 2,
lineDash: [0.5, 4]
}),
showLabels: true
});
graticule.setMap(map);

View File

@@ -43,11 +43,14 @@ const map = new Map({
})
});
blur.addEventListener('input', function() {
const blurHandler = function() {
vector.setBlur(parseInt(blur.value, 10));
});
};
blur.addEventListener('input', blurHandler);
blur.addEventListener('change', blurHandler);
radius.addEventListener('input', function() {
const radiusHandler = function() {
vector.setRadius(parseInt(radius.value, 10));
});
};
radius.addEventListener('input', radiusHandler);
radius.addEventListener('change', radiusHandler);

View File

@@ -69,9 +69,6 @@ for (i = 0, ii = hereLayers.length; i < ii; ++i) {
const map = new Map({
layers: layers,
// Improve user experience by loading tiles while dragging/zooming. Will make
// zooming choppy on mobile or slow devices.
loadTilesWhileInteracting: true,
target: 'map',
view: new View({
center: [921371.9389, 6358337.7609],

View File

@@ -22,27 +22,27 @@ const madrid = new Feature({
});
rome.setStyle(new Style({
image: new Icon(/** @type {module:ol/style/Icon~Options} */ ({
image: new Icon({
color: '#8959A8',
crossOrigin: 'anonymous',
src: 'data/dot.png'
}))
})
}));
london.setStyle(new Style({
image: new Icon(/** @type {module:ol/style/Icon~Options} */ ({
image: new Icon({
color: '#4271AE',
crossOrigin: 'anonymous',
src: 'data/dot.png'
}))
})
}));
madrid.setStyle(new Style({
image: new Icon(/** @type {module:ol/style/Icon~Options} */ ({
image: new Icon({
color: [113, 140, 0],
crossOrigin: 'anonymous',
src: 'data/dot.png'
}))
})
}));

View File

@@ -11,13 +11,13 @@ import {Icon, Style} from '../src/ol/style.js';
function createStyle(src, img) {
return new Style({
image: new Icon(/** @type {module:ol/style/Icon~Options} */ ({
image: new Icon({
anchor: [0.5, 0.96],
crossOrigin: 'anonymous',
src: src,
img: img,
imgSize: img ? [img.width, img.height] : undefined
}))
})
});
}

View File

@@ -1,10 +1,17 @@
---
layout: example.html
title: Icon Sprites with WebGL
shortdesc: Icon sprite with WebGL
shortdesc: Rendering many icons with WebGL
docs: >
<p>In this example a sprite image is used for the icon styles. Using a sprite is required to get good performance with WebGL.</p>
tags: "webgl, icon, sprite, vector, point"
This example shows how to use `ol/renderer/webgl/PointsLayer` to render
a very large amount of sprites. The above map is based on a dataset from the National UFO Reporting Center: each
icon marks a UFO sighting according to its reported shape (disk, light, fireball...). The older the sighting, the redder
the icon.
A very simple sprite atlas is used in the form of a PNG file containing all icons on a grid. Then, the `texCoordCallback`
option of the `ol/renderer/webgl/PointsLayer` constructor is used to specify which sprite to use according to the sighting shape.
The dataset contains around 80k points and can be found here: https://www.kaggle.com/NUFORC/ufo-sightings
tags: "webgl, icon, sprite, point, ufo"
---
<div id="map" class="map"></div>
<div id="info">&nbsp;</div>

View File

@@ -1,136 +1,124 @@
import Feature from '../src/ol/Feature.js';
import Map from '../src/ol/WebGLMap.js';
import Map from '../src/ol/Map.js';
import View from '../src/ol/View.js';
import Point from '../src/ol/geom/Point.js';
import VectorLayer from '../src/ol/layer/Vector.js';
import VectorSource from '../src/ol/source/Vector.js';
import {Icon, Style} from '../src/ol/style.js';
import TileLayer from '../src/ol/layer/Tile.js';
import TileJSON from '../src/ol/source/TileJSON';
import Feature from '../src/ol/Feature';
import Point from '../src/ol/geom/Point';
import VectorLayer from '../src/ol/layer/Vector';
import {Vector} from '../src/ol/source';
import {fromLonLat} from '../src/ol/proj';
import WebGLPointsLayerRenderer from '../src/ol/renderer/webgl/PointsLayer';
import {lerp} from '../src/ol/math';
const features = [];
const vectorSource = new Vector({
features: [],
attributions: 'National UFO Reporting Center'
});
const iconInfo = [{
offset: [0, 0],
opacity: 1.0,
rotateWithView: true,
rotation: 0.0,
scale: 1.0,
size: [55, 55]
}, {
offset: [110, 86],
opacity: 0.75,
rotateWithView: false,
rotation: Math.PI / 2.0,
scale: 1.25,
size: [55, 55]
}, {
offset: [55, 0],
opacity: 0.5,
rotateWithView: true,
rotation: Math.PI / 3.0,
scale: 1.5,
size: [55, 86]
}, {
offset: [212, 0],
opacity: 1.0,
rotateWithView: true,
rotation: 0.0,
scale: 1.0,
size: [44, 44]
}];
const texture = document.createElement('img');
texture.src = 'data/ufo_shapes.png';
let i;
// This describes the content of the associated sprite sheet
// coords are u0, v0, u1, v1 for a given shape
const shapeTextureCoords = {
'light': [0, 0.5, 0.25, 0],
'sphere': [0.25, 0.5, 0.5, 0],
'circle': [0.25, 0.5, 0.5, 0],
'disc': [0.5, 0.5, 0.75, 0],
'oval': [0.5, 0.5, 0.75, 0],
'triangle': [0.75, 0.5, 1, 0],
'fireball': [0, 1, 0.25, 0.5],
'default': [0.75, 1, 1, 0.5]
};
const iconCount = iconInfo.length;
const icons = new Array(iconCount);
for (i = 0; i < iconCount; ++i) {
const info = iconInfo[i];
icons[i] = new Icon({
offset: info.offset,
opacity: info.opacity,
rotateWithView: info.rotateWithView,
rotation: info.rotation,
scale: info.scale,
size: info.size,
crossOrigin: 'anonymous',
src: 'data/Butterfly.png'
});
const oldColor = [255, 160, 110];
const newColor = [180, 255, 200];
class WebglPointsLayer extends VectorLayer {
createRenderer() {
return new WebGLPointsLayerRenderer(this, {
texture: texture,
colorCallback: function(feature, vertex, component) {
// component at index 3 is alpha
if (component === 3) {
return 1;
}
// color is interpolated based on year (min is 1910, max is 2013)
// please note: most values are between 2000-2013
const ratio = (feature.get('year') - 1950) / (2013 - 1950);
return lerp(oldColor[component], newColor[component], ratio * ratio) / 255;
},
texCoordCallback: function(feature, component) {
let coords = shapeTextureCoords[feature.get('shape')];
if (!coords) {
coords = shapeTextureCoords['default'];
}
return coords[component];
},
sizeCallback: function() {
return 16;
}
});
}
}
const featureCount = 50000;
const features = new Array(featureCount);
let feature, geometry;
const e = 25000000;
for (i = 0; i < featureCount; ++i) {
geometry = new Point(
[2 * e * Math.random() - e, 2 * e * Math.random() - e]);
feature = new Feature(geometry);
feature.setStyle(
new Style({
image: icons[i % (iconCount - 1)]
function loadData() {
const client = new XMLHttpRequest();
client.open('GET', 'data/csv/ufo_sighting_data.csv');
client.onload = function() {
const csv = client.responseText;
let curIndex;
let prevIndex = 0;
let line;
while ((curIndex = csv.indexOf('\n', prevIndex)) > 0) {
line = csv.substr(prevIndex, curIndex - prevIndex).split(',');
prevIndex = curIndex + 1;
// skip header
if (prevIndex === 0) {
continue;
}
const coords = fromLonLat([parseFloat(line[5]), parseFloat(line[4])]);
// only keep valid points
if (isNaN(coords[0]) || isNaN(coords[1])) {
continue;
}
features.push(new Feature({
datetime: line[0],
year: parseInt(/[0-9]{4}/.exec(line[0])[0]), // extract the year as int
shape: line[2],
duration: line[3],
geometry: new Point(coords)
}));
}
vectorSource.addFeatures(features);
};
client.send();
}
loadData();
new Map({
layers: [
new TileLayer({
source: new TileJSON({
url: 'https://api.tiles.mapbox.com/v3/mapbox.world-dark.json?secure',
crossOrigin: 'anonymous'
})
}),
new WebglPointsLayer({
source: vectorSource
})
);
features[i] = feature;
}
const vectorSource = new VectorSource({
features: features
});
const vector = new VectorLayer({
source: vectorSource
});
const map = new Map({
layers: [vector],
],
target: document.getElementById('map'),
view: new View({
center: [0, 0],
zoom: 5
center: [0, 4000000],
zoom: 2
})
});
const overlayFeatures = [];
for (i = 0; i < featureCount; i += 30) {
const clone = features[i].clone();
clone.setStyle(null);
overlayFeatures.push(clone);
}
new VectorLayer({
map: map,
source: new VectorSource({
features: overlayFeatures
}),
style: new Style({
image: icons[iconCount - 1]
})
});
map.on('click', function(evt) {
const info = document.getElementById('info');
info.innerHTML =
'Hold on a second, while I catch those butterflies for you ...';
window.setTimeout(function() {
const features = [];
map.forEachFeatureAtPixel(evt.pixel, function(feature) {
features.push(feature);
return false;
});
if (features.length === 1) {
info.innerHTML = 'Got one butterfly';
} else if (features.length > 1) {
info.innerHTML = 'Got ' + features.length + ' butterflies';
} else {
info.innerHTML = 'Couldn\'t catch a single butterfly';
}
}, 1);
});
map.on('pointermove', function(evt) {
if (evt.dragging) {
return;
}
const pixel = map.getEventPixel(evt.originalEvent);
const hit = map.hasFeatureAtPixel(pixel);
map.getTarget().style.cursor = hit ? 'pointer' : '';
});

View File

@@ -17,12 +17,12 @@ const iconFeature = new Feature({
});
const iconStyle = new Style({
image: new Icon(/** @type {module:ol/style/Icon~Options} */ ({
image: new Icon({
anchor: [0.5, 46],
anchorXUnits: 'fraction',
anchorYUnits: 'pixels',
src: 'data/icon.png'
}))
})
});
iconFeature.setStyle(iconStyle);

View File

@@ -7,6 +7,7 @@ import {Tile as TileLayer, Vector as VectorLayer} from '../src/ol/layer.js';
import OSM, {ATTRIBUTION} from '../src/ol/source/OSM.js';
import VectorSource from '../src/ol/source/Vector.js';
import {Circle as CircleStyle, Fill, Stroke, Style} from '../src/ol/style.js';
import {getVectorContext} from '../src/ol/render.js';
const colors = {
@@ -73,6 +74,10 @@ vectorSource.on('addfeature', function(event) {
time.duration = time.stop - time.start;
});
const vectorLayer = new VectorLayer({
source: vectorSource,
style: styleFunction
});
const map = new Map({
layers: [
@@ -86,10 +91,7 @@ const map = new Map({
'?apikey=0e6fc415256d4fbb9b5166a718591d71'
})
}),
new VectorLayer({
source: vectorSource,
style: styleFunction
})
vectorLayer
],
target: 'map',
view: new View({
@@ -153,8 +155,8 @@ const style = new Style({
stroke: stroke
})
});
map.on('postcompose', function(evt) {
const vectorContext = evt.vectorContext;
vectorLayer.on('postrender', function(evt) {
const vectorContext = getVectorContext(evt);
vectorContext.setStyle(style);
if (point !== null) {
vectorContext.drawGeometry(point);
@@ -181,7 +183,7 @@ document.getElementById('time').addEventListener('input', function() {
const value = parseInt(this.value, 10) / 100;
const m = time.start + (time.duration * value);
vectorSource.forEachFeature(function(feature) {
const geometry = /** @type {module:ol/geom/LineString~LineString} */ (feature.getGeometry());
const geometry = /** @type {import("../src/ol/geom/LineString.js").default} */ (feature.getGeometry());
const coordinate = geometry.getCoordinateAtM(m, true);
let highlight = feature.get('highlight');
if (highlight === undefined) {

View File

@@ -3,9 +3,9 @@ layout: example.html
title: Image Filters
shortdesc: Apply a filter to imagery
docs: >
<p>Layer rendering can be manipulated in <code>precompose</code> and <code>postcompose</code> event listeners.
<p>Layer rendering can be manipulated in <code>prerender</code> and <code>postrender</code> event listeners.
These listeners get an event with a reference to the Canvas rendering context.
In this example, the <code>postcompose</code> listener applies a filter to the image data.</p>
In this example, the <code>postrender</code> listener applies a filter to the image data.</p>
tags: "filter, image manipulation"
cloak:
- key: As1HiMj1PvLPlqc_gtM7AqZfBL8ZL3VrjaS3zIb22Uvb9WKhuJObROC-qUpa81U5

View File

@@ -90,9 +90,9 @@ select.onchange = function() {
/**
* Apply a filter on "postcompose" events.
* Apply a filter on "postrender" events.
*/
imagery.on('postcompose', function(event) {
imagery.on('postrender', function(event) {
convolve(event.context, selectedKernel);
});

View File

@@ -6,7 +6,7 @@ import ImageWMS from '../src/ol/source/ImageWMS.js';
/**
* Renders a progress bar.
* @param {Element} el The target element.
* @param {HTMLElement} el The target element.
* @constructor
*/
function Progress(el) {

View File

@@ -1,9 +1,9 @@
---
layout: example.html
title: Image Vector Layer
shortdesc: Example of an image vector layer.
title: Vector Image Layer
shortdesc: Example of rendering vector data as an image layer.
docs: >
<p>This example uses <code>ol/layer/Vector</code> with `renderMode: 'image'`. This mode results in faster rendering during interaction and animations, at the cost of less accurate rendering.</p>
<p>This example uses <code>ol/layer/VectorImage</code> for faster rendering during interaction and animations, at the cost of less accurate rendering.</p>
tags: "vector, image"
---
<div id="map" class="map"></div>

View File

@@ -1,6 +1,7 @@
import Map from '../src/ol/Map.js';
import View from '../src/ol/View.js';
import GeoJSON from '../src/ol/format/GeoJSON.js';
import VectorImageLayer from '../src/ol/layer/VectorImage.js';
import VectorLayer from '../src/ol/layer/Vector.js';
import VectorSource from '../src/ol/source/Vector.js';
import {Fill, Stroke, Style, Text} from '../src/ol/style.js';
@@ -19,8 +20,8 @@ const style = new Style({
const map = new Map({
layers: [
new VectorLayer({
renderMode: 'image',
new VectorImageLayer({
imageRatio: 2,
source: new VectorSource({
url: 'data/geojson/countries.geojson',
format: new GeoJSON()

View File

@@ -1,12 +0,0 @@
---
layout: example.html
title: Layer Clipping with WebGL
shortdesc: Layer WebGL clipping example.
docs: >
This example shows how to use the <code>precompose</code> and <code>postcompose</code> rendering hooks to clip layers using WebGL.
tags: "clipping, webgl, openstreetmap"
---
<div id="map" class="map"></div>
<div id="no-webgl" class="alert alert-danger" style="display: none">
This example requires a browser that supports <a href="http://get.webgl.org/">WebGL</a>.
</div>

View File

@@ -1,101 +0,0 @@
import Map from '../src/ol/WebGLMap.js';
import View from '../src/ol/View.js';
import {WEBGL} from '../src/ol/has.js';
import TileLayer from '../src/ol/layer/Tile.js';
import OSM from '../src/ol/source/OSM.js';
if (!WEBGL) {
const info = document.getElementById('no-webgl');
/**
* display error message
*/
info.style.display = '';
} else {
const osm = new TileLayer({
source: new OSM()
});
const map = new Map({
layers: [osm],
target: 'map',
view: new View({
center: [0, 0],
zoom: 2
})
});
const fragmentShaderSource = [
'precision mediump float;',
'void main() {',
'}'
].join('');
const vertexShaderSource = [
'attribute vec2 a_position;',
'void main() {',
' gl_Position = vec4(a_position, 0, 1);',
'}'
].join('');
osm.on('precompose', function(event) {
const context = event.glContext;
const gl = context.getGL();
const program = gl.createProgram();
const vertexShader = gl.createShader(gl.VERTEX_SHADER);
gl.shaderSource(vertexShader, vertexShaderSource);
gl.compileShader(vertexShader);
gl.attachShader(program, vertexShader);
const fragmentShader = gl.createShader(gl.FRAGMENT_SHADER);
gl.shaderSource(fragmentShader, fragmentShaderSource);
gl.compileShader(fragmentShader);
gl.attachShader(program, fragmentShader);
gl.linkProgram(program);
context.useProgram(program);
const positionLocation = gl.getAttribLocation(program, 'a_position');
gl.enable(gl.STENCIL_TEST);
gl.colorMask(false, false, false, false);
gl.stencilOp(gl.KEEP, gl.KEEP, gl.REPLACE);
gl.stencilFunc(gl.ALWAYS, 1, 0xff);
const buffer = gl.createBuffer();
gl.bindBuffer(gl.ARRAY_BUFFER, buffer);
gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([
// first band
-1.0, -1.0, -0.75, -1.0, -1.0, 1.0,
-1.0, 1.0, -0.75, -1.0, -0.75, 1.0,
// second band
-0.5, -1.0, -0.25, -1.0, -0.5, 1.0,
-0.5, 1.0, -0.25, -1.0, -0.25, 1.0,
// third band
0.0, -1.0, 0.25, -1.0, 0.0, 1.0,
0.0, 1.0, 0.25, -1.0, 0.25, 1.0,
// forth band
0.5, -1.0, 0.75, -1.0, 0.5, 1.0,
0.5, 1.0, 0.75, -1.0, 0.75, 1.0
]), gl.STATIC_DRAW);
gl.enableVertexAttribArray(positionLocation);
gl.vertexAttribPointer(positionLocation, 2, gl.FLOAT, false, 0, 0);
gl.drawArrays(gl.TRIANGLES, 0, 24);
gl.bindBuffer(gl.ARRAY_BUFFER, null);
gl.deleteBuffer(buffer);
gl.colorMask(true, true, true, true);
gl.stencilFunc(gl.NOTEQUAL, 0, 0xff);
gl.stencilOp(gl.KEEP, gl.KEEP, gl.KEEP);
});
osm.on('postcompose', function(event) {
const context = event.glContext;
const gl = context.getGL();
gl.disable(gl.STENCIL_TEST);
});
}

View File

@@ -16,7 +16,7 @@ const map = new Map({
})
});
osm.on('precompose', function(event) {
osm.on('prerender', function(event) {
const ctx = event.context;
ctx.save();
const pixelRatio = event.frameState.pixelRatio;
@@ -38,7 +38,7 @@ osm.on('precompose', function(event) {
ctx.translate(-size[0] / 2 * pixelRatio, -size[1] / 2 * pixelRatio);
});
osm.on('postcompose', function(event) {
osm.on('postrender', function(event) {
const ctx = event.context;
ctx.restore();
});

View File

@@ -3,9 +3,9 @@ layout: example.html
title: Layer Spy
shortdesc: View a portion of one layer over another
docs: >
<p>Layer rendering can be manipulated in <code>precompose</code> and <code>postcompose</code> event listeners.
<p>Layer rendering can be manipulated in <code>prerender</code> and <code>postrender</code> event listeners.
These listeners get an event with a reference to the Canvas rendering context.
In this example, the <code>precompose</code> listener sets a clipping mask around the most
In this example, the <code>prerender</code> listener sets a clipping mask around the most
recent mouse position, giving you a spyglass effect for viewing one layer over another.</p>
<p>Move around the map to see the effect. Use the ↑ up and ↓ down arrow keys to adjust the spyglass size.</p>
tags: "spy, image manipulation"

View File

@@ -52,7 +52,7 @@ container.addEventListener('mouseout', function() {
});
// before rendering the layer, do some clipping
imagery.on('precompose', function(event) {
imagery.on('prerender', function(event) {
const ctx = event.context;
const pixelRatio = event.frameState.pixelRatio;
ctx.save();
@@ -69,7 +69,7 @@ imagery.on('precompose', function(event) {
});
// after rendering the layer, restore the canvas context
imagery.on('postcompose', function(event) {
imagery.on('postrender', function(event) {
const ctx = event.context;
ctx.restore();
});

View File

@@ -25,7 +25,7 @@ const map = new Map({
const swipe = document.getElementById('swipe');
bing.on('precompose', function(event) {
bing.on('prerender', function(event) {
const ctx = event.context;
const width = ctx.canvas.width * (swipe.value / 100);
@@ -35,7 +35,7 @@ bing.on('precompose', function(event) {
ctx.clip();
});
bing.on('postcompose', function(event) {
bing.on('postrender', function(event) {
const ctx = event.context;
ctx.restore();
});

View File

@@ -3,7 +3,7 @@ layout: example.html
title: Magnify
shortdesc: Show a magnified version of imager under the pointer
docs: >
<p>This example makes use of the <code>postcompose</code> event listener to
<p>This example makes use of the <code>postrender</code> event listener to
oversample imagery in a circle around the pointer location. Listeners for this event have access to the Canvas context and can manipulate image data.</p>
<p>Move around the map to see the effect. Use the ↑ up and ↓ down arrow keys to adjust the magnified circle size.</p>
tags: "magnify, image manipulation"

View File

@@ -3,6 +3,7 @@ import View from '../src/ol/View.js';
import TileLayer from '../src/ol/layer/Tile.js';
import {fromLonLat} from '../src/ol/proj.js';
import BingMaps from '../src/ol/source/BingMaps.js';
import {getRenderPixel} from '../src/ol/render.js';
const key = 'As1HiMj1PvLPlqc_gtM7AqZfBL8ZL3VrjaS3zIb22Uvb9WKhuJObROC-qUpa81U5';
@@ -48,16 +49,17 @@ container.addEventListener('mouseout', function() {
});
// after rendering the layer, show an oversampled version around the pointer
imagery.on('postcompose', function(event) {
imagery.on('postrender', function(event) {
if (mousePosition) {
const pixel = getRenderPixel(event, mousePosition);
const offset = getRenderPixel(event, [mousePosition[0] + radius, mousePosition[1]]);
const half = Math.sqrt(Math.pow(offset[0] - pixel[0], 2) + Math.pow(offset[1] - pixel[1], 2));
const context = event.context;
const pixelRatio = event.frameState.pixelRatio;
const half = radius * pixelRatio;
const centerX = mousePosition[0] * pixelRatio;
const centerY = mousePosition[1] * pixelRatio;
const centerX = pixel[0];
const centerY = pixel[1];
const originX = centerX - half;
const originY = centerY - half;
const size = 2 * half + 1;
const size = Math.round(2 * half + 1);
const sourceData = context.getImageData(originX, originY, size, size).data;
const dest = context.createImageData(size, size);
const destData = dest.data;
@@ -82,7 +84,7 @@ imagery.on('postcompose', function(event) {
}
context.beginPath();
context.arc(centerX, centerY, half, 0, 2 * Math.PI);
context.lineWidth = 3 * pixelRatio;
context.lineWidth = 3 * half / radius;
context.strokeStyle = 'rgba(255,255,255,0.5)';
context.putImageData(dest, originX, originY);
context.stroke();

View File

@@ -0,0 +1,14 @@
---
layout: example.html
title: Mapbox-gl Layer
shortdesc: Example of a Mapbox-gl-js layer integration.
docs: >
Show how to add a mapbox-gl-js layer in an openlayers map. **Note**: Make sure to get your own Mapbox API key when using this example. No map will be visible when the API key has expired.
tags: "simple, mapbox, vector, tiles"
resources:
- https://unpkg.com/mapbox-gl@0.51.0/dist/mapbox-gl.js
cloak:
- key: ER67WIiPdCQvhgsUjoWK
value: Your Mapbox access token from http://mapbox.com/ here
---
<div id="map" class="map"></div>

218
examples/mapbox-layer.js Normal file
View File

@@ -0,0 +1,218 @@
import Map from '../src/ol/Map.js';
import View from '../src/ol/View.js';
import Layer from '../src/ol/layer/Layer';
import {assign} from '../src/ol/obj';
import {getTransform} from '../src/ol/proj';
import SourceState from '../src/ol/source/State';
import {Stroke, Style} from '../src/ol/style.js';
import VectorLayer from '../src/ol/layer/Vector.js';
import VectorSource from '../src/ol/source/Vector.js';
import GeoJSON from '../src/ol/format/GeoJSON.js';
class Mapbox extends Layer {
/**
* @param {import('./Base.js').Options} options Layer options.
*/
constructor(options) {
const baseOptions = assign({}, options);
super(baseOptions);
this.baseOptions = baseOptions;
/**
* @private
* @type boolean
*/
this.loaded = false;
this.initMap();
}
initMap() {
const map = this.map_;
const view = map.getView();
const transformToLatLng = getTransform(view.getProjection(), 'EPSG:4326');
const center = transformToLatLng(view.getCenter());
this.centerLastRender = view.getCenter();
this.zoomLastRender = view.getZoom();
this.centerLastRender = view.getCenter();
this.zoomLastRender = view.getZoom();
const options = assign(this.baseOptions, {
attributionControl: false,
boxZoom: false,
center,
container: map.getTargetElement(),
doubleClickZoom: false,
dragPan: false,
dragRotate: false,
interactive: false,
keyboard: false,
pitchWithRotate: false,
scrollZoom: false,
touchZoomRotate: false,
zoom: view.getZoom() - 1
});
this.mbmap = new mapboxgl.Map(options);
this.mbmap.on('load', function() {
this.mbmap.getCanvas().remove();
this.loaded = true;
this.map_.render();
[
'mapboxgl-control-container'
].forEach(className => document.getElementsByClassName(className)[0].remove());
}.bind(this));
this.mbmap.on('render', function() {
// Reset offset
if (this.centerNextRender) {
this.centerLastRender = this.centerNextRender;
}
if (this.zoomNextRender) {
this.zoomLastRender = this.zoomNextRender;
}
this.updateRenderedPosition([0, 0], 1);
}.bind(this));
}
/**
*
* @inheritDoc
*/
render(frameState) {
const map = this.map_;
const view = map.getView();
const transformToLatLng = getTransform(view.getProjection(), 'EPSG:4326');
this.centerNextRender = view.getCenter();
const lastRender = map.getPixelFromCoordinate(this.centerLastRender);
const nextRender = map.getPixelFromCoordinate(this.centerNextRender);
const centerOffset = [lastRender[0] - nextRender[0], lastRender[1] - nextRender[1]];
this.zoomNextRender = view.getZoom();
const zoomOffset = Math.pow(2, this.zoomNextRender - this.zoomLastRender);
this.updateRenderedPosition(centerOffset, zoomOffset);
const rotation = frameState.viewState.rotation;
if (rotation) {
this.mbmap.rotateTo(-rotation * 180 / Math.PI, {
animate: false
});
}
// Re-render mbmap
const center = transformToLatLng(this.centerNextRender);
const zoom = view.getZoom() - 1;
this.mbmap.jumpTo({
center: center,
zoom: zoom
});
return this.mbmap.getCanvas();
}
updateRenderedPosition(centerOffset, zoomOffset) {
const style = this.mbmap.getCanvas().style;
style.left = Math.round(centerOffset[0]) + 'px';
style.top = Math.round(centerOffset[1]) + 'px';
style.transform = 'scale(' + zoomOffset + ')';
}
setVisible(visible) {
super.setVisible(visible);
const canvas = this.mbmap.getCanvas();
canvas.style.display = visible ? 'block' : 'none';
}
setOpacity(opacity) {
super.setOpacity(opacity);
const canvas = this.mbmap.getCanvas();
canvas.style.opacity = opacity;
}
setZIndex(zindex) {
super.setZIndex(zindex);
const canvas = this.mbmap.getCanvas();
canvas.style.zIndex = zindex;
}
/**
* @inheritDoc
*/
getSourceState() {
return this.loaded ? SourceState.READY : SourceState.UNDEFINED;
}
setMap(map) {
this.map_ = map;
}
}
mapboxgl.Map.prototype._setupContainer = function _setupContainer() {
const container = this._container;
container.classList.add('mapboxgl-map');
const canvasContainer = this._canvasContainer = container.firstChild;
this._canvas = document.createElement('canvas');
canvasContainer.insertBefore(this._canvas, canvasContainer.firstChild);
this._canvas.style.position = 'absolute';
this._canvas.addEventListener('webglcontextlost', this._contextLost, false);
this._canvas.addEventListener('webglcontextrestored', this._contextRestored, false);
this._canvas.setAttribute('tabindex', '0');
this._canvas.setAttribute('aria-label', 'Map');
this._canvas.className = 'mapboxgl-canvas';
const dimensions = this._containerDimensions();
this._resizeCanvas(dimensions[0], dimensions[1]);
this._controlContainer = canvasContainer;
const controlContainer = this._controlContainer = document.createElement('div');
controlContainer.className = 'mapboxgl-control-container';
container.appendChild(controlContainer);
const positions = this._controlPositions = {};
['top-left', 'top-right', 'bottom-left', 'bottom-right'].forEach(function(positionName) {
const elem = document.createElement('div');
elem.className = 'mapboxgl-ctrl-' + positionName;
controlContainer.appendChild(elem);
positions[positionName] = elem;
});
};
const style = new Style({
stroke: new Stroke({
color: '#319FD3',
width: 2
})
});
const vectorLayer = new VectorLayer({
source: new VectorSource({
url: 'data/geojson/countries.geojson',
format: new GeoJSON()
}),
style: style
});
const map = new Map({
target: 'map',
view: new View({
center: [-10997148, 4569099],
zoom: 4
})
});
const key = 'ER67WIiPdCQvhgsUjoWK';
const mbLayer = new Mapbox({
map: map,
container: map.getTarget(),
style: 'https://maps.tilehosting.com/styles/bright/style.json?key=' + key
});
map.addLayer(mbLayer);
map.addLayer(vectorLayer);

View File

@@ -0,0 +1,32 @@
---
layout: example-verbatim.html
title: Vector tiles created from a Mapbox Style object
shortdesc: Example of using ol-mapbox-style with tiles from tilehosting.com.
tags: "vector tiles, mapbox style, ol-mapbox-style"
cloak:
- key: lirfd6Fegsjkvs0lshxe
value: Your API key from http://tilehosting.com/ here
---
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="chrome=1">
<meta name="viewport" content="initial-scale=1.0, user-scalable=no, width=device-width">
<title>Mapbox Style objects with ol-mapbox-style</title>
<link rel="stylesheet" href="../css/ol.css" type="text/css">
<style type="text/css">
html, body, .map {
margin: 0;
padding: 0;
width: 100%;
height: 100%;
}
</style>
</head>
<body>
<div id="map" class="map"></div>
<script src="common.js"></script>
<script src="mapbox-style.js"></script>
</body>
</html>

3
examples/mapbox-style.js Normal file
View File

@@ -0,0 +1,3 @@
import apply from 'ol-mapbox-style';
apply('map', 'https://maps.tilehosting.com/styles/topo/style.json?key=ER67WIiPdCQvhgsUjoWK');

View File

@@ -21,7 +21,7 @@ function tileUrlFunction(tileCoord) {
'{z}/{x}/{y}.vector.pbf?access_token=' + key)
.replace('{z}', String(tileCoord[0] * 2 - 1))
.replace('{x}', String(tileCoord[1]))
.replace('{y}', String(-tileCoord[2] - 1))
.replace('{y}', String(tileCoord[2]))
.replace('{a-d}', 'abcd'.substr(
((tileCoord[1] << tileCoord[0]) + tileCoord[2]) % 4, 1));
}

View File

@@ -38,35 +38,35 @@ const vector = new VectorLayer({
/**
* Currently drawn feature.
* @type {module:ol/Feature~Feature}
* @type {import("../src/ol/Feature.js").default}
*/
let sketch;
/**
* The help tooltip element.
* @type {Element}
* @type {HTMLElement}
*/
let helpTooltipElement;
/**
* Overlay to show the help messages.
* @type {module:ol/Overlay}
* @type {Overlay}
*/
let helpTooltip;
/**
* The measure tooltip element.
* @type {Element}
* @type {HTMLElement}
*/
let measureTooltipElement;
/**
* Overlay to show the measurement.
* @type {module:ol/Overlay}
* @type {Overlay}
*/
let measureTooltip;
@@ -87,7 +87,7 @@ const continueLineMsg = 'Click to continue drawing the line';
/**
* Handle pointer move.
* @param {module:ol/MapBrowserEvent~MapBrowserEvent} evt The event.
* @param {import("../src/ol/MapBrowserEvent").default} evt The event.
*/
const pointerMoveHandler = function(evt) {
if (evt.dragging) {
@@ -97,7 +97,7 @@ const pointerMoveHandler = function(evt) {
let helpMsg = 'Click to start drawing';
if (sketch) {
const geom = (sketch.getGeometry());
const geom = sketch.getGeometry();
if (geom instanceof Polygon) {
helpMsg = continuePolygonMsg;
} else if (geom instanceof LineString) {
@@ -134,7 +134,7 @@ let draw; // global so we can remove it later
/**
* Format length output.
* @param {module:ol/geom/LineString~LineString} line The line.
* @param {LineString} line The line.
* @return {string} The formatted length.
*/
const formatLength = function(line) {
@@ -153,7 +153,7 @@ const formatLength = function(line) {
/**
* Format area output.
* @param {module:ol/geom/Polygon~Polygon} polygon The polygon.
* @param {Polygon} polygon The polygon.
* @return {string} Formatted area.
*/
const formatArea = function(polygon) {
@@ -205,7 +205,7 @@ function addInteraction() {
// set sketch
sketch = evt.feature;
/** @type {module:ol/coordinate~Coordinate|undefined} */
/** @type {import("../src/ol/coordinate.js").Coordinate|undefined} */
let tooltipCoord = evt.coordinate;
listener = sketch.getGeometry().on('change', function(evt) {
@@ -221,7 +221,7 @@ function addInteraction() {
measureTooltipElement.innerHTML = output;
measureTooltip.setPosition(tooltipCoord);
});
}, this);
});
draw.on('drawend',
function() {
@@ -233,7 +233,7 @@ function addInteraction() {
measureTooltipElement = null;
createMeasureTooltip();
unByKey(listener);
}, this);
});
}

View File

@@ -3,7 +3,8 @@ layout: example.html
title: Overview Map Control
shortdesc: Example of OverviewMap control.
docs: >
This example demonstrates the use of the OverviewMap control.
This example demonstrates the use of the OverviewMap control. Both the main map and the overview map are configured with layers using the same source.
Please note that explicitly configuring layers for the overview map is mandatory.
tags: "overview, overviewmap"
---
<div id="map" class="map"></div>

View File

@@ -4,13 +4,22 @@ import {defaults as defaultControls, OverviewMap} from '../src/ol/control.js';
import TileLayer from '../src/ol/layer/Tile.js';
import OSM from '../src/ol/source/OSM.js';
const source = new OSM();
const overviewMapControl = new OverviewMap({
layers: [
new TileLayer({
source: source
})
]
});
const map = new Map({
controls: defaultControls().extend([
new OverviewMap()
overviewMapControl
]),
layers: [
new TileLayer({
source: new OSM()
source: source
})
],
target: 'map',

View File

@@ -109,7 +109,7 @@ fetch(url).then(function(response) {
options.projection = 'EPSG:3413';
options.wrapX = false;
layers['wmts3413'] = new TileLayer({
source: new WMTS(/** @type {!module:ol/source/WMTS~Options} */ (options))
source: new WMTS(options)
});
});

View File

@@ -1,42 +1,46 @@
(function() {
var clipboard = new Clipboard('#copy-button');
clipboard.on('success', function(e) {
function compress(json) {
return LZString.compressToBase64(JSON.stringify(json))
.replace(/\+/g, `-`)
.replace(/\//g, `_`)
.replace(/=+$/, ``);
}
var htmlClipboard = new Clipboard('#copy-html-button');
htmlClipboard.on('success', function(e) {
e.clearSelection();
});
var jsClipboard = new Clipboard('#copy-js-button');
jsClipboard.on('success', function(e) {
e.clearSelection();
});
var pkgClipboard = new Clipboard('#copy-pkg-button');
pkgClipboard.on('success', function(e) {
e.clearSelection();
});
var codepenButton = document.getElementById('codepen-button');
var codepenButton = document.getElementsByClassName('codepen-button')[0];
if (codepenButton) {
codepenButton.onclick = function(event) {
event.preventDefault();
var form = document.getElementById('codepen-form');
// Doc : https://blog.codepen.io/documentation/api/prefill/
var resources = form.resources.value.split(',');
var data = {
title: form.title.value,
description: form.description.value,
layout: 'left',
html: form.html.value,
css: form.css.value,
js: form.js.value,
css_external: resources.filter(function(resource) {
return resource.lastIndexOf('.css') === resource.length - 4;
}).join(';'),
js_external: resources.filter(function(resource) {
return resource.lastIndexOf('.js') === resource.length - 3;
}).join(';')
};
// binary flags to display html, css, js and/or console tabs
data.editors = '' + Number(data.html.length > 0) +
Number(data.css.length > 0) +
Number(data.js.length > 0) +
Number(data.js.indexOf('console') > 0);
form.data.value = JSON.stringify(data);
const html = document.getElementById('example-html-source').innerText;
const js = document.getElementById('example-js-source').innerText;
const pkgJson = document.getElementById('example-pkg-source').innerText;
form.parameters.value = compress({
files: {
'index.html': {
content: html
},
'index.js': {
content: js
},
"package.json": {
content: pkgJson
}
}
});
form.submit();
};
}

View File

@@ -91,22 +91,27 @@ pre[class*="language-"] {
background: #FFFFFF;
}
#source-controls {
pre>legend {
font-size: 100%;
font-weight: bold;
}
.source-controls {
position: absolute;
margin-top: 20px;
margin-top: 10px;
right: 40px;
}
#source-controls a {
.source-controls a {
margin-left: 15px;
}
#copy-button {
.copy-button {
text-decoration: none;
cursor: pointer;
}
#codepen-button {
.codepen-button {
text-decoration: none;
cursor: pointer;
}

View File

@@ -14,3 +14,19 @@ tags: "scale-line, openstreetmap"
<option value="nautical">nautical mile</option>
<option value="metric" selected>metric</option>
</select>
<select id="type">
<option value="scaleline">ScaleLine</option>
<option value="scalebar">ScaleBar</option>
</select>
<select id="steps" style="display:none">
<option value=2>2 steps</option>
<option value=4 selected>4 steps</option>
<option value=6>6 steps</option>
<option value=8>8 steps</option>
</select>
<div id="showScaleTextDiv" style="display:none">
<input type="checkbox" id="showScaleText" checked>Show scale text
</div>

View File

@@ -4,12 +4,36 @@ import {defaults as defaultControls, ScaleLine} from '../src/ol/control.js';
import TileLayer from '../src/ol/layer/Tile.js';
import OSM from '../src/ol/source/OSM.js';
const unitsSelect = document.getElementById('units');
const typeSelect = document.getElementById('type');
const stepsSelect = document.getElementById('steps');
const scaleTextCheckbox = document.getElementById('showScaleText');
const showScaleTextDiv = document.getElementById('showScaleTextDiv');
const scaleLineControl = new ScaleLine();
let scaleType = 'scaleline';
let scaleBarSteps = 4;
let scaleBarText = true;
let control;
function scaleControl() {
if (scaleType === 'scaleline') {
control = new ScaleLine({
units: unitsSelect.value
});
return control;
}
control = new ScaleLine({
units: unitsSelect.value,
bar: true,
steps: scaleBarSteps,
text: scaleBarText,
minWidth: 140
});
return control;
}
const map = new Map({
controls: defaultControls().extend([
scaleLineControl
scaleControl()
]),
layers: [
new TileLayer({
@@ -23,10 +47,34 @@ const map = new Map({
})
});
const unitsSelect = document.getElementById('units');
function onChange() {
scaleLineControl.setUnits(unitsSelect.value);
control.setUnits(unitsSelect.value);
}
function onChangeType() {
scaleType = typeSelect.value;
if (typeSelect.value === 'scalebar') {
stepsSelect.style.display = 'inline';
showScaleTextDiv.style.display = 'inline';
map.removeControl(control);
map.addControl(scaleControl());
} else {
stepsSelect.style.display = 'none';
showScaleTextDiv.style.display = 'none';
map.removeControl(control);
map.addControl(scaleControl());
}
}
function onChangeSteps() {
scaleBarSteps = parseInt(stepsSelect.value, 10);
map.removeControl(control);
map.addControl(scaleControl());
}
function onChangeScaleText() {
scaleBarText = scaleTextCheckbox.checked;
map.removeControl(control);
map.addControl(scaleControl());
}
unitsSelect.addEventListener('change', onChange);
onChange();
typeSelect.addEventListener('change', onChangeType);
stepsSelect.addEventListener('change', onChangeSteps);
scaleTextCheckbox.addEventListener('change', onChangeScaleText);

View File

@@ -2,7 +2,7 @@ import Map from '../src/ol/Map.js';
import View from '../src/ol/View.js';
import {Image as ImageLayer, Tile as TileLayer} from '../src/ol/layer.js';
import {fromLonLat} from '../src/ol/proj.js';
import RasterSource from '../src/ol/source/Raster.js';
import {Raster as RasterSource, TileJSON} from '../src/ol/source.js';
import XYZ from '../src/ol/source/XYZ.js';
function flood(pixels, data) {
@@ -37,8 +37,9 @@ const map = new Map({
target: 'map',
layers: [
new TileLayer({
source: new XYZ({
url: 'https://api.mapbox.com/styles/v1/tschaub/ciutc102t00c62js5fqd47kqw/tiles/256/{z}/{x}/{y}?access_token=' + key
source: new TileJSON({
url: 'https://api.tiles.mapbox.com/v3/mapbox.world-light.json?secure',
crossOrigin: 'anonymous'
})
}),
new ImageLayer({

View File

@@ -0,0 +1,3 @@
.bw {
filter: grayscale(100%);
}

View File

@@ -3,7 +3,7 @@ layout: example.html
title: Semi-Transparent Layer
shortdesc: Example of a map with a semi-transparent layer.
docs: >
This example will display a tiled MaxBox layer semi-transparently over an OSM background.
This example will display a tiled MaxBox layer semi-transparently over an OSM background. The OSM layer is changed to back and white by using a CSS filter.
tags: "transparent, osm, tilejson"
---
<div id="map" class="map"></div>

View File

@@ -9,6 +9,7 @@ import TileJSON from '../src/ol/source/TileJSON.js';
const map = new Map({
layers: [
new TileLayer({
className: 'bw',
source: new OSM()
}),
new TileLayer({

View File

@@ -1,7 +0,0 @@
@media (min-width: 800px) {
.half {
padding: 0 10px;
width: 50%;
float: left;
}
}

View File

@@ -1,16 +0,0 @@
---
layout: example.html
title: Shared Views
shortdesc: Two maps with different renderers share view properties
docs: >
Two maps (one with the Canvas renderer, one with the WebGL renderer) share the same center, resolution, rotation and layers.
tags: "side-by-side, canvas, webgl"
---
<div class="half">
<h4>Canvas</h4>
<div id="canvasMap" class="map"></div>
</div>
<div class="half">
<h4>WebGL</h4>
<div id="webglMap" class="map"></div>
</div>

View File

@@ -1,26 +0,0 @@
import Map from '../src/ol/Map.js';
import WebGLMap from '../src/ol/WebGLMap.js';
import View from '../src/ol/View.js';
import TileLayer from '../src/ol/layer/Tile.js';
import OSM from '../src/ol/source/OSM.js';
const layer = new TileLayer({
source: new OSM()
});
const view = new View({
center: [0, 0],
zoom: 1
});
const map1 = new Map({
target: 'canvasMap',
layers: [layer],
view: view
});
const map2 = new WebGLMap({
target: 'webglMap',
layers: [layer],
view: view
});

View File

@@ -1,9 +1,9 @@
---
layout: example.html
title: Sphere Mollweide
shortdesc: Example of a Sphere Mollweide map with a Graticule component.
shortdesc: Example of a Sphere Mollweide map with a Graticule layer.
docs: >
Example of a Sphere Mollweide map with a Graticule component.
Example of a Sphere Mollweide map with a Graticule layer.
tags: "graticule, Mollweide, projection, proj4js"
---
<div id="map" class="map"></div>

View File

@@ -1,4 +1,4 @@
import Graticule from '../src/ol/Graticule.js';
import Graticule from '../src/ol/layer/Graticule.js';
import Map from '../src/ol/Map.js';
import View from '../src/ol/View.js';
import GeoJSON from '../src/ol/format/GeoJSON.js';
@@ -30,17 +30,13 @@ const map = new Map({
url: 'data/geojson/countries-110m.geojson',
format: new GeoJSON()
})
})
}),
new Graticule()
],
target: 'map',
view: new View({
center: [0, 0],
projection: sphereMollweideProjection,
resolutions: [65536, 32768, 16384, 8192, 4096, 2048],
zoom: 0
})
});
new Graticule({
map: map
});

View File

@@ -1,14 +0,0 @@
---
layout: example.html
title: Symbols with WebGL
shortdesc: Using symbols in an atlas with WebGL.
docs: >
<p>When using symbol styles with WebGL, OpenLayers would render the symbol
on a temporary image and would create a WebGL texture for each image. For a
better performance, it is recommended to use atlas images (similar to
image sprites with CSS), so that the number of textures is reduced. OpenLayers
provides an <code>AtlasManager</code>, which when passed to the constructor
of a symbol style, will create atlases for the symbols.</p>
tags: "webgl, symbol, atlas, vector, point"
---
<div id="map" class="map"></div>

View File

@@ -1,111 +0,0 @@
import Feature from '../src/ol/Feature.js';
import Map from '../src/ol/WebGLMap.js';
import View from '../src/ol/View.js';
import Point from '../src/ol/geom/Point.js';
import VectorLayer from '../src/ol/layer/Vector.js';
import VectorSource from '../src/ol/source/Vector.js';
import {AtlasManager, Circle as CircleStyle, Fill, RegularShape, Stroke, Style} from '../src/ol/style.js';
const atlasManager = new AtlasManager({
// we increase the initial size so that all symbols fit into
// a single atlas image
initialSize: 512
});
const symbolInfo = [{
opacity: 1.0,
scale: 1.0,
fillColor: 'rgba(255, 153, 0, 0.4)',
strokeColor: 'rgba(255, 204, 0, 0.2)'
}, {
opacity: 0.75,
scale: 1.25,
fillColor: 'rgba(70, 80, 224, 0.4)',
strokeColor: 'rgba(12, 21, 138, 0.2)'
}, {
opacity: 0.5,
scale: 1.5,
fillColor: 'rgba(66, 150, 79, 0.4)',
strokeColor: 'rgba(20, 99, 32, 0.2)'
}, {
opacity: 1.0,
scale: 1.0,
fillColor: 'rgba(176, 61, 35, 0.4)',
strokeColor: 'rgba(145, 43, 20, 0.2)'
}];
const radiuses = [3, 6, 9, 15, 19, 25];
const symbolCount = symbolInfo.length * radiuses.length * 2;
const symbols = [];
let i, j;
for (i = 0; i < symbolInfo.length; ++i) {
const info = symbolInfo[i];
for (j = 0; j < radiuses.length; ++j) {
// circle symbol
symbols.push(new CircleStyle({
opacity: info.opacity,
scale: info.scale,
radius: radiuses[j],
fill: new Fill({
color: info.fillColor
}),
stroke: new Stroke({
color: info.strokeColor,
width: 1
}),
// by passing the atlas manager to the symbol,
// the symbol will be added to an atlas
atlasManager: atlasManager
}));
// star symbol
symbols.push(new RegularShape({
points: 8,
opacity: info.opacity,
scale: info.scale,
radius: radiuses[j],
radius2: radiuses[j] * 0.7,
angle: 1.4,
fill: new Fill({
color: info.fillColor
}),
stroke: new Stroke({
color: info.strokeColor,
width: 1
}),
atlasManager: atlasManager
}));
}
}
const featureCount = 50000;
const features = new Array(featureCount);
let feature, geometry;
const e = 25000000;
for (i = 0; i < featureCount; ++i) {
geometry = new Point(
[2 * e * Math.random() - e, 2 * e * Math.random() - e]);
feature = new Feature(geometry);
feature.setStyle(
new Style({
image: symbols[i % symbolCount]
})
);
features[i] = feature;
}
const vectorSource = new VectorSource({
features: features
});
const vector = new VectorLayer({
source: vectorSource
});
const map = new Map({
layers: [vector],
target: document.getElementById('map'),
view: new View({
center: [0, 0],
zoom: 4
})
});

View File

@@ -5,6 +5,7 @@ import {LineString, Point} from '../src/ol/geom.js';
import VectorLayer from '../src/ol/layer/Vector.js';
import VectorSource from '../src/ol/source/Vector.js';
import {Circle as CircleStyle, Fill, Stroke, Style} from '../src/ol/style.js';
import {getVectorContext} from '../src/ol/render.js';
const count = 20000;
@@ -104,8 +105,8 @@ const style = new Style({
})
});
map.on('postcompose', function(evt) {
const vectorContext = evt.vectorContext;
vector.on('postrender', function(evt) {
const vectorContext = getVectorContext(evt);
vectorContext.setStyle(style);
if (point !== null) {
vectorContext.drawGeometry(point);

View File

@@ -1,12 +1,63 @@
<!DOCTYPE html>
<html lang="en-US">
<head>
<script>
var gaProperty = 'UA-2577926-1';
// Disable tracking if the opt-out cookie exists.
var disableStr = 'ga-disable-' + gaProperty;
if (document.cookie.indexOf(disableStr + '=true') > -1) {
window[disableStr] = true;
}
function gaOptout() {
document.cookie = disableStr + '=true; expires=Thu, 31 Dec 2099 23:59:59 UTC; path=/';
window[disableStr] = true;
}
function gaOptoutRevoke() {
document.cookie = disableStr + '=false; expires=Thu, 31 Dec 2099 23:59:59 UTC; path=/';
window[disableStr] = false;
}
</script>
<!-- Global site tag (gtag.js) - Google Analytics -->
<script async src="https://www.googletagmanager.com/gtag/js?id=UA-2577926-1"></script>
<script>
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('js', new Date());
gtag('config', 'UA-2577926-1');
gtag('config', 'UA-2577926-1', { 'anonymize_ip': true });
</script>
<link rel="stylesheet" type="text/css" href="//cdnjs.cloudflare.com/ajax/libs/cookieconsent2/3.1.0/cookieconsent.min.css" />
<script src="//cdnjs.cloudflare.com/ajax/libs/cookieconsent2/3.1.0/cookieconsent.min.js"></script>
<script src="https://unpkg.com/lz-string@1.4.4/libs/lz-string.min.js"></script>
<script>
window.addEventListener("load", function() {
window.cookieconsent.initialise({
'palette': {
'popup': {
'background': '#eaf7f7',
'text': '#5c7291'
},
'button': {
'background': '#56cbdb',
'text': '#ffffff'
}
},
'theme': 'edgeless',
'type': 'opt-out',
'onInitialise': function (status) {
if (!this.hasConsented()) {
gaOptout()
}
},
'onStatusChange': function(status, chosenBefore) {
if (!this.hasConsented()) {
gaOptout()
}
},
'onRevokeChoice': function() {
gaOptoutRevoke()
}
})
});
</script>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=Edge">
@@ -49,10 +100,14 @@
</div>
<div class="row-fluid">
<a class="codepen-button pull-right"><i class="fa fa-codepen"></i> Edit</a>
<div class="span12">
<h4 id="title">{{ title }}</h4>
{{{ contents }}}
</div>
<form method="POST" id="codepen-form" target="_blank" action="https://codesandbox.io/api/v1/sandboxes/define">
<input id="codesandbox-params" type="hidden" name="parameters">
</form>
</div>
<div class="row-fluid">
@@ -63,36 +118,37 @@
</div>
<div class="row-fluid">
<div id="source-controls">
<a id="copy-button" data-clipboard-target="#example-source"><i class="fa fa-clipboard"></i> Copy</a>
<!-- <a id="codepen-button"><i class="fa fa-codepen"></i> Edit</a> -->
<div class="source-controls">
<a class="copy-button" id="copy-html-button" data-clipboard-target="#example-html-source"><i class="fa fa-clipboard"></i> Copy</a>
</div>
<form method="POST" id="codepen-form" target="_blank" action="https://codepen.io/pen/define/">
<textarea class="hidden" name="title">{{ title }}</textarea>
<textarea class="hidden" name="description">{{ shortdesc }}</textarea>
<textarea class="hidden" name="js">{{ js.source }}</textarea>
<textarea class="hidden" name="css">{{ css.source }}</textarea>
<textarea class="hidden" name="html">{{ contents }}</textarea>
<input type="hidden" name="data">
</form>
<pre><code id="example-source" class="language-markup">&lt;!DOCTYPE html&gt;
<pre><legend>index.html</legend><code id="example-html-source" class="language-markup">&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
&lt;title&gt;{{ title }}&lt;/title&gt;
&lt;link rel="stylesheet" href="https://openlayers.org/en/v{{ olVersion }}/css/ol.css" type="text/css"&gt;
&lt;!-- The line below is only needed for old environments like Internet Explorer and Android 4.x --&gt;
&lt;script src="https://cdn.polyfill.io/v2/polyfill.min.js?features=requestAnimationFrame,Element.prototype.classList,URL"&gt;&lt;/script&gt;
{{#if extraHead.remote}}
&lt;script src="https://cdn.polyfill.io/v2/polyfill.min.js?features=requestAnimationFrame,Element.prototype.classList,URL"&gt;&lt;/script&gt;{{#if extraHead.remote}}
{{ indent extraHead.remote spaces=4 }}{{/if}}{{#if css.source}}
&lt;style&gt;
{{ indent css.source spaces=6 }} &lt;/style&gt;{{/if}}
&lt;/head&gt;
&lt;body&gt;
{{ indent contents spaces=4 }} &lt;script&gt;
{{ indent js.source spaces=6 }} &lt;/script&gt;
{{ indent contents spaces=4 }} &lt;script src="index.js"&gt;&lt;/script&gt;
&lt;/body&gt;
&lt;/html&gt;</code></pre>
</div>
<div class="row-fluid">
<div class="source-controls">
<a class="copy-button" id="copy-js-button" data-clipboard-target="#example-js-source"><i class="fa fa-clipboard"></i> Copy</a>
</div>
<pre><legend>index.js</legend><code id="example-js-source" class="language-js">import 'ol/ol.css';
{{ js.source }}</code></pre>
</div>
<div class="row-fluid">
<div class="source-controls">
<a class="copy-button" id="copy-pkg-button" data-clipboard-target="#example-pkg-source"><i class="fa fa-clipboard"></i> Copy</a>
</div>
<pre><legend>package.json</legend><code id="example-pkg-source" class="language-js">{{ pkgJson }}</code></pre>
</div>
</div>
<script src="./resources/common.js"></script>

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