Compare commits
1640 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
d77ff64ec2 | ||
|
|
ee27cf1e01 | ||
|
|
54c438997f | ||
|
|
a7d180047a | ||
|
|
a224e51c3f | ||
|
|
0482b7ced4 | ||
|
|
ff729d1357 | ||
|
|
9a08666f1f | ||
|
|
2fa6af0636 | ||
|
|
5a4a98fbe4 | ||
|
|
c008dd1f2c | ||
|
|
fb7d8b7839 | ||
|
|
c5f2787284 | ||
|
|
97a862f8e6 | ||
|
|
ac9b0c7c9f | ||
|
|
d33026d12c | ||
|
|
affc59e2c5 | ||
|
|
a67ca1f46c | ||
|
|
653e273214 | ||
|
|
2c893d19a4 | ||
|
|
288ac0acdd | ||
|
|
b2fef55ae9 | ||
|
|
da755d9e84 | ||
|
|
2837272590 | ||
|
|
649b7be4c2 | ||
|
|
f8abb5def1 | ||
|
|
48cbca1f6e | ||
|
|
79a5bd6538 | ||
|
|
a3a092624e | ||
|
|
7f71137147 | ||
|
|
3683e1ef6e | ||
|
|
6444e6989d | ||
|
|
abc9d14dca | ||
|
|
972781ea9d | ||
|
|
104a9a56e9 | ||
|
|
52a76ded63 | ||
|
|
a2070362f9 | ||
|
|
9b8883a871 | ||
|
|
448a33eb4b | ||
|
|
08e0a0dfea | ||
|
|
7e2814d110 | ||
|
|
c21d39840c | ||
|
|
94b7641f90 | ||
|
|
95b38a1744 | ||
|
|
04e825e49a | ||
|
|
ab72edd698 | ||
|
|
25034ffd95 | ||
|
|
6e27a89fef | ||
|
|
8369da365f | ||
|
|
f02d0afdcf | ||
|
|
f5399de58d | ||
|
|
93287cb9fe | ||
|
|
81c0c80a2b | ||
|
|
137c875df7 | ||
|
|
97dedc7d07 | ||
|
|
8e42f0601a | ||
|
|
da570c3a74 | ||
|
|
a59dd8ea65 | ||
|
|
eca6918471 | ||
|
|
3e07eef17e | ||
|
|
f53a1e7507 | ||
|
|
c7207c5a07 | ||
|
|
e666b7cdeb | ||
|
|
c2c9cdc9ea | ||
|
|
4f471c786f | ||
|
|
d867ae1f0e | ||
|
|
c24976155b | ||
|
|
690efda169 | ||
|
|
d60987b33c | ||
|
|
710cefc8dc | ||
|
|
dcdfc22b95 | ||
|
|
64ad81cffa | ||
|
|
7149b6ddab | ||
|
|
976bb6b23c | ||
|
|
7cfa65b8c3 | ||
|
|
c32bd2274c | ||
|
|
791115b826 | ||
|
|
27313bf65a | ||
|
|
8eafdf1884 | ||
|
|
614b8cd7be | ||
|
|
8717f10e60 | ||
|
|
9d5983ee68 | ||
|
|
2949e8d594 | ||
|
|
83e00269b7 | ||
|
|
ee395c325c | ||
|
|
64e1139230 | ||
|
|
8b8d94c78a | ||
|
|
848de0ab64 | ||
|
|
b34cdb58e3 | ||
|
|
8271a51f65 | ||
|
|
39ce30f09a | ||
|
|
90ce02941a | ||
|
|
9f3b103bbf | ||
|
|
7f0043694d | ||
|
|
ab5efa37b1 | ||
|
|
26b84f09bd | ||
|
|
527331a797 | ||
|
|
8657e31b00 | ||
|
|
52465df88a | ||
|
|
6cd6e3cc83 | ||
|
|
554968f8f2 | ||
|
|
cc8cffd324 | ||
|
|
97f19cbffc | ||
|
|
0e727ae890 | ||
|
|
06eddf4795 | ||
|
|
1991150079 | ||
|
|
519e41db52 | ||
|
|
e810387956 | ||
|
|
3890ece2b8 | ||
|
|
c10e58b44e | ||
|
|
1c0df7b51f | ||
|
|
25202cae79 | ||
|
|
8e6b3bba99 | ||
|
|
14deb417a9 | ||
|
|
d987d99c93 | ||
|
|
0d99fc1f98 | ||
|
|
cdb3e1c529 | ||
|
|
db54301514 | ||
|
|
1e0086460b | ||
|
|
fcd6366b28 | ||
|
|
273be272b7 | ||
|
|
9c13e041e3 | ||
|
|
05b11759b7 | ||
|
|
de5ac6b7c6 | ||
|
|
854c95f37a | ||
|
|
628a49f478 | ||
|
|
c1f503b243 | ||
|
|
26dad40e51 | ||
|
|
5b4063fa17 | ||
|
|
636369181b | ||
|
|
701aaedf4d | ||
|
|
af1f6836af | ||
|
|
bae2ac4f0f | ||
|
|
167bc1ec78 | ||
|
|
750ba4bca4 | ||
|
|
5707cdf3b6 | ||
|
|
5a9fad218b | ||
|
|
5b65336328 | ||
|
|
34c1a6b9ba | ||
|
|
e38680d846 | ||
|
|
8e7c88d9a5 | ||
|
|
cfe88663aa | ||
|
|
3023c8343f | ||
|
|
ae55814875 | ||
|
|
8bebb561b1 | ||
|
|
c32ee68637 | ||
|
|
c47560b72a | ||
|
|
d0ff29fca3 | ||
|
|
16cad06e57 | ||
|
|
24b03b37b0 | ||
|
|
2d413bb36d | ||
|
|
5fba511d03 | ||
|
|
4adab723eb | ||
|
|
fa909e6543 | ||
|
|
6d09ab122a | ||
|
|
8684d4f7c6 | ||
|
|
7ed10b9579 | ||
|
|
70c11a35a7 | ||
|
|
640ced5f02 | ||
|
|
2894251eed | ||
|
|
e0650ab2b4 | ||
|
|
744a01489b | ||
|
|
2fe1cb6ced | ||
|
|
1f67fd9bd4 | ||
|
|
6edc94bcc9 | ||
|
|
c57b285c7a | ||
|
|
382c241b10 | ||
|
|
669672dce8 | ||
|
|
c4dba00c54 | ||
|
|
8b0a87e9d4 | ||
|
|
e86055337e | ||
|
|
1fb320ca46 | ||
|
|
98efd25063 | ||
|
|
4d00401f11 | ||
|
|
6c218a903e | ||
|
|
9bfdf818e4 | ||
|
|
3a365fab56 | ||
|
|
59d904e509 | ||
|
|
ce84c3bf57 | ||
|
|
da72a7cebc | ||
|
|
ad45f7294c | ||
|
|
6687f4ca85 | ||
|
|
f8435b0c0f | ||
|
|
61067e6c2c | ||
|
|
11d9f6de83 | ||
|
|
d8e0212833 | ||
|
|
76769f9901 | ||
|
|
b4588f7d47 | ||
|
|
f284b95cb8 | ||
|
|
440d1ad3e1 | ||
|
|
6cb115d6a4 | ||
|
|
271bda57ce | ||
|
|
3803f268c2 | ||
|
|
d187954133 | ||
|
|
3ca4b0e8bd | ||
|
|
4856c53881 | ||
|
|
17674194d4 | ||
|
|
4dc1f719c0 | ||
|
|
2c98e35d1a | ||
|
|
e4778b17ce | ||
|
|
3003a757c1 | ||
|
|
cda0fe6e41 | ||
|
|
e28305186c | ||
|
|
6631b58e6b | ||
|
|
910004b940 | ||
|
|
640f9a96c6 | ||
|
|
0cb1c18778 | ||
|
|
059e1b914e | ||
|
|
11907ad7e4 | ||
|
|
c9850e6059 | ||
|
|
d1d8978a77 | ||
|
|
75e6f73485 | ||
|
|
1551bfffe0 | ||
|
|
a5d3e91f7d | ||
|
|
f713d27c44 | ||
|
|
497cb1dc44 | ||
|
|
487ace2362 | ||
|
|
9bdece3573 | ||
|
|
d440d23bf1 | ||
|
|
b4badd0c53 | ||
|
|
311ab0eae1 | ||
|
|
2b79f12b34 | ||
|
|
fba2d100e9 | ||
|
|
c724584d07 | ||
|
|
d6409f55cf | ||
|
|
2719baa0f6 | ||
|
|
2e3e7d282a | ||
|
|
d7f3e633b7 | ||
|
|
c23a5086ae | ||
|
|
417dd85f83 | ||
|
|
33ca22a4dc | ||
|
|
23b54e6a9f | ||
|
|
b37a1f7d85 | ||
|
|
48910e01ed | ||
|
|
7f7c4df786 | ||
|
|
446fb1939e | ||
|
|
97d2266389 | ||
|
|
d0fbbe7d23 | ||
|
|
3e2c211ccf | ||
|
|
5d22d711f8 | ||
|
|
7701c5fd3a | ||
|
|
3c0c4cd155 | ||
|
|
05f92c0333 | ||
|
|
327bda680d | ||
|
|
ae5e24a6c3 | ||
|
|
3629cef3a5 | ||
|
|
d1a6249cf0 | ||
|
|
0071acd688 | ||
|
|
4d4a469904 | ||
|
|
3705757cd4 | ||
|
|
b2d9f94cb2 | ||
|
|
2f45d51f9b | ||
|
|
a84863528c | ||
|
|
a43b90056b | ||
|
|
15f57538e7 | ||
|
|
ed95200aa9 | ||
|
|
7c35139e90 | ||
|
|
99efb052f2 | ||
|
|
d93a76dcb9 | ||
|
|
20bbd71702 | ||
|
|
6b1a2e884d | ||
|
|
b9145a91e8 | ||
|
|
c75b87a2a0 | ||
|
|
81693cefbf | ||
|
|
5f8a5b3502 | ||
|
|
a09f7fb3bb | ||
|
|
3d50c0ec68 | ||
|
|
d17f0d98a0 | ||
|
|
34400394f9 | ||
|
|
db1da0db8e | ||
|
|
b65961b791 | ||
|
|
f98fcd15be | ||
|
|
975d3f31d6 | ||
|
|
1c792f2d9b | ||
|
|
3b983564b3 | ||
|
|
b740630e89 | ||
|
|
6096f84be2 | ||
|
|
113785f048 | ||
|
|
223ef34898 | ||
|
|
4f74bcaa31 | ||
|
|
5e810ccc6a | ||
|
|
82c55d3892 | ||
|
|
2b41a3930b | ||
|
|
71bb2ce019 | ||
|
|
833a4591df | ||
|
|
addcdf745f | ||
|
|
d4a6169052 | ||
|
|
76572b6ccf | ||
|
|
873c627cda | ||
|
|
48bda774c7 | ||
|
|
8074848636 | ||
|
|
32713ff824 | ||
|
|
f0da3c7ef0 | ||
|
|
44b19cb2e3 | ||
|
|
3ce588b491 | ||
|
|
60e319f8e1 | ||
|
|
7aa5e5d80e | ||
|
|
79bdec2b75 | ||
|
|
7ccb66e80d | ||
|
|
2df4d5f877 | ||
|
|
4114f4faaa | ||
|
|
e77986c86c | ||
|
|
6f3957786a | ||
|
|
3dbabb734b | ||
|
|
e283193ff4 | ||
|
|
6ce42464b3 | ||
|
|
911d0f12e3 | ||
|
|
bf40002af0 | ||
|
|
c63c7b211d | ||
|
|
fe016738bc | ||
|
|
c47150a32d | ||
|
|
2cfae91b71 | ||
|
|
7652cc89ec | ||
|
|
0b7d185875 | ||
|
|
8ce621fc1c | ||
|
|
13e472527d | ||
|
|
6006a9d9b5 | ||
|
|
4b76ad60d2 | ||
|
|
fdc030e0b3 | ||
|
|
84b6e6c7ad | ||
|
|
7714eb06ad | ||
|
|
d781218483 | ||
|
|
ee9078c401 | ||
|
|
4083e22948 | ||
|
|
9380cbd316 | ||
|
|
44fb48d63f | ||
|
|
de02268362 | ||
|
|
4a70ae2fc0 | ||
|
|
edce9e9435 | ||
|
|
724be40854 | ||
|
|
b76492c3b8 | ||
|
|
11da20e744 | ||
|
|
9aa3cd612f | ||
|
|
8433e2e07d | ||
|
|
84a49ec943 | ||
|
|
004f91a020 | ||
|
|
b9afb8d146 | ||
|
|
000d3d33a0 | ||
|
|
b8d3bb5766 | ||
|
|
310b9256eb | ||
|
|
c06bea9a4e | ||
|
|
e388527200 | ||
|
|
4f183f33f1 | ||
|
|
663d2bb1bb | ||
|
|
1e17ddb8d6 | ||
|
|
2d620e5537 | ||
|
|
73fcdf5392 | ||
|
|
de90b91401 | ||
|
|
2178393e18 | ||
|
|
ff488c8214 | ||
|
|
bd66034d7d | ||
|
|
b1c741ca4a | ||
|
|
c7a10fc7b6 | ||
|
|
c5f81d8bbe | ||
|
|
91f2101cab | ||
|
|
52774c6d43 | ||
|
|
be35f82ae5 | ||
|
|
2a9fde86b1 | ||
|
|
c882c22e2f | ||
|
|
a71652ef8e | ||
|
|
25af37bbd3 | ||
|
|
5827305e92 | ||
|
|
50a929d562 | ||
|
|
5bde9fa278 | ||
|
|
ab946c2ed2 | ||
|
|
cedf01f647 | ||
|
|
b55f323afe | ||
|
|
568b3d3559 | ||
|
|
9a91854366 | ||
|
|
248c54c5e0 | ||
|
|
5f49275d9e | ||
|
|
070f08e778 | ||
|
|
fa92a69ff3 | ||
|
|
0deecda4f5 | ||
|
|
55bcd28729 | ||
|
|
842cdcfcf7 | ||
|
|
22ace7228f | ||
|
|
89b901eb84 | ||
|
|
1a6c62a48a | ||
|
|
c579fc985a | ||
|
|
0f1cef96fb | ||
|
|
a85faeef0f | ||
|
|
8b23a44f8f | ||
|
|
a38ca0f248 | ||
|
|
4b0f376f60 | ||
|
|
5de33d066b | ||
|
|
798119c9c8 | ||
|
|
910373eaa2 | ||
|
|
f7b2433583 | ||
|
|
1bf17fecea | ||
|
|
1d99524ed1 | ||
|
|
9a4aed3d7c | ||
|
|
15fba2cbaf | ||
|
|
3ec2cb1e6a | ||
|
|
aa138feb94 | ||
|
|
f9452fb76b | ||
|
|
e3889b6d11 | ||
|
|
4e32fd8975 | ||
|
|
125a54ff1e | ||
|
|
c6acbb54fd | ||
|
|
db600287f8 | ||
|
|
3d90a4587c | ||
|
|
749f96d967 | ||
|
|
27f86babec | ||
|
|
af4296d2bc | ||
|
|
2effa1182e | ||
|
|
bc54693382 | ||
|
|
1b73bca281 | ||
|
|
f6e2db76f4 | ||
|
|
722ce67ebe | ||
|
|
8208177bdc | ||
|
|
4e0d195236 | ||
|
|
60ca330dce | ||
|
|
0335420634 | ||
|
|
dd6f4eef58 | ||
|
|
1f0e9abfdd | ||
|
|
d42de41af3 | ||
|
|
93f704fcd5 | ||
|
|
9ed9185b77 | ||
|
|
6029cf829b | ||
|
|
dc0e331e86 | ||
|
|
79157175ba | ||
|
|
694afc0196 | ||
|
|
d8fd51a537 | ||
|
|
e9ce23a461 | ||
|
|
72641ef884 | ||
|
|
51d41466ff | ||
|
|
5bfa3ebcda | ||
|
|
ac1a9e97ed | ||
|
|
45ad265849 | ||
|
|
7cbc22fece | ||
|
|
8863a26b2d | ||
|
|
2de83adb8e | ||
|
|
ba350064f2 | ||
|
|
caa4a0566e | ||
|
|
932ea9c8b2 | ||
|
|
b121ced3da | ||
|
|
b08edd8dfe | ||
|
|
1bd8bf5ac0 | ||
|
|
4580bd15c5 | ||
|
|
813c009912 | ||
|
|
1cad0c665f | ||
|
|
423326ffc0 | ||
|
|
8e9f0b66fd | ||
|
|
81a0c341ab | ||
|
|
d4f39f7bbb | ||
|
|
a8ac013d93 | ||
|
|
7ebe53d058 | ||
|
|
17a348e594 | ||
|
|
41ecc4a794 | ||
|
|
c24b369523 | ||
|
|
34d5a38a9e | ||
|
|
aa57bc86e5 | ||
|
|
1e476ae9e7 | ||
|
|
c0148cae7c | ||
|
|
02d2e97a23 | ||
|
|
2fc9cb691d | ||
|
|
873b01bba5 | ||
|
|
5306490733 | ||
|
|
353a3b77b6 | ||
|
|
731c2eddae | ||
|
|
6f6b60769c | ||
|
|
b836e230c6 | ||
|
|
deb536bfbd | ||
|
|
29b37b179c | ||
|
|
1963e6088e | ||
|
|
3533587bcb | ||
|
|
ce726ed9dd | ||
|
|
64999cdfda | ||
|
|
e3d87f026e | ||
|
|
448e6a755f | ||
|
|
05e78c20fc | ||
|
|
f2a36c90e3 | ||
|
|
14dc03b434 | ||
|
|
34f6d20e40 | ||
|
|
bd9e603036 | ||
|
|
041b612fd9 | ||
|
|
d8c0e6e69b | ||
|
|
c19ddb1a19 | ||
|
|
8ac387f42c | ||
|
|
5aee26633c | ||
|
|
06bd5b4423 | ||
|
|
83dcc82cf7 | ||
|
|
e005ec7497 | ||
|
|
602f8b47d3 | ||
|
|
d5cb21932f | ||
|
|
3e7599dc34 | ||
|
|
ab57d74357 | ||
|
|
bf4fbad0cc | ||
|
|
9eff0d14d7 | ||
|
|
e809efcd8e | ||
|
|
b99b19f876 | ||
|
|
48740f0026 | ||
|
|
c34e7e2246 | ||
|
|
13ca7bc52e | ||
|
|
813faf1ac2 | ||
|
|
ac4f1d014c | ||
|
|
00e79903fe | ||
|
|
0cdd523a29 | ||
|
|
d1083b7ef2 | ||
|
|
57f0ca26f4 | ||
|
|
e3e31a9f13 | ||
|
|
fd1fc2ea9e | ||
|
|
d3a2d0de87 | ||
|
|
467cf3ce5b | ||
|
|
6e9cf0fd9d | ||
|
|
50aa24ef9d | ||
|
|
e2bbaad4cb | ||
|
|
3a8217f22a | ||
|
|
cb6ecdb94b | ||
|
|
7dc4d3a006 | ||
|
|
b6483a49c1 | ||
|
|
1eef986824 | ||
|
|
b26e370b5b | ||
|
|
38eb1494eb | ||
|
|
5173970f53 | ||
|
|
a3ccfbdd44 | ||
|
|
48c28540cb | ||
|
|
917d28b4f6 | ||
|
|
857b946f3e | ||
|
|
93b2fe0e95 | ||
|
|
fe686ef915 | ||
|
|
ba62774cf0 | ||
|
|
edce8785ee | ||
|
|
a6a8da2d23 | ||
|
|
0477f6cfdf | ||
|
|
a180eb7987 | ||
|
|
61f944d4a9 | ||
|
|
634fb9f93b | ||
|
|
bbfaa333c0 | ||
|
|
00f75f692f | ||
|
|
ae3dc8ea06 | ||
|
|
5b349147b5 | ||
|
|
c4b38ed5dc | ||
|
|
ded99ccad7 | ||
|
|
3edbbf0b46 | ||
|
|
f5aa7d7867 | ||
|
|
2d9014ce11 | ||
|
|
3ccd4c0826 | ||
|
|
f8d94bb998 | ||
|
|
51f25486ec | ||
|
|
8a4d60192f | ||
|
|
218ca38f1d | ||
|
|
42e864fd8e | ||
|
|
1e8b135cb5 | ||
|
|
dc2cac39c7 | ||
|
|
082f4eaa06 | ||
|
|
a3ead88c57 | ||
|
|
2e0fd1c12d | ||
|
|
414792f707 | ||
|
|
0edbfde4d3 | ||
|
|
393df3faf3 | ||
|
|
b9999dfb35 | ||
|
|
b5d02dad47 | ||
|
|
502482a2b9 | ||
|
|
25da233921 | ||
|
|
0ddd5622ec | ||
|
|
156dfa146a | ||
|
|
e383913b3c | ||
|
|
4e89e5ed73 | ||
|
|
c496b4edca | ||
|
|
8728c8723f | ||
|
|
00d65ccddc | ||
|
|
bc33d871e1 | ||
|
|
9754334570 | ||
|
|
c53a13fc26 | ||
|
|
89f6d74696 | ||
|
|
998b8df55d | ||
|
|
54beb17b55 | ||
|
|
d6b177e847 | ||
|
|
438ec66c4c | ||
|
|
a4a4a0cdca | ||
|
|
edf6536645 | ||
|
|
080a156f3f | ||
|
|
b19f00d893 | ||
|
|
2c6afdd5bb | ||
|
|
47d49a802e | ||
|
|
5d0ea11189 | ||
|
|
a71ad16995 | ||
|
|
12581b6a77 | ||
|
|
7c7e002ee4 | ||
|
|
cfb8cd3d62 | ||
|
|
e0e9c2677d | ||
|
|
f7944d3762 | ||
|
|
7d727d287c | ||
|
|
76fb0edf0d | ||
|
|
ab06f3818b | ||
|
|
d9eeac83a0 | ||
|
|
89db85d4fb | ||
|
|
263e3c309a | ||
|
|
889befc8c7 | ||
|
|
4d3b962d8b | ||
|
|
e97e350393 | ||
|
|
db5a9f4cbf | ||
|
|
671af4dd41 | ||
|
|
a02dfb640f | ||
|
|
bde23826e2 | ||
|
|
87f09b34d3 | ||
|
|
13da5ef01d | ||
|
|
8c58bb4332 | ||
|
|
120307b193 | ||
|
|
fbef4c3141 | ||
|
|
403a7bdfc7 | ||
|
|
bb3072153b | ||
|
|
92d864ee92 | ||
|
|
280b349c7e | ||
|
|
2593ac116c | ||
|
|
ba17527d29 | ||
|
|
74b3db9363 | ||
|
|
813b72251a | ||
|
|
1de1bda252 | ||
|
|
8907339963 | ||
|
|
cf80733e41 | ||
|
|
5c9aa0ce93 | ||
|
|
a743ec3989 | ||
|
|
ef70d71636 | ||
|
|
35158efbf0 | ||
|
|
41d9a84a8f | ||
|
|
ac3c114477 | ||
|
|
e8341af803 | ||
|
|
ec95dbd683 | ||
|
|
03a7a6cb08 | ||
|
|
7d52a9b8c4 | ||
|
|
55e257d6fb | ||
|
|
ca46c4dd07 | ||
|
|
4c78642ae2 | ||
|
|
bb816de768 | ||
|
|
2091629922 | ||
|
|
458383c7d3 | ||
|
|
2ce44e8fc8 | ||
|
|
95e1c6f69a | ||
|
|
5d5aa6c96d | ||
|
|
7f6c4ef6cf | ||
|
|
a7c5ae1ca3 | ||
|
|
a926332113 | ||
|
|
8eaee5618e | ||
|
|
4eb6603af7 | ||
|
|
b1725ef1e0 | ||
|
|
26269c3743 | ||
|
|
bb1754b7d3 | ||
|
|
328910049d | ||
|
|
4c7a07e4b8 | ||
|
|
9b4ed8aaf3 | ||
|
|
8da0f3b1be | ||
|
|
464e2e0f0f | ||
|
|
6cebaf2665 | ||
|
|
de9d9ffce1 | ||
|
|
e059a50131 | ||
|
|
5dcfa1137d | ||
|
|
9468fd45ec | ||
|
|
cddfd7cb3b | ||
|
|
57d135e9f6 | ||
|
|
70ff218a8e | ||
|
|
f306fd0aa0 | ||
|
|
e3409b1f78 | ||
|
|
f989982563 | ||
|
|
0ad6c82578 | ||
|
|
becce622e5 | ||
|
|
c4cf75e470 | ||
|
|
0ae5ba2904 | ||
|
|
a69a1f3ff4 | ||
|
|
70a50e9386 | ||
|
|
ab1abd9c6d | ||
|
|
d58d4ed460 | ||
|
|
8bf903c3c8 | ||
|
|
03ec3fd6c6 | ||
|
|
c55be4de1c | ||
|
|
f70050be12 | ||
|
|
0fcc986dac | ||
|
|
0b673ac110 | ||
|
|
b17c83e67b | ||
|
|
5e04b730af | ||
|
|
b6695794d3 | ||
|
|
2e34421c71 | ||
|
|
a507ce0411 | ||
|
|
6b07646129 | ||
|
|
7ae3ee4c73 | ||
|
|
8eea49c56d | ||
|
|
a964dd27e9 | ||
|
|
77dd0c0842 | ||
|
|
395b26832a | ||
|
|
95d6251dbb | ||
|
|
29f916a4f7 | ||
|
|
8f0ffe2043 | ||
|
|
523bdf9819 | ||
|
|
735798a88c | ||
|
|
368ba765ec | ||
|
|
3435ac575e | ||
|
|
21bf83537d | ||
|
|
9e105b072d | ||
|
|
07cd7ba325 | ||
|
|
9ee79aa6b7 | ||
|
|
a63733107f | ||
|
|
253e2fd2d8 | ||
|
|
f680c9cfa5 | ||
|
|
a05c4b0159 | ||
|
|
d324398b5b | ||
|
|
9ca2e4d01f | ||
|
|
b6781ac186 | ||
|
|
2ae049dfbc | ||
|
|
1e7a9e9231 | ||
|
|
938e475db1 | ||
|
|
7decf90b6a | ||
|
|
41cf1e93f4 | ||
|
|
258b6e1d56 | ||
|
|
5ca31e094e | ||
|
|
3d5217f7e0 | ||
|
|
c370f4d09e | ||
|
|
c61a2b0d14 | ||
|
|
91cca684af | ||
|
|
18a668318d | ||
|
|
e92f9cca45 | ||
|
|
8403f7d951 | ||
|
|
83c579b38c | ||
|
|
41348968e9 | ||
|
|
32e875cdb7 | ||
|
|
37729a40bf | ||
|
|
500a017faf | ||
|
|
95d94052a7 | ||
|
|
a0b5cd548a | ||
|
|
235fc59c72 | ||
|
|
247e9eff96 | ||
|
|
d29fd63504 | ||
|
|
5225df26f1 | ||
|
|
bf30802620 | ||
|
|
449568802a | ||
|
|
b3d915629e | ||
|
|
d0a8ae718e | ||
|
|
c2fc30788f | ||
|
|
d818817117 | ||
|
|
2f1dab4631 | ||
|
|
6a1839cb9a | ||
|
|
90daf17ed6 | ||
|
|
b50a47114e | ||
|
|
a30d9a41b8 | ||
|
|
cb539bce98 | ||
|
|
71a609d8d5 | ||
|
|
bca2667a18 | ||
|
|
6280941669 | ||
|
|
f9a2780546 | ||
|
|
cfa9718df9 | ||
|
|
73b15ef8d7 | ||
|
|
cf0c42ae7d | ||
|
|
85d4642450 | ||
|
|
86fb3e4664 | ||
|
|
2d67c15ea9 | ||
|
|
78ea426764 | ||
|
|
5f14cd0b05 | ||
|
|
b308635b67 | ||
|
|
445c49c1eb | ||
|
|
795ef70bf9 | ||
|
|
eccf0e398f | ||
|
|
32875cf7e9 | ||
|
|
242cb70550 | ||
|
|
5c7fff42de | ||
|
|
3c33d0c7d1 | ||
|
|
8df89356f1 | ||
|
|
914a58d716 | ||
|
|
dccb620d66 | ||
|
|
1404e9d61d | ||
|
|
244fbbbb8d | ||
|
|
3f944ef76e | ||
|
|
78e0cb294c | ||
|
|
064c5644e7 | ||
|
|
dfefe7d465 | ||
|
|
e0a99c43dc | ||
|
|
4e6cf58de1 | ||
|
|
ef92649017 | ||
|
|
c5bf6f1c6f | ||
|
|
2188c5fa91 | ||
|
|
12eccdc52d | ||
|
|
42cf5f8511 | ||
|
|
33d91f1b89 | ||
|
|
7ab83f2722 | ||
|
|
e3f15e1d24 | ||
|
|
57d2e7721d | ||
|
|
9b75dc949f | ||
|
|
00f891c3f9 | ||
|
|
d8934d8593 | ||
|
|
2ded70b38a | ||
|
|
8d9755dce3 | ||
|
|
209e392276 | ||
|
|
cc02a4bb9f | ||
|
|
4e2c9e04d1 | ||
|
|
6d1e8cb38b | ||
|
|
3cbdb208c1 | ||
|
|
49066a6d86 | ||
|
|
a32d05e432 | ||
|
|
bfae19c7e1 | ||
|
|
f032329c7f | ||
|
|
c50bc51534 | ||
|
|
580c2c6545 | ||
|
|
18ff892012 | ||
|
|
ca4dfb9ec3 | ||
|
|
0ab25d511a | ||
|
|
f3047d1305 | ||
|
|
2b56b72a0e | ||
|
|
3524146d73 | ||
|
|
e3deae940d | ||
|
|
7a0cbf0cb0 | ||
|
|
f81f3e2e9f | ||
|
|
afda1dc996 | ||
|
|
fa1fcc79b6 | ||
|
|
190449e816 | ||
|
|
4b99060c26 | ||
|
|
343e392eae | ||
|
|
17a799059c | ||
|
|
ab28c48338 | ||
|
|
d9a6121058 | ||
|
|
6f919032a4 | ||
|
|
aaf3999e0d | ||
|
|
a92c08bf26 | ||
|
|
2132229d68 | ||
|
|
16b732472f | ||
|
|
f1d32e71cd | ||
|
|
2fd75566fb | ||
|
|
e2854b3176 | ||
|
|
c77fdd4d17 | ||
|
|
0dcbccd8cc | ||
|
|
94dace4afd | ||
|
|
2e6bf7d87b | ||
|
|
28a2f6a468 | ||
|
|
96d8e7f6fa | ||
|
|
57a7750924 | ||
|
|
711c81ab8c | ||
|
|
68253bc9a1 | ||
|
|
aa782588e9 | ||
|
|
89518bd6e4 | ||
|
|
44a919dc76 | ||
|
|
8c20bf5d7d | ||
|
|
1be61fdb09 | ||
|
|
bca8938a02 | ||
|
|
fba4d82bdb | ||
|
|
2abc524147 | ||
|
|
7b21b41151 | ||
|
|
67e5ba6afa | ||
|
|
7ef8080bdc | ||
|
|
7097b530f3 | ||
|
|
a480b0065b | ||
|
|
4106ed8776 | ||
|
|
e3f199fe37 | ||
|
|
8e69393ddd | ||
|
|
fc0af19b59 | ||
|
|
6af726e72b | ||
|
|
2d46a15a3d | ||
|
|
971d2d6f07 | ||
|
|
9aae8aeb26 | ||
|
|
4e0eaae9da | ||
|
|
d53c1c9ff9 | ||
|
|
5db2548394 | ||
|
|
52e4222c4d | ||
|
|
db736de3f1 | ||
|
|
01ce7289c9 | ||
|
|
c39976d2bb | ||
|
|
51b88ab1a5 | ||
|
|
1a8734bb45 | ||
|
|
cef67c4d9b | ||
|
|
e97746217b | ||
|
|
f2b23a101d | ||
|
|
548c247ffc | ||
|
|
4cad77089a | ||
|
|
7747f4f40d | ||
|
|
fff957a199 | ||
|
|
064c25f144 | ||
|
|
a961b07c65 | ||
|
|
e772633d0a | ||
|
|
b5b3e256f8 | ||
|
|
c715570f87 | ||
|
|
1674eba2cd | ||
|
|
3d4883f332 | ||
|
|
d26d5a327e | ||
|
|
358a90b821 | ||
|
|
0aac821633 | ||
|
|
685b46f1e3 | ||
|
|
183b8e29c4 | ||
|
|
a01b38bc36 | ||
|
|
8161cd7f1c | ||
|
|
ab4b82ba57 | ||
|
|
328fbc24b4 | ||
|
|
017211395a | ||
|
|
8eef99ad04 | ||
|
|
0ec4f30aa9 | ||
|
|
a8f4348add | ||
|
|
4744849b76 | ||
|
|
26e11e9b3f | ||
|
|
8076a8313b | ||
|
|
577816ca4a | ||
|
|
219413f324 | ||
|
|
dfdc7e0c95 | ||
|
|
208ca098f2 | ||
|
|
0948d4002f | ||
|
|
18fa8ddc58 | ||
|
|
55dbbde37e | ||
|
|
d2c18a505a | ||
|
|
48bb187075 | ||
|
|
308dc412aa | ||
|
|
1953d41d0d | ||
|
|
4f358f018b | ||
|
|
4657003811 | ||
|
|
ac32311894 | ||
|
|
57d35e188c | ||
|
|
25a7b19902 | ||
|
|
096f53e716 | ||
|
|
d62ae94bb8 | ||
|
|
378b73150a | ||
|
|
b2d920bbf1 | ||
|
|
4d27a9eb0e | ||
|
|
abf191289c | ||
|
|
6573b308b6 | ||
|
|
9fc09db89c | ||
|
|
65d898c4fe | ||
|
|
4575569238 | ||
|
|
95dff19070 | ||
|
|
837490b4a4 | ||
|
|
78b418ba9d | ||
|
|
2550ab1691 | ||
|
|
05a648d4f3 | ||
|
|
fb548b1b45 | ||
|
|
fd78aa9798 | ||
|
|
ba460554a1 | ||
|
|
e35e4e65ed | ||
|
|
56815914ec | ||
|
|
2cf7dbc4de | ||
|
|
f60f32effd | ||
|
|
f95fe4caab | ||
|
|
564315a690 | ||
|
|
ed13e8b135 | ||
|
|
bb530b8ccd | ||
|
|
f91ecab8ed | ||
|
|
b05030b364 | ||
|
|
a237f203d6 | ||
|
|
c4c46e0121 | ||
|
|
1c63234508 | ||
|
|
37c446fc4e | ||
|
|
1f65796731 | ||
|
|
b1ec76826b | ||
|
|
e8aae60066 | ||
|
|
a7e234658b | ||
|
|
87fd0614ad | ||
|
|
380abd2be2 | ||
|
|
034349253f | ||
|
|
14ec92a814 | ||
|
|
230da71f08 | ||
|
|
249001241c | ||
|
|
4edc1fec30 | ||
|
|
881caec464 | ||
|
|
2316d02f9f | ||
|
|
d4a6dc6ec6 | ||
|
|
71426f6416 | ||
|
|
17455c2529 | ||
|
|
951aa927ee | ||
|
|
70648165a8 | ||
|
|
5ee4909feb | ||
|
|
cc5b80036d | ||
|
|
38d27534c0 | ||
|
|
434a90506d | ||
|
|
7383371d58 | ||
|
|
8820185152 | ||
|
|
4b08987e53 | ||
|
|
276d6a5dc5 | ||
|
|
206212fa8c | ||
|
|
54e15000ef | ||
|
|
14d73e5073 | ||
|
|
37d06c4860 | ||
|
|
1e5a6284dd | ||
|
|
ec30c89c1e | ||
|
|
099cd21c5b | ||
|
|
1c1b8d3919 | ||
|
|
1140c22164 | ||
|
|
6935bbc851 | ||
|
|
5e63929aea | ||
|
|
f46bbd5e53 | ||
|
|
7a1cf8de82 | ||
|
|
da8874862d | ||
|
|
a1d7c87f4c | ||
|
|
33b8ea4a42 | ||
|
|
00e441f354 | ||
|
|
78af38007b | ||
|
|
427dde6180 | ||
|
|
84c74eec71 | ||
|
|
6838d59e64 | ||
|
|
2e6bc97fd4 | ||
|
|
11f464f7ff | ||
|
|
f5a4fcd3ac | ||
|
|
af9b74759b | ||
|
|
73f9d6dcdd | ||
|
|
0ac689387a | ||
|
|
80fa8dbaf5 | ||
|
|
b97554f2f3 | ||
|
|
ce12dc1253 | ||
|
|
9c1db1f904 | ||
|
|
9ed3881f34 | ||
|
|
2779fe57ff | ||
|
|
df93b15e2f | ||
|
|
c9099ade9e | ||
|
|
e9d36dd025 | ||
|
|
c8117effda | ||
|
|
0a0d5f67bb | ||
|
|
985fc3af47 | ||
|
|
96eba2bddf | ||
|
|
2b6a3aacef | ||
|
|
4a527eb763 | ||
|
|
c6d19c431d | ||
|
|
9dad964323 | ||
|
|
2cae4230e3 | ||
|
|
bc37ea9eb1 | ||
|
|
287723902c | ||
|
|
9c12b351e5 | ||
|
|
03e244a6a2 | ||
|
|
9d409c800f | ||
|
|
ce2f78e890 | ||
|
|
e6036439f6 | ||
|
|
64258a1ac4 | ||
|
|
efd9f2c088 | ||
|
|
08763ef139 | ||
|
|
3c09bfa602 | ||
|
|
2c718db797 | ||
|
|
0d5026165f | ||
|
|
e075a4fbca | ||
|
|
74f7bdc3a8 | ||
|
|
e25e61c3b7 | ||
|
|
83d530e181 | ||
|
|
2bf252ab0d | ||
|
|
106059329d | ||
|
|
5f44d5e8e2 | ||
|
|
e8c8c32cf3 | ||
|
|
3d817ff7e7 | ||
|
|
744cea6421 | ||
|
|
b55657b17f | ||
|
|
25a607973d | ||
|
|
3ae88e733b | ||
|
|
3d9b1abe17 | ||
|
|
62b2900348 | ||
|
|
d1c11d50eb | ||
|
|
36ab4c1064 | ||
|
|
4449da3e63 | ||
|
|
9c64d29941 | ||
|
|
6701d19a45 | ||
|
|
11a4e1afa6 | ||
|
|
cd9b06135f | ||
|
|
3266ffc58f | ||
|
|
b41cdf5697 | ||
|
|
b2d3d142f0 | ||
|
|
76cd52325d | ||
|
|
0ba7917608 | ||
|
|
e8c3556183 | ||
|
|
0c4568bca8 | ||
|
|
a34b92408e | ||
|
|
9fabdf309f | ||
|
|
e716731b98 | ||
|
|
44e842f33e | ||
|
|
7f6780b7fb | ||
|
|
eac8a9f3ec | ||
|
|
753ce9ca8e | ||
|
|
3fee998108 | ||
|
|
5d62a89999 | ||
|
|
0c62c68c5e | ||
|
|
65ee0b17d7 | ||
|
|
6e764a20b3 | ||
|
|
1c8e60487c | ||
|
|
d9bb33e65d | ||
|
|
9cfee0f40b | ||
|
|
f16a2ef2f4 | ||
|
|
59c0297f3f | ||
|
|
348afc4e44 | ||
|
|
4504c422ae | ||
|
|
66f5cffa4a | ||
|
|
fd8f57df3b | ||
|
|
a13f90abaf | ||
|
|
70b0d5d1cc | ||
|
|
4de6e49207 | ||
|
|
bcf5c78a32 | ||
|
|
8d97e91393 | ||
|
|
62bc7b75d7 | ||
|
|
d15c4ce511 | ||
|
|
d64b5c52a2 | ||
|
|
aea39782fb | ||
|
|
47015eba0c | ||
|
|
297fd14507 | ||
|
|
135f713236 | ||
|
|
e6a491856d | ||
|
|
6da3e6e2c5 | ||
|
|
0d35a9700b | ||
|
|
819ddd0e19 | ||
|
|
c2f7baf940 | ||
|
|
7e7631c42a | ||
|
|
1786bbbe80 | ||
|
|
2afc9c0f7e | ||
|
|
7fd942a04c | ||
|
|
a7764dacd9 | ||
|
|
862c7faf2d | ||
|
|
ded5de2a3d | ||
|
|
26c73b524a | ||
|
|
f4af4ceecd | ||
|
|
ae9b556899 | ||
|
|
0e4ecbc646 | ||
|
|
5ad5d4e853 | ||
|
|
04756b5eec | ||
|
|
5fe53b4e48 | ||
|
|
8fc6641750 | ||
|
|
a114f64429 | ||
|
|
6385f615c9 | ||
|
|
9417e88c15 | ||
|
|
38eb5dc9d8 | ||
|
|
f638234bc6 | ||
|
|
aeee8e67a9 | ||
|
|
b39a6f4cae | ||
|
|
e7bb9e8484 | ||
|
|
107362b9fb | ||
|
|
d97151b825 | ||
|
|
313c5f7dc9 | ||
|
|
2ee34b825c | ||
|
|
98ebc570e9 | ||
|
|
305b5d628a | ||
|
|
67b7188ba4 | ||
|
|
039d4dc714 | ||
|
|
4a6331377f | ||
|
|
e7819833c1 | ||
|
|
4c5ca75ca6 | ||
|
|
ee348c50e9 | ||
|
|
b963453439 | ||
|
|
be57e40e91 | ||
|
|
c20871274c | ||
|
|
43e9ae1226 | ||
|
|
dd28c47261 | ||
|
|
1c2ce4ff1c | ||
|
|
31e30d28b7 | ||
|
|
40f97eed85 | ||
|
|
14eeaf88dc | ||
|
|
66d9ef872c | ||
|
|
974f9391f2 | ||
|
|
5ade602183 | ||
|
|
bb0904f20d | ||
|
|
dc5b2a4ea0 | ||
|
|
c7570d052c | ||
|
|
276194d554 | ||
|
|
d8a2a393fc | ||
|
|
c1f8d30c28 | ||
|
|
106fe3c138 | ||
|
|
3de2085cce | ||
|
|
a7e4768d4e | ||
|
|
f1987befbd | ||
|
|
2139db7437 | ||
|
|
73db907e99 | ||
|
|
c890db50b9 | ||
|
|
e0f910a7ba | ||
|
|
f89d82088a | ||
|
|
0f313f4d69 | ||
|
|
5657f3a3fa | ||
|
|
074d09fceb | ||
|
|
8de7555af6 | ||
|
|
cb66d66526 | ||
|
|
85e1a6b54f | ||
|
|
53dc86b1b2 | ||
|
|
be91662823 | ||
|
|
5df5a32903 | ||
|
|
fc256ed77e | ||
|
|
20587b524c | ||
|
|
7924850601 | ||
|
|
6bb88026ea | ||
|
|
fa75b78bf9 | ||
|
|
a93a811ba0 | ||
|
|
2a64990a71 | ||
|
|
fbf951f005 | ||
|
|
679b6108ad | ||
|
|
b05ad3d920 | ||
|
|
a660df133f | ||
|
|
500a27bd8b | ||
|
|
acacad0515 | ||
|
|
5cb983c760 | ||
|
|
50890c93e2 | ||
|
|
ad62739a6e | ||
|
|
0bf2b04dee | ||
|
|
b7718fb0ed | ||
|
|
8cba211ecd | ||
|
|
aa89746c47 | ||
|
|
893d134e36 | ||
|
|
66182f4cfb | ||
|
|
14ddcf843d | ||
|
|
16c8d2c246 | ||
|
|
c5a4be2edd | ||
|
|
fb22c587f8 | ||
|
|
f4484455aa | ||
|
|
dc6ae2293d | ||
|
|
4f4c90fc20 | ||
|
|
5f40eec148 | ||
|
|
12d4db5045 | ||
|
|
019933ef25 | ||
|
|
870be87389 | ||
|
|
b8cf046b38 | ||
|
|
c9a91efc3d | ||
|
|
682b4402a0 | ||
|
|
edcdeb1036 | ||
|
|
c7e2f6b62f | ||
|
|
dce1790886 | ||
|
|
8a74d6b8db | ||
|
|
176021e188 | ||
|
|
84e93efe5c | ||
|
|
1552f27a43 | ||
|
|
2efdf7982c | ||
|
|
65d30f7ec0 | ||
|
|
5337dc31d9 | ||
|
|
f94d69c7a8 | ||
|
|
c6646b1cda | ||
|
|
ba206c9683 | ||
|
|
0113b9283c | ||
|
|
d840eab615 | ||
|
|
afb1f6db28 | ||
|
|
91ae3c3f4c | ||
|
|
98f5a0c04e | ||
|
|
bc1a019c74 | ||
|
|
4eb47881c1 | ||
|
|
3ce95099e9 | ||
|
|
68d9f37fec | ||
|
|
d0cdd0441a | ||
|
|
f0d4fdd98e | ||
|
|
7157de3851 | ||
|
|
077810f6aa | ||
|
|
e59109e807 | ||
|
|
c6104b7860 | ||
|
|
cb46dd2dbd | ||
|
|
120c42f7a4 | ||
|
|
356cea1611 | ||
|
|
fe6e66958c | ||
|
|
2411d80060 | ||
|
|
8bc5145482 | ||
|
|
ece1d4d231 | ||
|
|
3e127a6169 | ||
|
|
2440d52ebe | ||
|
|
ecd1343d75 | ||
|
|
231c8837ca | ||
|
|
32ee149909 | ||
|
|
a18512d78c | ||
|
|
57febf2712 | ||
|
|
d940b5d458 | ||
|
|
6261cb6997 | ||
|
|
f855bc1562 | ||
|
|
5f62d2ecfe | ||
|
|
c7b0cf51ad | ||
|
|
312820ed4c | ||
|
|
c5d10f2001 | ||
|
|
56cd27ac71 | ||
|
|
988bb88409 | ||
|
|
1bb20f8231 | ||
|
|
8c0a06b56a | ||
|
|
fe0d05900f | ||
|
|
a66128caa9 | ||
|
|
f184f6685d | ||
|
|
ceca0803e4 | ||
|
|
d2c0ea103e | ||
|
|
d75623084e | ||
|
|
453b79dad7 | ||
|
|
ca6ea355e6 | ||
|
|
45c6e43b42 | ||
|
|
24dd0ca924 | ||
|
|
35db8721b2 | ||
|
|
1c1f008238 | ||
|
|
a04144c3c2 | ||
|
|
a18f0590f6 | ||
|
|
853cecd406 | ||
|
|
7fba608337 | ||
|
|
073e7dc829 | ||
|
|
c2a75c9040 | ||
|
|
f1292cc46b | ||
|
|
0d718b2400 | ||
|
|
12a3b99b09 | ||
|
|
0fe5e58d97 | ||
|
|
75e536937a | ||
|
|
4d5dd1ea0d | ||
|
|
1dfc37d6d2 | ||
|
|
0cd932a7ac | ||
|
|
068931e544 | ||
|
|
22fce4f97b | ||
|
|
6934e148ca | ||
|
|
953c5d6151 | ||
|
|
9397c41e6c | ||
|
|
4234c2ce3d | ||
|
|
3ce7cae338 | ||
|
|
a06f0e0bd4 | ||
|
|
c88b8c1d23 | ||
|
|
765995f0a3 | ||
|
|
f7efd6904b | ||
|
|
1433835d74 | ||
|
|
21dae53203 | ||
|
|
4934318a5a | ||
|
|
bb954e7e2c | ||
|
|
6d83297f24 | ||
|
|
43377c1332 | ||
|
|
eb734c9f98 | ||
|
|
c3bc299a84 | ||
|
|
3685b0ed2a | ||
|
|
6bcb188d9d | ||
|
|
e2af5f6be3 | ||
|
|
1572141cc5 | ||
|
|
30511264c2 | ||
|
|
ad8f847465 | ||
|
|
745bf3d79f | ||
|
|
6dd7e5374d | ||
|
|
ebe31283f4 | ||
|
|
4fc8eff921 | ||
|
|
c5a2c2fd22 | ||
|
|
0158738aff | ||
|
|
f2f5c5e958 | ||
|
|
49c4cad7de | ||
|
|
0e6366ec08 | ||
|
|
16fb967976 | ||
|
|
179b9bd4ef | ||
|
|
6a0f0bc050 | ||
|
|
3843beafa7 | ||
|
|
a0b68010b9 | ||
|
|
297c9e45ab | ||
|
|
7617e4e377 | ||
|
|
de5331fa00 | ||
|
|
259ecd0f79 | ||
|
|
fd84f9378e | ||
|
|
53c4113684 | ||
|
|
5f4e24e540 | ||
|
|
b358a7daf5 | ||
|
|
c46aec3196 | ||
|
|
085fddcb36 | ||
|
|
fc00aecd2e | ||
|
|
2130ce7481 | ||
|
|
b8b64ac655 | ||
|
|
9fa59d0735 | ||
|
|
ad5664e1ab | ||
|
|
6e807e2017 | ||
|
|
ff63bcbf77 | ||
|
|
8cbeca731b | ||
|
|
7c54648be8 | ||
|
|
72fc1ad81a | ||
|
|
194394f7c5 | ||
|
|
4d8e45722c | ||
|
|
ab628cb828 | ||
|
|
d4d61d7904 | ||
|
|
a1d5f50c3d | ||
|
|
6d4621baeb | ||
|
|
dc5cd438cd | ||
|
|
bcc2bc797a | ||
|
|
02660f678f | ||
|
|
f393252a11 | ||
|
|
c89738cadb | ||
|
|
dae1921533 | ||
|
|
54b8622114 | ||
|
|
43342cd133 | ||
|
|
a11208d126 | ||
|
|
94d160bee3 | ||
|
|
5dfc806df5 | ||
|
|
8cfef2e3ca | ||
|
|
a0f559aeda | ||
|
|
8ef8f59cd9 | ||
|
|
a06c8ebb6f | ||
|
|
f852dd9659 | ||
|
|
02002082bf | ||
|
|
17def91ea3 | ||
|
|
767f61ba78 | ||
|
|
be29df893a | ||
|
|
2d58ef4c1d | ||
|
|
9f63431539 | ||
|
|
3cef7cd5cd | ||
|
|
295c2973b5 | ||
|
|
2276764951 | ||
|
|
73deb49db1 | ||
|
|
d7c48314b8 | ||
|
|
ca41c0d124 | ||
|
|
3e82c37bed | ||
|
|
a7c5897bdb | ||
|
|
1aa7313a7b | ||
|
|
5aab9e1ba8 | ||
|
|
aa45598ae1 | ||
|
|
25946b4541 | ||
|
|
1e307c16ac | ||
|
|
a7d1e6fdf7 | ||
|
|
87cc4b9c9f | ||
|
|
2ae553702b | ||
|
|
791242a73b | ||
|
|
d0728a5e65 | ||
|
|
003c7bb209 | ||
|
|
277e470bd3 | ||
|
|
ef3f60e636 | ||
|
|
2747f324e9 | ||
|
|
82a2908582 | ||
|
|
2a00556dae | ||
|
|
15768a6025 | ||
|
|
27c54cc36c | ||
|
|
c64aada38f | ||
|
|
30a9c49bf0 | ||
|
|
11f1c693a8 | ||
|
|
dc70c4376d | ||
|
|
afa99f5788 | ||
|
|
904f197c06 | ||
|
|
b56fa82446 | ||
|
|
ae7fb85ef0 | ||
|
|
d35b4b8be4 | ||
|
|
b35d464cc8 | ||
|
|
db69f0ae44 | ||
|
|
8cae7abb3e | ||
|
|
b1b9edb43d | ||
|
|
e23d0bf907 | ||
|
|
7fd957c2e5 | ||
|
|
bbd8a3f6ae | ||
|
|
e4446d4cb3 | ||
|
|
424ea22131 | ||
|
|
0a895a2867 | ||
|
|
3e262b4c6b | ||
|
|
64e7ae6eb8 | ||
|
|
4275a66b49 | ||
|
|
9349ba5403 | ||
|
|
7202573f82 | ||
|
|
a7b743da07 | ||
|
|
72319c0b52 | ||
|
|
df1c34d0ad | ||
|
|
9f6c5e139f | ||
|
|
a725aafa24 | ||
|
|
61e9307002 | ||
|
|
f23590a479 | ||
|
|
da67764437 | ||
|
|
3cc63c4767 | ||
|
|
db3e885076 | ||
|
|
1c3130d846 | ||
|
|
3371ae86c1 | ||
|
|
06772567d5 | ||
|
|
02fb48e15d | ||
|
|
2aeef0b120 | ||
|
|
53cc0ad3ff | ||
|
|
ded5c0d863 | ||
|
|
9889370c08 | ||
|
|
c6650285f5 | ||
|
|
f2e8d39d1f | ||
|
|
cc08dcd2ca | ||
|
|
2e98eec48d | ||
|
|
1527f04db3 | ||
|
|
a2d2f5e611 | ||
|
|
cdf7b3276b | ||
|
|
e77ef118ea | ||
|
|
4fab991cdf | ||
|
|
b908361895 | ||
|
|
04230086a4 | ||
|
|
599d3b6c0c | ||
|
|
55ab1bc24a | ||
|
|
30f10b743a | ||
|
|
f8610190bb | ||
|
|
fc690bf063 | ||
|
|
8656e794ff | ||
|
|
96a05fa0ed | ||
|
|
b648f4b7e1 | ||
|
|
23277606d4 | ||
|
|
f4305de074 | ||
|
|
f96a94fbcd | ||
|
|
e887b5012b | ||
|
|
ed79ec9b2e | ||
|
|
56163c5f37 | ||
|
|
8e01078492 | ||
|
|
98891c0c12 | ||
|
|
60eddb233b | ||
|
|
b7e9b8b461 | ||
|
|
22ed6a8a2f | ||
|
|
9a3d7eedc4 | ||
|
|
7323e180f4 | ||
|
|
3f3e412d10 | ||
|
|
e3bf72f90e | ||
|
|
bf6a18dfc4 | ||
|
|
935133755e | ||
|
|
44faf4462c | ||
|
|
98959b224d | ||
|
|
114172d66c | ||
|
|
5c5664ec30 | ||
|
|
9f1ebbb852 | ||
|
|
345ce340e4 | ||
|
|
4fca41e83e | ||
|
|
4868098495 | ||
|
|
b92118b5ab | ||
|
|
ea08212df6 | ||
|
|
3a933df1f1 | ||
|
|
de6006c6e2 | ||
|
|
5d688d2417 | ||
|
|
41d417b0fc | ||
|
|
66c5f9b63d | ||
|
|
4a1d50730b | ||
|
|
aa630c3682 | ||
|
|
d99fee5dac | ||
|
|
c620688758 | ||
|
|
5199371b9f | ||
|
|
479c7a4668 | ||
|
|
ec64789940 | ||
|
|
039bde29cc | ||
|
|
465c248572 | ||
|
|
a01793d3af | ||
|
|
1cc682e488 | ||
|
|
17512d282a | ||
|
|
9622c64bc6 | ||
|
|
c27aac20b7 | ||
|
|
0bc28323c8 | ||
|
|
4c5f570e86 | ||
|
|
2498bba90a | ||
|
|
75ea4d3e9a | ||
|
|
02649e2b70 | ||
|
|
27c1867701 | ||
|
|
92bbec294c | ||
|
|
f093f594d5 | ||
|
|
6e83a15bd6 | ||
|
|
a32aebfb3a | ||
|
|
10d7884643 | ||
|
|
6b058ce2bf | ||
|
|
1aecdbbbbb | ||
|
|
6b859f17ae | ||
|
|
7a9a3651e1 | ||
|
|
fb8fb42d81 | ||
|
|
4200f8e73e | ||
|
|
b79ead82d2 | ||
|
|
6e5171f559 | ||
|
|
6aaac599e0 | ||
|
|
79c61ed1a0 | ||
|
|
d9f8667d2b | ||
|
|
681f1285f8 | ||
|
|
46e5755f40 | ||
|
|
b74203b846 | ||
|
|
2ca60292bb | ||
|
|
a01e0583ea | ||
|
|
fca8b13ddd | ||
|
|
64a0d40361 | ||
|
|
504368369c | ||
|
|
2be36c375d | ||
|
|
4ea0af87df | ||
|
|
87e665d60e | ||
|
|
ac7985a5ad | ||
|
|
9d396280b0 | ||
|
|
c502f016f7 | ||
|
|
3c78cb7872 | ||
|
|
f7b3876c1b | ||
|
|
ad5806c29d | ||
|
|
eadec38ae2 | ||
|
|
75c5a8b246 | ||
|
|
083d48b9cb | ||
|
|
de1b5d459c | ||
|
|
88337723c5 | ||
|
|
63a5477479 | ||
|
|
6f72ffe498 | ||
|
|
f6627c4d4e | ||
|
|
fab77e8d37 | ||
|
|
6077d7c0f1 | ||
|
|
e77490645b | ||
|
|
6451d37570 | ||
|
|
061e0b6618 | ||
|
|
e2c9175f6d | ||
|
|
4a2d711fb7 | ||
|
|
5a4887e300 | ||
|
|
6ed56b5de1 | ||
|
|
53da372d0a | ||
|
|
fd8ec6485c | ||
|
|
c0c43bca84 | ||
|
|
2060258a15 | ||
|
|
7247ccbf38 | ||
|
|
01f6e90828 | ||
|
|
6e6b0b08fb | ||
|
|
37b849a059 | ||
|
|
453ddd76b3 | ||
|
|
d04b25403d | ||
|
|
72ff21e01f | ||
|
|
7e3d44e35a | ||
|
|
ac6b3fb908 | ||
|
|
bb48b09920 | ||
|
|
ea6a397647 | ||
|
|
ed5b28f366 | ||
|
|
f403a06967 | ||
|
|
ee5507cae8 | ||
|
|
9e34c145c3 | ||
|
|
755619fa87 | ||
|
|
0a12ca690f | ||
|
|
8bf00cbfb7 | ||
|
|
b8ab1ff852 | ||
|
|
60f6736360 | ||
|
|
4b0dad27f5 | ||
|
|
34c132a67e | ||
|
|
7725bc37bc | ||
|
|
6afd7b4783 | ||
|
|
c40d9634bb | ||
|
|
f2752eb01e | ||
|
|
e652e4658c | ||
|
|
87295a74dd | ||
|
|
fce644556b | ||
|
|
50737f7f73 | ||
|
|
b0c0166e9b | ||
|
|
4515b8fe70 | ||
|
|
8a9bbd6264 | ||
|
|
93411a2b91 | ||
|
|
7f47883c48 | ||
|
|
1cdb6a66f0 | ||
|
|
46fd03047b | ||
|
|
07d2ae9256 | ||
|
|
22502d5cf6 | ||
|
|
a7cfa352d5 | ||
|
|
0c707eeb58 | ||
|
|
4365e19727 | ||
|
|
6a1699cfd9 | ||
|
|
f8b59fe3d7 | ||
|
|
7822864ab3 | ||
|
|
a3c90e9a4b | ||
|
|
c1dac5f26e | ||
|
|
72ca7b28c6 | ||
|
|
f11d55fde6 | ||
|
|
48217bc218 | ||
|
|
b66c0941f5 | ||
|
|
a2d41da30f | ||
|
|
5f0280eab4 | ||
|
|
72ec41f890 | ||
|
|
ad756d4054 | ||
|
|
3e8ab15188 | ||
|
|
e318b63dff | ||
|
|
a99f1e8954 | ||
|
|
406a02e786 | ||
|
|
c76c445e43 | ||
|
|
3bba8ef061 | ||
|
|
a699cc348b | ||
|
|
f010f7b9c1 | ||
|
|
c07babb4e8 | ||
|
|
4d971029f9 | ||
|
|
3fdf1e2bc7 | ||
|
|
055055687c | ||
|
|
7d389926a2 | ||
|
|
b53d729592 | ||
|
|
46bb2438a8 | ||
|
|
99a5c2d7cb | ||
|
|
1a2052b2b4 | ||
|
|
16c5fe27e3 | ||
|
|
5740acd0dd | ||
|
|
5d27dcc27c | ||
|
|
52bbebf9aa | ||
|
|
578f900435 | ||
|
|
3bc1de3f6c | ||
|
|
c8f6c474bb | ||
|
|
8135bd43a6 | ||
|
|
69ce6975dc | ||
|
|
ce555e5083 | ||
|
|
e7bb4373ca | ||
|
|
88fac957af | ||
|
|
046d827784 | ||
|
|
016437f9f4 | ||
|
|
e83519b3b9 | ||
|
|
dad5cb6166 | ||
|
|
2fa4d4bd8a |
@@ -1,3 +1,4 @@
|
|||||||
examples/Jugl.js
|
examples/Jugl.js
|
||||||
examples/resources/
|
examples/resources/
|
||||||
build/package/**/*webgl*
|
build/package/**/*webgl*
|
||||||
|
config/jsdoc/api/template/static/scripts/
|
||||||
1
.github/PULL_REQUEST_TEMPLATE.md
vendored
1
.github/PULL_REQUEST_TEMPLATE.md
vendored
@@ -6,4 +6,3 @@ In order to get your proposed changes merged into the master branch, we ask you
|
|||||||
- [ ] It contains one or more small, incremental, logically separate commits, with no merge commits.
|
- [ ] It contains one or more small, incremental, logically separate commits, with no merge commits.
|
||||||
- [ ] I have used clear commit messages.
|
- [ ] I have used clear commit messages.
|
||||||
- [ ] Existing tests pass for me locally & I have added or updated tests for new or changed functionality.
|
- [ ] Existing tests pass for me locally & I have added or updated tests for new or changed functionality.
|
||||||
- [ ] The work herein is covered by a valid [Contributor License Agreement (CLA)](https://github.com/openlayers/cla).
|
|
||||||
|
|||||||
1
.gitignore
vendored
1
.gitignore
vendored
@@ -2,3 +2,4 @@
|
|||||||
/coverage/
|
/coverage/
|
||||||
/dist/
|
/dist/
|
||||||
/node_modules/
|
/node_modules/
|
||||||
|
src/index.js
|
||||||
|
|||||||
@@ -1 +0,0 @@
|
|||||||
/build/
|
|
||||||
@@ -1,14 +1,9 @@
|
|||||||
sudo: false
|
|
||||||
language: node_js
|
language: node_js
|
||||||
node_js:
|
node_js:
|
||||||
- '8'
|
- '8'
|
||||||
cache:
|
cache:
|
||||||
directories:
|
directories:
|
||||||
- node_modules
|
- node_modules
|
||||||
before_script:
|
|
||||||
- rm src/ol/renderer/webgl/*shader.js
|
|
||||||
- rm src/ol/renderer/webgl/*shader/locations.js
|
|
||||||
script: make ci
|
|
||||||
after_success:
|
after_success:
|
||||||
- cat coverage/lcov.info | coveralls
|
- cat coverage/lcov.info | coveralls
|
||||||
branches:
|
branches:
|
||||||
|
|||||||
@@ -31,12 +31,7 @@ This page describes what you need to know to contribute code to OpenLayers as a
|
|||||||
|
|
||||||
## Contributor License Agreement
|
## Contributor License Agreement
|
||||||
|
|
||||||
Before accepting a contribution, we ask that you provide us a Contributor
|
Your contribution will be under our [license](https://raw.githubusercontent.com/openlayers/openlayers/master/LICENSE.md) as per [GitHub's terms of service](https://help.github.com/articles/github-terms-of-service/#6-contributions-under-repository-license).
|
||||||
License Agreement. If you are making your contribution as part of work for
|
|
||||||
your employer, please follow the guidelines on submitting a [Corporate
|
|
||||||
Contributor License Agreement](https://raw.github.com/openlayers/cla/master/ccla.txt). If you are
|
|
||||||
making your contribution as an individual, you can submit a digital [Individual
|
|
||||||
Contributor License Agreement](https://docs.google.com/spreadsheet/viewform?formkey=dGNNVUJEMXF2dERTU0FXM3JjNVBQblE6MQ).
|
|
||||||
|
|
||||||
|
|
||||||
## Pull request guidelines
|
## Pull request guidelines
|
||||||
@@ -60,66 +55,6 @@ Your pull request must:
|
|||||||
* Be possible to merge automatically.
|
* Be possible to merge automatically.
|
||||||
|
|
||||||
|
|
||||||
### The `check` build target
|
|
||||||
|
|
||||||
It is strongly recommended that you run
|
|
||||||
|
|
||||||
$ make check
|
|
||||||
|
|
||||||
before every commit. This will catch many problems quickly, and it is much
|
|
||||||
faster than waiting for the Travis CI integration tests to run.
|
|
||||||
|
|
||||||
The `check` build target runs a number of quick tests on your code. These
|
|
||||||
include:
|
|
||||||
|
|
||||||
* Lint
|
|
||||||
* Compile
|
|
||||||
* Tests
|
|
||||||
|
|
||||||
|
|
||||||
### Follow OpenLayers's coding style
|
|
||||||
|
|
||||||
OpenLayers follows [Google's JavaScript Style
|
|
||||||
Guide](https://google.github.io/styleguide/javascriptguide.xml).
|
|
||||||
This is checked using [ESLint](http://eslint.org/), you
|
|
||||||
can run the linter locally on your machine before committing using the `lint`
|
|
||||||
target:
|
|
||||||
|
|
||||||
$ make lint
|
|
||||||
|
|
||||||
In addition to fixing problems identified by the linter, please also follow the
|
|
||||||
style of the existing OpenLayers code, which includes:
|
|
||||||
|
|
||||||
* Always wrap the body of `for`, `if`, and `while` statements in braces.
|
|
||||||
|
|
||||||
* Class methods should be in alphabetical order.
|
|
||||||
|
|
||||||
* `var` declarations should not span multiple lines. If you cannot fit all
|
|
||||||
the declarations in a single line, then start a new `var` declaration on a
|
|
||||||
new line. Within a single line, variables should be declared in
|
|
||||||
alphabetical order.
|
|
||||||
|
|
||||||
* Do not use assignments inside expressions.
|
|
||||||
|
|
||||||
* Use uppercase for `@const` variables.
|
|
||||||
|
|
||||||
### Configure your editor
|
|
||||||
|
|
||||||
If possible, configure your editor to follow the coding conventions of the
|
|
||||||
library. A `.editorconfig` file is included at the root of the repository that
|
|
||||||
can be used to configure whitespace and charset handling in your editor. See
|
|
||||||
that file for a description of the conventions. The [EditorConfig](
|
|
||||||
http://editorconfig.org/#download) site links to plugins for various editors.
|
|
||||||
|
|
||||||
### Pass the integration tests run automatically by the Travis CI system
|
|
||||||
|
|
||||||
The integration tests contain a number of automated checks to ensure that the
|
|
||||||
code follows the OpenLayers style and does not break tests or examples. You
|
|
||||||
can run the integration tests locally using the `ci` target:
|
|
||||||
|
|
||||||
$ make ci
|
|
||||||
|
|
||||||
|
|
||||||
### Address a single issue or add a single item of functionality
|
### Address a single issue or add a single item of functionality
|
||||||
|
|
||||||
Please submit separate pull requests for separate issues. This allows each to
|
Please submit separate pull requests for separate issues. This allows each to
|
||||||
@@ -173,33 +108,3 @@ Occasionally other changes to `master` might mean that your pull request cannot
|
|||||||
be merged automatically. In this case you may need to rebase your branch on a
|
be merged automatically. In this case you may need to rebase your branch on a
|
||||||
more recent `master`, resolve any conflicts, and `git push --force` to update
|
more recent `master`, resolve any conflicts, and `git push --force` to update
|
||||||
your branch so that it can be merged automatically.
|
your branch so that it can be merged automatically.
|
||||||
|
|
||||||
## Building on Windows
|
|
||||||
|
|
||||||
Most developers build on Linux. Building on Windows is possible under Cygwin.
|
|
||||||
When installing Cygwin from https://www.cygwin.com/, include the developer
|
|
||||||
tools to get GNU make.
|
|
||||||
|
|
||||||
First (before npm install), to avoid file permission problems between Windows
|
|
||||||
and Cygwin, edit Cygwin's /etc/fstab file to disable ACLs like this
|
|
||||||
`none /cygdrive cygdrive binary,noacl,posix=0,user 0 0`
|
|
||||||
|
|
||||||
Python is normally installed with Cygwin so need not be installed separately.
|
|
||||||
By default Cygwin will use its own version of Python rather than Window's,
|
|
||||||
so the Python modules should be installed for Cygwin's Python.
|
|
||||||
|
|
||||||
The build targets `check-deps`, `serve`, `lint`, `build`, `test`, `check` and
|
|
||||||
`host-examples` described above should all work. `host-examples` takes quite a
|
|
||||||
while to run. If a target does not run properly first time, try it again.
|
|
||||||
|
|
||||||
Currently, Firefox fails to run http://localhost:3000/build/examples
|
|
||||||
from make serve, but Chrome and Internet Explorer will.
|
|
||||||
|
|
||||||
Microsoft Visual Studio's javascript debugger may be used to debug the
|
|
||||||
build/hosted/your-branch/examples. It will be convenient to set
|
|
||||||
build/hosted/your-branch/examples/index.html as the startup page.
|
|
||||||
|
|
||||||
Your OpenLayers source tree need not be under the Cygwin root.
|
|
||||||
if you checkout to c:/openlayers then you can build under Cygwin at /cygdrive/c/openlayers .
|
|
||||||
However, keep the path to the OpenLayers files short otherwise you may see
|
|
||||||
`ENAMETOOLONG` errors.
|
|
||||||
|
|||||||
@@ -15,103 +15,32 @@ pull requests will not be merged.
|
|||||||
|
|
||||||
The minimum requirements are:
|
The minimum requirements are:
|
||||||
|
|
||||||
* GNU Make
|
|
||||||
* Git
|
* Git
|
||||||
* [Node.js](http://nodejs.org/) (version 8 and above)
|
* [Node.js](http://nodejs.org/) (version 8 and above)
|
||||||
* Python 2.6 or 2.7
|
|
||||||
* Java 7 (JRE and JDK)
|
|
||||||
|
|
||||||
The executables `git`, `node`, and `java` should be in your `PATH`.
|
The executables `git` and `node` should be in your `PATH`.
|
||||||
|
|
||||||
You can check your configuration by running:
|
|
||||||
|
|
||||||
$ make check-deps
|
|
||||||
|
|
||||||
To install the Node.js dependencies run
|
To install the Node.js dependencies run
|
||||||
|
|
||||||
$ npm install
|
$ npm install
|
||||||
|
|
||||||
## Working with the build tool
|
|
||||||
|
|
||||||
As an OpenLayers developer you will use `make` to run build targets defined in the
|
|
||||||
`Makefile` located at the root of the repository. The `Makefile` includes
|
|
||||||
targets for running the linter, the compiler, the tests, etc.
|
|
||||||
|
|
||||||
The usage of `make` is as follows:
|
|
||||||
|
|
||||||
$ make <target>
|
|
||||||
|
|
||||||
where `<target>` is the name of the build target you want to execute. For
|
|
||||||
example:
|
|
||||||
|
|
||||||
$ make test
|
|
||||||
|
|
||||||
The main build targets are `serve`, `lint`, `build`, `test`, and `check`. The
|
|
||||||
latter is a meta-target that basically runs `lint`, `build`, and `test`.
|
|
||||||
|
|
||||||
The `serve` target starts a node-based web server, which we will refer to as the *dev server*. You'll need to start that server for running the examples and the tests in a browser. More information on that further down.
|
|
||||||
|
|
||||||
Other targets include `apidoc` and `ci`. The latter is the target used on Travis CI. See OpenLayers's [Travis configuration file](https://github.com/openlayers/openlayers/blob/master/.travis.yml).
|
|
||||||
|
|
||||||
## Running the `check` target
|
|
||||||
|
|
||||||
The `check` target is to be run before pushing code to GitHub and opening pull
|
|
||||||
requests. Branches that don't pass `check` won't pass the integration tests,
|
|
||||||
and have therefore no chance of being merged into `master`.
|
|
||||||
|
|
||||||
To run the `check` target:
|
|
||||||
|
|
||||||
$ make check
|
|
||||||
|
|
||||||
If you want to run the full suite of integration tests, see "Running the integration
|
|
||||||
tests" below.
|
|
||||||
|
|
||||||
## Running examples
|
## Running examples
|
||||||
|
|
||||||
To run the examples you first need to start the dev server:
|
To run the examples you first need to start the dev server:
|
||||||
|
|
||||||
$ make serve
|
$ npm run serve-examples
|
||||||
|
|
||||||
Then, just point your browser <http://localhost:3000/build/examples> in your browser. For example <http://localhost:3000/build/examples/side-by-side.html>.
|
Then, load <http://localhost:5000/> in your browser.
|
||||||
|
|
||||||
Run examples against the `ol.js` standalone build:
|
|
||||||
|
|
||||||
The examples can also be run against the `ol.js` standalone build, just like
|
|
||||||
the examples [hosted](https://openlayers.org/en/master/examples/) on GitHub.
|
|
||||||
Start by executing the `host-examples` build target:
|
|
||||||
|
|
||||||
$ make host-examples
|
|
||||||
|
|
||||||
After running `host-examples` you can now open the examples index page in the browser: <http://localhost:3000/build/hosted/master/examples/>. (This assumes that you still have the dev server running.)
|
|
||||||
|
|
||||||
Append `?mode=raw` to make the example work in full debug mode. In raw mode the OpenLayers and Closure Library scripts are loaded individually by the Closure Library's `base.js` script (which the example page loads and executes before any other script).
|
|
||||||
|
|
||||||
## Running tests
|
## Running tests
|
||||||
|
|
||||||
To run the tests in a browser start the dev server (`make serve`) and open <http://localhost:3000/test/index.html> in the browser.
|
To run the tests once:
|
||||||
|
|
||||||
To run the tests on the console (headless testing with PhantomJS) use the `test` target:
|
$ npm test
|
||||||
|
|
||||||
$ make test
|
To run the tests continuously during development:
|
||||||
|
|
||||||
See also the test-specific [README](../master/test/README.md).
|
$ npm run karma
|
||||||
|
|
||||||
## Running the integration tests
|
|
||||||
|
|
||||||
When you submit a pull request the [Travis continuous integration
|
|
||||||
server](https://travis-ci.org/) will run a full suite of tests, including
|
|
||||||
building all versions of the library and checking that all of the examples
|
|
||||||
work. You will receive an email with the results, and the status will be
|
|
||||||
displayed in the pull request.
|
|
||||||
|
|
||||||
To run the full suite of integration tests use the `ci` target:
|
|
||||||
|
|
||||||
$ make ci
|
|
||||||
|
|
||||||
Running the full suite of integration tests currently takes 5-10 minutes.
|
|
||||||
|
|
||||||
This makes sure that your commit won't break the build. It also runs JSDoc3 to
|
|
||||||
make sure that there are no invalid API doc directives.
|
|
||||||
|
|
||||||
## Adding examples
|
## Adding examples
|
||||||
|
|
||||||
@@ -123,14 +52,3 @@ implies creating two or three files in this directory, an `.html` file, a `.js`
|
|||||||
file, and, optionally, a `.css` file.
|
file, and, optionally, a `.css` file.
|
||||||
|
|
||||||
You can use `simple.js` and `simple.html` as templates for new examples.
|
You can use `simple.js` and `simple.html` as templates for new examples.
|
||||||
|
|
||||||
### Use of the `goog` namespace in examples
|
|
||||||
|
|
||||||
Short story: the OpenLayers examples should not use the `goog` namespace, except
|
|
||||||
for `goog.require`.
|
|
||||||
|
|
||||||
Longer story: we want that the OpenLayers examples work in multiple modes, with the
|
|
||||||
standalone lib (which has implications of the symbols and properties we
|
|
||||||
export), and compiled together with the OpenLayers library.
|
|
||||||
|
|
||||||
Compiling the examples together with the library makes it mandatory to declare dependencies with `goog.require` statements.
|
|
||||||
|
|||||||
275
Makefile
275
Makefile
@@ -1,280 +1,13 @@
|
|||||||
OS := $(shell uname)
|
|
||||||
BRANCH := $(shell git rev-parse --abbrev-ref HEAD)
|
|
||||||
|
|
||||||
SRC_GLSL := $(shell find src -type f -name '*.glsl')
|
SRC_GLSL := $(shell find src -type f -name '*.glsl')
|
||||||
SRC_SHADER_JS := $(patsubst %shader.glsl,%shader.js,$(SRC_GLSL))
|
SRC_SHADER_JS := $(patsubst %shader.glsl,%shader.js,$(SRC_GLSL))
|
||||||
SRC_SHADERLOCATIONS_JS := $(patsubst %shader.glsl,%shader/locations.js,$(SRC_GLSL))
|
SRC_SHADERLOCATIONS_JS := $(patsubst %shader.glsl,%shader/Locations.js,$(SRC_GLSL))
|
||||||
SRC_JS := $(filter-out $(SRC_SHADER_JS) $(SRC_SHADERLOCATIONS_JS),$(shell find src -name '*.js'))
|
|
||||||
SRC_JSDOC = $(shell find src -type f -name '*.jsdoc')
|
|
||||||
|
|
||||||
EXAMPLES := $(shell find examples -type f)
|
|
||||||
EXAMPLES_HTML := $(filter-out examples/index.html,$(shell find examples -maxdepth 1 -type f -name '*.html'))
|
|
||||||
EXAMPLES_JS := $(patsubst %.html,%.js,$(EXAMPLES_HTML))
|
|
||||||
|
|
||||||
BUILD_EXAMPLES := $(subst examples,build/examples,$(EXAMPLES)) build/examples/index.js
|
|
||||||
|
|
||||||
BUILD_HOSTED := build/hosted/$(BRANCH)
|
|
||||||
BUILD_HOSTED_EXAMPLES := $(addprefix $(BUILD_HOSTED)/,$(EXAMPLES))
|
|
||||||
BUILD_HOSTED_EXAMPLES_JS := $(addprefix $(BUILD_HOSTED)/,$(EXAMPLES_JS))
|
|
||||||
|
|
||||||
UNPHANTOMABLE_EXAMPLES = examples/shaded-relief.html examples/raster.html examples/region-growing.html examples/color-manipulation.html
|
|
||||||
CHECK_EXAMPLE_TIMESTAMPS = $(patsubst examples/%.html,build/timestamps/check-%-timestamp,$(filter-out $(UNPHANTOMABLE_EXAMPLES),$(EXAMPLES_HTML)))
|
|
||||||
|
|
||||||
TASKS_JS := $(shell find tasks -name '*.js')
|
|
||||||
|
|
||||||
ifeq (CYGWIN,$(findstring CYGWIN,$(OS)))
|
|
||||||
CLOSURE_LIB = $(shell cygpath -u $(shell node -e 'process.stdout.write(require("closure-util").getLibraryPath())'))
|
|
||||||
else
|
|
||||||
CLOSURE_LIB = $(shell node -e 'process.stdout.write(require("closure-util").getLibraryPath())')
|
|
||||||
endif
|
|
||||||
|
|
||||||
ifeq ($(OS),Darwin)
|
|
||||||
STAT_COMPRESSED = stat -f ' compressed: %z bytes'
|
|
||||||
STAT_UNCOMPRESSED = stat -f 'uncompressed: %z bytes'
|
|
||||||
else
|
|
||||||
STAT_COMPRESSED = stat -c ' compressed: %s bytes'
|
|
||||||
STAT_UNCOMPRESSED = stat -c 'uncompressed: %s bytes'
|
|
||||||
endif
|
|
||||||
|
|
||||||
.PHONY: default
|
|
||||||
default: help
|
|
||||||
|
|
||||||
.PHONY: help
|
|
||||||
help:
|
|
||||||
@echo
|
|
||||||
@echo "The most common targets are:"
|
|
||||||
@echo
|
|
||||||
@echo "- install Install node dependencies"
|
|
||||||
@echo "- serve Start dev server for running examples and tests"
|
|
||||||
@echo "- test Run unit tests in the console"
|
|
||||||
@echo "- check Perform a number of checks on the code"
|
|
||||||
@echo "- clean Remove generated files"
|
|
||||||
@echo "- help Display this help message"
|
|
||||||
@echo
|
|
||||||
@echo "Other less frequently used targets are:"
|
|
||||||
@echo
|
|
||||||
@echo "- build Build ol.js, ol-debug.js, ol.js.map and ol.css"
|
|
||||||
@echo "- ci Run the full continuous integration process"
|
|
||||||
@echo "- apidoc Build the API documentation using JSDoc"
|
|
||||||
@echo "- cleanall Remove all the build artefacts"
|
|
||||||
@echo "- check-deps Check if the required dependencies are installed"
|
|
||||||
@echo
|
|
||||||
|
|
||||||
.PHONY: apidoc
|
|
||||||
apidoc: build/timestamps/jsdoc-$(BRANCH)-timestamp
|
|
||||||
|
|
||||||
.PHONY: build
|
|
||||||
build: build/ol.css build/ol.js build/ol-debug.js build/ol.js.map
|
|
||||||
|
|
||||||
.PHONY: check
|
|
||||||
check: build/ol.js test
|
|
||||||
|
|
||||||
.PHONY: check-examples
|
|
||||||
check-examples: $(CHECK_EXAMPLE_TIMESTAMPS)
|
|
||||||
|
|
||||||
.PHONY: check-deps
|
|
||||||
check-deps: EXECUTABLES = git node python java
|
|
||||||
check-deps:
|
|
||||||
@for exe in $(EXECUTABLES) ;\
|
|
||||||
do \
|
|
||||||
which $${exe} > /dev/null && \
|
|
||||||
echo "Program $${exe} OK" || \
|
|
||||||
echo "Program $${exe} MISSING!" ;\
|
|
||||||
done ;\
|
|
||||||
|
|
||||||
.PHONY: ci
|
|
||||||
ci: build test package compile-examples check-examples apidoc
|
|
||||||
|
|
||||||
.PHONY: compile-examples
|
|
||||||
compile-examples: build/compiled-examples/all.combined.js
|
|
||||||
|
|
||||||
.PHONY: clean
|
|
||||||
clean:
|
|
||||||
rm -f build/timestamps/check-*-timestamp
|
|
||||||
rm -f build/ol.css
|
|
||||||
rm -f build/ol.js
|
|
||||||
rm -f build/ol.js.map
|
|
||||||
rm -f build/ol-debug.js
|
|
||||||
rm -rf build/examples
|
|
||||||
rm -rf build/compiled-examples
|
|
||||||
rm -rf build/package
|
|
||||||
rm -rf $(BUILD_HOSTED)
|
|
||||||
|
|
||||||
.PHONY: cleanall
|
|
||||||
cleanall:
|
|
||||||
rm -rf build
|
|
||||||
|
|
||||||
.PHONY: css
|
|
||||||
css: build/ol.css
|
|
||||||
|
|
||||||
.PHONY: examples
|
|
||||||
examples: $(BUILD_EXAMPLES)
|
|
||||||
|
|
||||||
.PHONY: install
|
|
||||||
install: build/timestamps/node-modules-timestamp
|
|
||||||
|
|
||||||
.PHONY: npm-install
|
|
||||||
npm-install: build/timestamps/node-modules-timestamp
|
|
||||||
|
|
||||||
.PHONY: shaders
|
.PHONY: shaders
|
||||||
shaders: $(SRC_SHADER_JS $(SRC_SHADERLOCATIONS_JS)
|
shaders: $(SRC_SHADER_JS) $(SRC_SHADERLOCATIONS_JS)
|
||||||
|
|
||||||
.PHONY: serve
|
%shader.js: %shader.glsl src/ol/webgl/shader.mustache tasks/glslunit.js
|
||||||
serve:
|
|
||||||
node tasks/serve.js
|
|
||||||
|
|
||||||
.PHONY: test
|
|
||||||
test: build/timestamps/node-modules-timestamp
|
|
||||||
npm test
|
|
||||||
|
|
||||||
.PHONY: host-examples
|
|
||||||
host-examples: $(BUILD_HOSTED_EXAMPLES) \
|
|
||||||
$(BUILD_HOSTED)/build/ol.js \
|
|
||||||
$(BUILD_HOSTED)/build/ol-debug.js \
|
|
||||||
$(BUILD_HOSTED)/css/ol.css \
|
|
||||||
$(BUILD_HOSTED)/examples/loader.js \
|
|
||||||
$(BUILD_HOSTED)/examples/index.js \
|
|
||||||
$(BUILD_HOSTED)/build/ol-deps.js
|
|
||||||
|
|
||||||
.PHONY: host-libraries
|
|
||||||
host-libraries: build/timestamps/node-modules-timestamp
|
|
||||||
@rm -rf $(BUILD_HOSTED)/closure-library
|
|
||||||
@mkdir -p $(BUILD_HOSTED)/closure-library
|
|
||||||
@cp -r $(CLOSURE_LIB)/* $(BUILD_HOSTED)/closure-library/
|
|
||||||
@rm -rf $(BUILD_HOSTED)/ol/ol
|
|
||||||
@mkdir -p $(BUILD_HOSTED)/ol/ol
|
|
||||||
@cp -r src/ol/* $(BUILD_HOSTED)/ol/ol/
|
|
||||||
@rm -rf $(BUILD_HOSTED)/ol.ext
|
|
||||||
@mkdir -p $(BUILD_HOSTED)/ol.ext
|
|
||||||
@cp -r build/ol.ext/* $(BUILD_HOSTED)/ol.ext/
|
|
||||||
|
|
||||||
$(BUILD_EXAMPLES): $(EXAMPLES) package.json
|
|
||||||
@mkdir -p $(@D)
|
|
||||||
@node tasks/build-examples.js
|
|
||||||
|
|
||||||
build/timestamps/check-%-timestamp: $(BUILD_HOSTED)/examples/%.html \
|
|
||||||
$(BUILD_HOSTED)/examples/%.js \
|
|
||||||
$(filter $(BUILD_HOSTED)/examples/resources/%,$(BUILD_HOSTED_EXAMPLES)) \
|
|
||||||
$(filter $(BUILD_HOSTED)/examples/data/%,$(BUILD_HOSTED_EXAMPLES)) \
|
|
||||||
$(BUILD_HOSTED)/examples/loader.js \
|
|
||||||
$(BUILD_HOSTED)/build/ol.js \
|
|
||||||
$(BUILD_HOSTED)/css/ol.css
|
|
||||||
@mkdir -p $(@D)
|
|
||||||
node tasks/check-example.js $<
|
|
||||||
@touch $@
|
|
||||||
|
|
||||||
build/compiled-examples/all.js: $(EXAMPLES_JS)
|
|
||||||
@mkdir -p $(@D)
|
|
||||||
@python bin/combine-examples.py $^ > $@
|
|
||||||
|
|
||||||
build/compiled-examples/all.combined.js: config/examples-all.json build/compiled-examples/all.js \
|
|
||||||
$(SRC_JS) $(SRC_SHADER_JS) $(SRC_SHADERLOCATIONS_JS) \
|
|
||||||
build/timestamps/node-modules-timestamp
|
|
||||||
@mkdir -p $(@D)
|
|
||||||
node tasks/build.js $< $@
|
|
||||||
|
|
||||||
build/compiled-examples/%.json: config/example.json build/examples/%.js \
|
|
||||||
build/timestamps/node-modules-timestamp
|
|
||||||
@mkdir -p $(@D)
|
|
||||||
@sed -e 's|{{id}}|$*|' $< > $@
|
|
||||||
|
|
||||||
build/compiled-examples/%.combined.js: build/compiled-examples/%.json \
|
|
||||||
$(SRC_JS) $(SRC_SHADER_JS) $(SRC_SHADERLOCATIONS_JS)\
|
|
||||||
build/timestamps/node-modules-timestamp
|
|
||||||
@mkdir -p $(@D)
|
|
||||||
node tasks/build.js $< $@
|
|
||||||
|
|
||||||
build/timestamps/jsdoc-$(BRANCH)-timestamp: config/jsdoc/api/index.md \
|
|
||||||
config/jsdoc/api/conf.json $(SRC_JS) \
|
|
||||||
$(SRC_SHADER_JS) $(SRC_SHADERLOCATIONS_JS) \
|
|
||||||
$(shell find config/jsdoc/api/template -type f) \
|
|
||||||
build/timestamps/node-modules-timestamp
|
|
||||||
@mkdir -p $(@D)
|
|
||||||
@rm -rf $(BUILD_HOSTED)/apidoc
|
|
||||||
./node_modules/.bin/jsdoc config/jsdoc/api/index.md -c config/jsdoc/api/conf.json --package package.json -d $(BUILD_HOSTED)/apidoc
|
|
||||||
@touch $@
|
|
||||||
|
|
||||||
$(BUILD_HOSTED_EXAMPLES_JS): $(BUILD_HOSTED)/examples/%.js: build/examples/%.js
|
|
||||||
@mkdir -p $(@D)
|
|
||||||
@python bin/split-example.py $< $(@D)
|
|
||||||
|
|
||||||
$(BUILD_HOSTED)/examples/loader.js: bin/loader_hosted_examples.js
|
|
||||||
@mkdir -p $(@D)
|
|
||||||
@cp $< $@
|
|
||||||
|
|
||||||
$(BUILD_HOSTED)/examples/%: build/examples/%
|
|
||||||
@mkdir -p $(@D)
|
|
||||||
@cp $< $@
|
|
||||||
|
|
||||||
$(BUILD_HOSTED)/build/ol.js: build/ol.js
|
|
||||||
@mkdir -p $(@D)
|
|
||||||
@cp $< $@
|
|
||||||
|
|
||||||
$(BUILD_HOSTED)/build/ol-debug.js: build/ol-debug.js
|
|
||||||
@mkdir -p $(@D)
|
|
||||||
@cp $< $@
|
|
||||||
|
|
||||||
$(BUILD_HOSTED)/css/ol.css: build/ol.css
|
|
||||||
@mkdir -p $(@D)
|
|
||||||
@cp $< $@
|
|
||||||
|
|
||||||
$(BUILD_HOSTED)/build/ol-deps.js: host-libraries
|
|
||||||
@mkdir -p $(@D)
|
|
||||||
@python $(CLOSURE_LIB)/closure/bin/build/depswriter.py \
|
|
||||||
--root_with_prefix "src ../../../ol" \
|
|
||||||
--root_with_prefix "build/ol.ext ../../../ol.ext" \
|
|
||||||
--root $(BUILD_HOSTED)/closure-library/closure/goog \
|
|
||||||
--root_with_prefix "$(BUILD_HOSTED)/closure-library/third_party ../../third_party" \
|
|
||||||
--output_file $@
|
|
||||||
|
|
||||||
build/timestamps/node-modules-timestamp: package.json
|
|
||||||
@mkdir -p $(@D)
|
|
||||||
npm install
|
|
||||||
@touch $@
|
|
||||||
|
|
||||||
build/ol.css: css/ol.css build/timestamps/node-modules-timestamp
|
|
||||||
@mkdir -p $(@D)
|
|
||||||
@echo "Running cleancss..."
|
|
||||||
@./node_modules/.bin/cleancss $< > $@
|
|
||||||
|
|
||||||
build/ol.js: config/ol.json $(SRC_JS) $(SRC_SHADER_JS) $(SRC_SHADERLOCATIONS_JS) \
|
|
||||||
build/timestamps/node-modules-timestamp
|
|
||||||
@mkdir -p $(@D)
|
|
||||||
node tasks/build.js $< $@
|
|
||||||
@$(STAT_UNCOMPRESSED) $@
|
|
||||||
@cp $@ /tmp/
|
|
||||||
@gzip /tmp/ol.js
|
|
||||||
@$(STAT_COMPRESSED) /tmp/ol.js.gz
|
|
||||||
@rm /tmp/ol.js.gz
|
|
||||||
|
|
||||||
build/ol.js.map: config/ol.json $(SRC_JS) $(SRC_SHADER_JS) $(SRC_SHADERLOCATIONS_JS) \
|
|
||||||
build/timestamps/node-modules-timestamp
|
|
||||||
@mkdir -p $(@D)
|
|
||||||
node tasks/build.js $< $@
|
|
||||||
|
|
||||||
build/ol-debug.js: config/ol-debug.json $(SRC_JS) $(SRC_SHADER_JS) $(SRC_SHADERLOCATIONS_JS) \
|
|
||||||
build/timestamps/node-modules-timestamp
|
|
||||||
@mkdir -p $(@D)
|
|
||||||
node tasks/build.js $< $@
|
|
||||||
@$(STAT_UNCOMPRESSED) $@
|
|
||||||
@cp $@ /tmp/
|
|
||||||
@gzip /tmp/ol-debug.js
|
|
||||||
@$(STAT_COMPRESSED) /tmp/ol-debug.js.gz
|
|
||||||
@rm /tmp/ol-debug.js.gz
|
|
||||||
|
|
||||||
%shader.js: %shader.glsl src/ol/webgl/shader.mustache tasks/glslunit.js build/timestamps/node-modules-timestamp
|
|
||||||
@node tasks/glslunit.js --input $< | ./node_modules/.bin/mustache - src/ol/webgl/shader.mustache > $@
|
@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 build/timestamps/node-modules-timestamp
|
%shader/Locations.js: %shader.glsl src/ol/webgl/shaderlocations.mustache tasks/glslunit.js
|
||||||
@mkdir -p $(@D)
|
@mkdir -p $(@D)
|
||||||
@node tasks/glslunit.js --input $< | ./node_modules/.bin/mustache - src/ol/webgl/shaderlocations.mustache > $@
|
@node tasks/glslunit.js --input $< | ./node_modules/.bin/mustache - src/ol/webgl/shaderlocations.mustache > $@
|
||||||
|
|
||||||
.PHONY: package
|
|
||||||
package:
|
|
||||||
@rm -rf build/package
|
|
||||||
@cp -r package build
|
|
||||||
@cd ./src && cp -r ol/* ../build/package
|
|
||||||
@rm build/package/typedefs.js
|
|
||||||
@cp css/ol.css build/package
|
|
||||||
./node_modules/.bin/jscodeshift --transform transforms/module.js build/package
|
|
||||||
npm run lint-package
|
|
||||||
|
|||||||
@@ -4,6 +4,7 @@
|
|||||||
[](https://greenkeeper.io/)
|
[](https://greenkeeper.io/)
|
||||||
[](https://coveralls.io/github/openlayers/openlayers?branch=master)
|
[](https://coveralls.io/github/openlayers/openlayers?branch=master)
|
||||||
[](http://osgeo.org/)
|
[](http://osgeo.org/)
|
||||||
|
[](https://www.jsdelivr.com/package/npm/openlayers)
|
||||||
|
|
||||||
[OpenLayers](https://openlayers.org/) is a high-performance, feature-packed library for creating interactive maps on the web. It can display map tiles, vector data and markers loaded from any source on any web page. OpenLayers has been developed to further the use of geographic information of all kinds. It is completely free, Open Source JavaScript, released under the 2-clause BSD License (also known as the FreeBSD).
|
[OpenLayers](https://openlayers.org/) is a high-performance, feature-packed library for creating interactive maps on the web. It can display map tiles, vector data and markers loaded from any source on any web page. OpenLayers has been developed to further the use of geographic information of all kinds. It is completely free, Open Source JavaScript, released under the 2-clause BSD License (also known as the FreeBSD).
|
||||||
|
|
||||||
@@ -18,8 +19,6 @@ Use one of the following methods to use OpenLayers in your project:
|
|||||||
|
|
||||||
* If you just want to add a `<script>` tag to test things out, you can link directly to one of the full builds from [cdnjs](https://cdnjs.com/libraries/openlayers) (not recommended for production)
|
* If you just want to add a `<script>` tag to test things out, you can link directly to one of the full builds from [cdnjs](https://cdnjs.com/libraries/openlayers) (not recommended for production)
|
||||||
|
|
||||||
* For use with Closure Library (rare), install the [`openlayers` package](https://npmjs.com/package/openlayers) and read the [tutorial](http://openlayers.org/en/latest/doc/tutorials/closure.html).
|
|
||||||
|
|
||||||
## Supported Browsers
|
## Supported Browsers
|
||||||
|
|
||||||
OpenLayers runs on all modern browsers that support [HTML5](https://html.spec.whatwg.org/multipage/) and [ECMAScript 5](http://www.ecma-international.org/ecma-262/5.1/). This includes Chrome, Firefox, Safari and Edge. For older browsers and platforms like Internet Explorer (down to version 9) and Android 4.x, [polyfills](http://polyfill.io) for `requestAnimationFrame` and `Element.prototype.classList` are required, and using the KML format requires a polyfill for `URL`.
|
OpenLayers runs on all modern browsers that support [HTML5](https://html.spec.whatwg.org/multipage/) and [ECMAScript 5](http://www.ecma-international.org/ecma-262/5.1/). This includes Chrome, Firefox, Safari and Edge. For older browsers and platforms like Internet Explorer (down to version 9) and Android 4.x, [polyfills](http://polyfill.io) for `requestAnimationFrame` and `Element.prototype.classList` are required, and using the KML format requires a polyfill for `URL`.
|
||||||
|
|||||||
@@ -1,33 +0,0 @@
|
|||||||
//
|
|
||||||
// A PhantomJS script used to check that the hosted examples load
|
|
||||||
// without errors. This script is executed by the build tool's
|
|
||||||
// check-examples target.
|
|
||||||
//
|
|
||||||
var args = require('system').args;
|
|
||||||
if (args.length != 2) {
|
|
||||||
phantom.exit(2);
|
|
||||||
}
|
|
||||||
var examplePath = args[1];
|
|
||||||
var page = require('webpage').create();
|
|
||||||
page.onError = function(msg, trace) {
|
|
||||||
var msgStack = ['JavaScript ERROR: ' + msg];
|
|
||||||
if (trace) {
|
|
||||||
msgStack.push('TRACE:');
|
|
||||||
trace.forEach(function(t) {
|
|
||||||
msgStack.push(' -> ' + t.file + ': ' + t.line + (t.function ? ' (in function "' + t.function + '")' : ''));
|
|
||||||
});
|
|
||||||
}
|
|
||||||
console.error(msgStack.join('\n'));
|
|
||||||
phantom.exit(1);
|
|
||||||
};
|
|
||||||
page.open(examplePath, function(s) {
|
|
||||||
var exitCode = 0;
|
|
||||||
if (s != 'success') {
|
|
||||||
exitCode = 1;
|
|
||||||
console.error('PAGE LOAD ERROR');
|
|
||||||
}
|
|
||||||
phantom.exit(exitCode);
|
|
||||||
});
|
|
||||||
page.onConsoleMessage = function(msg) {
|
|
||||||
console.log('console:', msg);
|
|
||||||
};
|
|
||||||
@@ -1,27 +0,0 @@
|
|||||||
#!/usr/bin/python
|
|
||||||
|
|
||||||
import re
|
|
||||||
import sys
|
|
||||||
|
|
||||||
|
|
||||||
def main(argv):
|
|
||||||
examples = {}
|
|
||||||
requires = set()
|
|
||||||
for filename in argv[1:]:
|
|
||||||
lines = open(filename, 'rU').readlines()
|
|
||||||
if len(lines) > 0 and lines[0].startswith('// NOCOMPILE'):
|
|
||||||
continue
|
|
||||||
requires.update(line for line in lines if line.startswith('goog.require'))
|
|
||||||
examples[filename] = [line for line in lines if not line.startswith('goog.require')]
|
|
||||||
for require in sorted(requires):
|
|
||||||
sys.stdout.write(require)
|
|
||||||
for filename in sorted(examples.keys()):
|
|
||||||
sys.stdout.write('// ' + filename + '\n')
|
|
||||||
sys.stdout.write('(function(){\n')
|
|
||||||
for line in examples[filename]:
|
|
||||||
sys.stdout.write(line)
|
|
||||||
sys.stdout.write('})();\n')
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
|
||||||
sys.exit(main(sys.argv))
|
|
||||||
@@ -1,180 +0,0 @@
|
|||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* This script is supposed to be executed via phantomjs. It will generate
|
|
||||||
* screenshots of the html files in the directory specified by a commandline
|
|
||||||
* option when these files are served through a webserver which can also be
|
|
||||||
* specified. The screenshots will be in the current working directory.
|
|
||||||
*
|
|
||||||
* Example usage:
|
|
||||||
*
|
|
||||||
* user@host:~/openlayers/bin $ phantomjs example-screenshot.js \
|
|
||||||
* http://localhost:8000/openlayers/examples/ \
|
|
||||||
* ../examples
|
|
||||||
*
|
|
||||||
* The above command will generate `*.png` files in `examples/` for all html
|
|
||||||
* files that are served through `http://localhost:8000/openlayers/examples/`.
|
|
||||||
*
|
|
||||||
* So if there is a file `my-humpty-example.html` inside of the relative folder
|
|
||||||
* `../examples/` which is being served through the webserver so that
|
|
||||||
* `http://localhost:8000/openlayers/examples/my-humpty-example.html` is a valid and
|
|
||||||
* reachable URL, this script will generate a screenshot and store it as
|
|
||||||
* `my-humpty-example.html.png`.
|
|
||||||
*
|
|
||||||
* The query string `?mode=raw` will be appended to the generated URL.
|
|
||||||
*
|
|
||||||
* Known limitations:
|
|
||||||
*
|
|
||||||
* As phantomjs doesn't support WebGL (see e.g.
|
|
||||||
* https://github.com/ariya/phantomjs/wiki/Supported-Web-Standards and
|
|
||||||
* http://code.google.com/p/phantomjs/issues/detail?id=273) This won't render
|
|
||||||
* OpenLayers maps rendered through the webglrenderer.
|
|
||||||
*
|
|
||||||
* In parts based upon this gist: https://gist.github.com/crazy4groovy/3160121
|
|
||||||
*/
|
|
||||||
(function() { // global closure
|
|
||||||
|
|
||||||
var page = require('webpage').create(), // imports
|
|
||||||
fs = require('fs'),
|
|
||||||
system = require('system'),
|
|
||||||
// arguments
|
|
||||||
baseExamplesUrl = system.args[1],
|
|
||||||
exampleDir = system.args[2],
|
|
||||||
// various settings
|
|
||||||
ignoreFiles = [
|
|
||||||
'index.html'
|
|
||||||
],
|
|
||||||
intervalMillisecs = 25,
|
|
||||||
renderMillisecs = 2000,
|
|
||||||
// basic variables
|
|
||||||
curDir = fs.workingDirectory,
|
|
||||||
exampleDirList = fs.list(exampleDir),
|
|
||||||
pageindex = 0,
|
|
||||||
fileName = '',
|
|
||||||
htmlFiles = [],
|
|
||||||
lenHtmlFiles = 0,
|
|
||||||
loadInProgress = false;
|
|
||||||
|
|
||||||
// simple object with helper functions
|
|
||||||
var util = {
|
|
||||||
/**
|
|
||||||
* Returns the basename of a file given a path.
|
|
||||||
*/
|
|
||||||
baseName: function(path) {
|
|
||||||
var parts = path.split(fs.separator);
|
|
||||||
return parts[parts.length - 1];
|
|
||||||
},
|
|
||||||
/**
|
|
||||||
* Super basic test whether a file can be considered a HTML-file.
|
|
||||||
*/
|
|
||||||
isHtmlFile: function(filename) {
|
|
||||||
return (/\.html?$/).test(filename);
|
|
||||||
},
|
|
||||||
/**
|
|
||||||
* Appends a slash to given string if it isn't there already.
|
|
||||||
*/
|
|
||||||
appendSlash: function(str) {
|
|
||||||
return ((/\/$/).test(str)) ? str : str + '/';
|
|
||||||
},
|
|
||||||
/**
|
|
||||||
* Generates an URL out of given baseurl and path.
|
|
||||||
*/
|
|
||||||
buildUrl: function(baseurl, path) {
|
|
||||||
var name = util.baseName(path),
|
|
||||||
mode = 'raw';
|
|
||||||
return util.appendSlash(baseurl) + name + '?mode=' + mode;
|
|
||||||
},
|
|
||||||
/**
|
|
||||||
* Simple progressbar logger that uses our globals pageindex & lenHtmlFiles.
|
|
||||||
*/
|
|
||||||
logProgress: function() {
|
|
||||||
var doneSymbol = '-',
|
|
||||||
todoSymbol = ' ',
|
|
||||||
currentSymbol = '>',
|
|
||||||
barStrLeft = '[',
|
|
||||||
barStrRight = ']',
|
|
||||||
progresStep = 5, // one doneSymbol equals this percentage
|
|
||||||
totalSteps = Math.round(100 / progresStep),
|
|
||||||
ratio = (lenHtmlFiles === 0) ? 0 : (pageindex / lenHtmlFiles),
|
|
||||||
percent = (ratio === 0) ? 0 : ratio * 100,
|
|
||||||
normalizedNumDone = Math.floor(ratio * totalSteps),
|
|
||||||
normalizedNumTodo = totalSteps - normalizedNumDone,
|
|
||||||
progressLine = '',
|
|
||||||
i = 0;
|
|
||||||
// the progress bar
|
|
||||||
progressLine += barStrLeft;
|
|
||||||
for (; i < normalizedNumDone; i++) {
|
|
||||||
progressLine += doneSymbol;
|
|
||||||
}
|
|
||||||
for (i = 0; i < normalizedNumTodo; i++) {
|
|
||||||
progressLine += (i === 0) ? currentSymbol : todoSymbol;
|
|
||||||
}
|
|
||||||
progressLine += barStrRight;
|
|
||||||
// the percentage information
|
|
||||||
// pad if necessary
|
|
||||||
if (percent < 10) {
|
|
||||||
progressLine += ' ';
|
|
||||||
} else if (percent < 100) {
|
|
||||||
progressLine += ' ';
|
|
||||||
}
|
|
||||||
progressLine += ' ' + percent.toFixed(1) + ' % done';
|
|
||||||
// additional information
|
|
||||||
if (fileName !== '') {
|
|
||||||
progressLine += ', ' + util.baseName(fileName) + '';
|
|
||||||
}
|
|
||||||
console.log(progressLine);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
// iterate over all files in examples directory
|
|
||||||
// and find the HTML files.
|
|
||||||
for (var i = 0; i < exampleDirList.length; i++) {
|
|
||||||
var fullpath = exampleDir + fs.separator + exampleDirList[i];
|
|
||||||
if (fs.isFile(fullpath) && util.isHtmlFile(fullpath) &&
|
|
||||||
ignoreFiles.indexOf(util.baseName(fullpath)) === -1) {
|
|
||||||
//TODO: make this more async (i.e. pop on/off stack WHILE rending pages)
|
|
||||||
htmlFiles.push(fullpath);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
lenHtmlFiles = htmlFiles.length;
|
|
||||||
|
|
||||||
console.log('Capturing ' + lenHtmlFiles + ' example screenshots.');
|
|
||||||
|
|
||||||
// The main interval function that is executed regularly and renders a
|
|
||||||
// page to a file
|
|
||||||
var interval = setInterval(function() {
|
|
||||||
if (!loadInProgress && pageindex < lenHtmlFiles) {
|
|
||||||
util.logProgress();
|
|
||||||
fileName = htmlFiles[pageindex];
|
|
||||||
page.viewportSize = { width: 800, height: 600 };
|
|
||||||
page.clipRect = {
|
|
||||||
top: 0,
|
|
||||||
left: 0,
|
|
||||||
width: page.viewportSize.width,
|
|
||||||
height: page.viewportSize.height
|
|
||||||
};
|
|
||||||
page.open(util.buildUrl(baseExamplesUrl, htmlFiles[pageindex]));
|
|
||||||
}
|
|
||||||
if (pageindex == lenHtmlFiles) {
|
|
||||||
util.logProgress();
|
|
||||||
console.log(lenHtmlFiles + ' screenshots captured.');
|
|
||||||
phantom.exit();
|
|
||||||
}
|
|
||||||
}, intervalMillisecs);
|
|
||||||
|
|
||||||
// set loadInProgress flag so we only process one image at time.
|
|
||||||
page.onLoadStarted = function() {
|
|
||||||
loadInProgress = true;
|
|
||||||
};
|
|
||||||
|
|
||||||
// When the page is loaded, render it to an image
|
|
||||||
page.onLoadFinished = function() {
|
|
||||||
var dest = exampleDir + fs.separator + util.baseName(fileName) + '.png';
|
|
||||||
window.setTimeout(function() {
|
|
||||||
loadInProgress = false;
|
|
||||||
page.render(dest); // actually render the page.
|
|
||||||
pageindex++;
|
|
||||||
}, renderMillisecs);
|
|
||||||
};
|
|
||||||
|
|
||||||
})(); // eof global closure
|
|
||||||
@@ -1,69 +0,0 @@
|
|||||||
/**
|
|
||||||
* This loader is used for the hosted examples. It is used in place of the
|
|
||||||
* development loader (examples/loader.js).
|
|
||||||
*
|
|
||||||
* The loader loads ol.js and the example's script in "production" mode; it
|
|
||||||
* loads Closure Library's base.js, ol-deps.js, the example's "goog.require"
|
|
||||||
* script, and the example's script in "development" mode.
|
|
||||||
*
|
|
||||||
* The ol.js and ol-deps.js scripts are built using OpenLayers's Makefile. They are
|
|
||||||
* located in the ../build/ directory, relative to this script.
|
|
||||||
*
|
|
||||||
* The script must be named loader.js.
|
|
||||||
*
|
|
||||||
* Usage:
|
|
||||||
*
|
|
||||||
* <script src="../loader.js?id=my-demo"></script>
|
|
||||||
*/
|
|
||||||
|
|
||||||
(function() {
|
|
||||||
|
|
||||||
var i, pair;
|
|
||||||
|
|
||||||
var href = window.location.href, start, end, paramsString, pairs,
|
|
||||||
pageParams = {};
|
|
||||||
if (href.indexOf('?') > 0) {
|
|
||||||
start = href.indexOf('?') + 1;
|
|
||||||
end = href.indexOf('#') > 0 ? href.indexOf('#') : href.length;
|
|
||||||
paramsString = href.substring(start, end);
|
|
||||||
pairs = paramsString.split(/[&;]/);
|
|
||||||
for (i = 0; i < pairs.length; ++i) {
|
|
||||||
pair = pairs[i].split('=');
|
|
||||||
if (pair[0]) {
|
|
||||||
pageParams[decodeURIComponent(pair[0])] =
|
|
||||||
decodeURIComponent(pair[1]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
var scripts = document.getElementsByTagName('script');
|
|
||||||
var src, index, search, chunks, scriptParams = {};
|
|
||||||
for (i = scripts.length - 1; i >= 0; --i) {
|
|
||||||
src = scripts[i].getAttribute('src');
|
|
||||||
if (~(index = src.indexOf('loader.js?'))) {
|
|
||||||
search = src.substr(index + 10);
|
|
||||||
chunks = search ? search.split('&') : [];
|
|
||||||
for (i = chunks.length - 1; i >= 0; --i) {
|
|
||||||
pair = chunks[i].split('=');
|
|
||||||
if (pair[0]) {
|
|
||||||
scriptParams[decodeURIComponent(pair[0])] =
|
|
||||||
decodeURIComponent(pair[1]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
var raw = pageParams.mode && pageParams.mode.toLowerCase() === 'raw';
|
|
||||||
|
|
||||||
var scriptId = encodeURIComponent(scriptParams.id);
|
|
||||||
if (!raw) {
|
|
||||||
document.write('<scr' + 'ipt type="text/javascript" src="../build/ol.js"></scr' + 'ipt>');
|
|
||||||
} else {
|
|
||||||
window.CLOSURE_NO_DEPS = true; // we've got our own deps file
|
|
||||||
document.write('<scr' + 'ipt type="text/javascript" src="../closure-library/closure/goog/base.js"></scr' + 'ipt>');
|
|
||||||
document.write('<scr' + 'ipt type="text/javascript" src="../build/ol-deps.js"></scr' + 'ipt>');
|
|
||||||
document.write('<scr' + 'ipt type="text/javascript" src="' + scriptId + '-require.js"></scr' + 'ipt>');
|
|
||||||
}
|
|
||||||
document.write('<scr' + 'ipt type="text/javascript" src="' + scriptId + '.js"></scr' + 'ipt>');
|
|
||||||
}());
|
|
||||||
@@ -1,39 +0,0 @@
|
|||||||
import os
|
|
||||||
import re
|
|
||||||
import sys
|
|
||||||
|
|
||||||
|
|
||||||
def split_example_file(example, dst_dir):
|
|
||||||
lines = open(example, 'rU').readlines()
|
|
||||||
|
|
||||||
target_lines = []
|
|
||||||
target_require_lines = []
|
|
||||||
|
|
||||||
found_requires = False
|
|
||||||
found_code = False
|
|
||||||
for line in lines:
|
|
||||||
m = re.match(r'goog.require\(\'(.*)\'\);', line)
|
|
||||||
if m:
|
|
||||||
found_requires = True
|
|
||||||
target_require_lines.append(line)
|
|
||||||
elif found_requires:
|
|
||||||
if found_code or line not in ('\n', '\r\n'):
|
|
||||||
found_code = True
|
|
||||||
target_lines.append(line)
|
|
||||||
|
|
||||||
target = open(
|
|
||||||
os.path.join(dst_dir, os.path.basename(example)), 'wb')
|
|
||||||
target_require = open(
|
|
||||||
os.path.join(dst_dir, os.path.basename(example)
|
|
||||||
.replace('.js', '-require.js')),
|
|
||||||
'wb')
|
|
||||||
|
|
||||||
target.writelines(target_lines)
|
|
||||||
target.close()
|
|
||||||
|
|
||||||
target_require.writelines(target_require_lines)
|
|
||||||
target_require.close()
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
|
||||||
split_example_file(*sys.argv[1:])
|
|
||||||
@@ -1,5 +1,164 @@
|
|||||||
## Upgrade notes
|
## Upgrade notes
|
||||||
|
|
||||||
|
### Next release
|
||||||
|
|
||||||
|
#### `transition` option of `ol/source/VectorTile` is ignored
|
||||||
|
|
||||||
|
The `transition` option to get an opacity transition to fade in tiles has been disabled for `ol/source/VectorTile`. Vector tiles are now always rendered without an opacity transition.
|
||||||
|
|
||||||
|
#### `ol/style/Fill` with `CanvasGradient` or `CanvasPattern`
|
||||||
|
|
||||||
|
The origin for gradients and patterns has changed from the top-left corner of the extent of the geometry being filled to 512 css pixel increments from map coordinate `[0, 0]`. This allows repeat patterns to be aligned properly with vector tiles. For seamless repeat patterns, width and height of the pattern image must be a factor of two (2, 4, 8, ..., 512).
|
||||||
|
|
||||||
|
#### Removal of the renderer option for maps
|
||||||
|
|
||||||
|
The `renderer` option has been removed from the `Map` constructor. The purpose of this change is to avoid bundling code in your application that you do not need. Previously, code for both the Canvas and WebGL renderers was included in all applications - even though most people only use one renderer. The `Map` constructor now gives you a Canvas (2D) based renderer. If you want to try the WebGL renderer, you can import the constructor from `ol/WebGLMap`.
|
||||||
|
|
||||||
|
Old code:
|
||||||
|
```js
|
||||||
|
import Map from 'ol/Map';
|
||||||
|
|
||||||
|
const canvasMap = new Map({
|
||||||
|
renderer: ['canvas']
|
||||||
|
// other options...
|
||||||
|
});
|
||||||
|
|
||||||
|
const webglMap = new Map({
|
||||||
|
renderer: ['webgl']
|
||||||
|
// other options...
|
||||||
|
});
|
||||||
|
```
|
||||||
|
|
||||||
|
New code:
|
||||||
|
```js
|
||||||
|
import Map from 'ol/Map';
|
||||||
|
import WebGLMap from 'ol/WebGLMap';
|
||||||
|
|
||||||
|
const canvasMap = new Map({
|
||||||
|
// options...
|
||||||
|
});
|
||||||
|
|
||||||
|
const webglMap = new WebGLMap({
|
||||||
|
// options...
|
||||||
|
});
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Removal of ol.FeatureStyleFunction
|
||||||
|
|
||||||
|
The signature of the vector style function passed to the feature has changed. The function now always takes the `feature` and the `resolution` as arguments, the `feature` is no longer bound to `this`.
|
||||||
|
|
||||||
|
Old code:
|
||||||
|
```js
|
||||||
|
feature.setStyle(function(resolution) {
|
||||||
|
var text = this.get('name');
|
||||||
|
...
|
||||||
|
});
|
||||||
|
```
|
||||||
|
|
||||||
|
New code:
|
||||||
|
```js
|
||||||
|
feature.setStyle(function(feature, resolution) {
|
||||||
|
var text = feature.get('name');
|
||||||
|
...
|
||||||
|
});
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Changed behavior of the `Draw` interaction
|
||||||
|
|
||||||
|
For better drawing experience, two changes were made to the behavior of the Draw interaction:
|
||||||
|
|
||||||
|
1. On long press, the current vertex can be dragged to its desired position.
|
||||||
|
2. On touch move (e.g. when panning the map on a mobile device), no draw cursor is shown, and the geometry being drawn is not updated. But because of 1., the draw cursor will appear on long press. Mouse moves are not affected by this change.
|
||||||
|
|
||||||
|
#### Changes in proj4 integration
|
||||||
|
|
||||||
|
Because relying on a globally available proj4 is not practical with ES modules, we have made a change to the way we integrate proj4:
|
||||||
|
|
||||||
|
* The `setProj4()` function from the `ol/proj` module was removed.
|
||||||
|
* A new `ol/proj/proj4` module with a `register()` function was added. Regardless of whether the application imports `proj4` or uses a global `proj4`, this function needs to be called with the proj4 instance as argument whenever projection definitions were added to proj4's registry with (`proj4.defs`).
|
||||||
|
|
||||||
|
It is also recommended to no longer use a global `proj4`. Instead,
|
||||||
|
|
||||||
|
npm install proj4
|
||||||
|
|
||||||
|
and import it:
|
||||||
|
|
||||||
|
```js
|
||||||
|
import proj4 from 'proj4';
|
||||||
|
```
|
||||||
|
|
||||||
|
Applications can be updated by importing the `register` function from the `ol/proj/proj4` module
|
||||||
|
|
||||||
|
```js
|
||||||
|
import {register} from 'ol/proj/proj4'
|
||||||
|
```
|
||||||
|
|
||||||
|
and calling it before using projections, and any time the proj4 registry was changed by `proj4.defs()` calls:
|
||||||
|
|
||||||
|
```js
|
||||||
|
register(proj4);
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Removal of logos
|
||||||
|
|
||||||
|
The map and sources no longer accept a `logo` option. Instead, if you wish to append a logo to your map, add the desired markup directly in your HTML. In addition, you can use the `attributions` property of a source to display arbitrary markup per-source with the attribution control.
|
||||||
|
|
||||||
|
#### Replacement of `ol/Sphere` constructor with `ol/sphere` functions
|
||||||
|
|
||||||
|
The `ol/Sphere` constructor has been removed. If you were using the `getGeodesicArea` method, use the `getArea` function instead. If you were using the `haversineDistance` method, use the `getDistance` function instead.
|
||||||
|
|
||||||
|
Examples before:
|
||||||
|
```js
|
||||||
|
// using ol@4
|
||||||
|
import Sphere from 'ol/sphere';
|
||||||
|
|
||||||
|
var sphere = new Sphere(Sphere.DEFAULT_RADIUS);
|
||||||
|
var area = sphere.getGeodesicArea(polygon);
|
||||||
|
var distance = sphere.haversineDistance(g1, g2);
|
||||||
|
```
|
||||||
|
|
||||||
|
Examples after:
|
||||||
|
```js
|
||||||
|
// using ol@5
|
||||||
|
import {circular as circularPolygon} from 'ol/geom/Polygon';
|
||||||
|
import {getArea, getDistance} from 'ol/sphere';
|
||||||
|
|
||||||
|
var area = getArea(polygon);
|
||||||
|
var distance = getDistance(g1, g2);
|
||||||
|
var circle = circularPolygon(center, radius);
|
||||||
|
```
|
||||||
|
|
||||||
|
#### New signature for the `circular` function for creating polygons
|
||||||
|
|
||||||
|
The `circular` function exported from `ol/geom/Polygon` no longer requires a `Sphere` as the first argument.
|
||||||
|
|
||||||
|
Example before:
|
||||||
|
```js
|
||||||
|
// using ol@4
|
||||||
|
import Polygon from 'ol/geom/polygon';
|
||||||
|
import Sphere from 'ol/sphere';
|
||||||
|
|
||||||
|
var poly = Polygon.circular(new Sphere(Sphere.DEFAULT_RADIUS), center, radius);
|
||||||
|
```
|
||||||
|
|
||||||
|
Example after:
|
||||||
|
```js
|
||||||
|
// using ol@5
|
||||||
|
import {circular as circularPolygon} from 'ol/geom/Polygon';
|
||||||
|
|
||||||
|
var poly = circularPolygon(center, radius);
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Removal of optional this arguments.
|
||||||
|
|
||||||
|
The following methods did get the optional this (i.e. opt_this) arguments removed. Please use closures, the es6 arrow function or the bind method to achieve this effect (Bind is explained here: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/bind).
|
||||||
|
|
||||||
|
* Collection#forEach
|
||||||
|
* geom/LineString#forEachSegment
|
||||||
|
* Observable#on, #once, #un
|
||||||
|
* source/TileUTFGrid#forDataAtCoordinateAndResolution
|
||||||
|
* source/Vector#forEachFeature, #forEachFeatureInExtent, #forEachFeatureIntersectingExtent
|
||||||
|
|
||||||
### v4.6.0
|
### v4.6.0
|
||||||
|
|
||||||
#### Renamed `exceedLength` option of `ol.style.Text` to `overflow`
|
#### Renamed `exceedLength` option of `ol.style.Text` to `overflow`
|
||||||
|
|||||||
7
changelog/v4.6.2.md
Normal file
7
changelog/v4.6.2.md
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
# 4.6.2
|
||||||
|
|
||||||
|
The v4.6.2 release fixes a regression that could cause tremendous amounts of unneeded vector data to be fetched from the source.
|
||||||
|
|
||||||
|
## Fixes
|
||||||
|
|
||||||
|
* [#7546](https://github.com/openlayers/openlayers/pull/7546) - Do not request features for wrapped extent ([@ahocevar](https://github.com/ahocevar))
|
||||||
7
changelog/v4.6.3.md
Normal file
7
changelog/v4.6.3.md
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
# 4.6.3
|
||||||
|
|
||||||
|
The v4.6.3 release fixes a performance issue when `renderMode: 'image'` is set on an `ol.layer.Vector`.
|
||||||
|
|
||||||
|
## Fixes
|
||||||
|
|
||||||
|
* [#7554](https://github.com/openlayers/openlayers/pull/7554) - Only compose image vector frame when the replay group has changed ([@ahocevar](https://github.com/ahocevar))
|
||||||
7
changelog/v4.6.4.md
Normal file
7
changelog/v4.6.4.md
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
# 4.6.4
|
||||||
|
|
||||||
|
The v4.6.4 release fixes a feature selection issue when `renderMode: 'image'` is set on an `ol.layer.Vector`.
|
||||||
|
|
||||||
|
## Fixes
|
||||||
|
|
||||||
|
* [#7559](https://github.com/openlayers/openlayers/pull/7559) - Handle skipping and unskipping features with renderMode: 'image' ([@ahocevar](https://github.com/ahocevar))
|
||||||
7
changelog/v4.6.5.md
Normal file
7
changelog/v4.6.5.md
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
# 4.6.5
|
||||||
|
|
||||||
|
The v4.6.5 release fixes a hit detection issue when `declutter: true` is set on an `ol.layer.VectorTile`.
|
||||||
|
|
||||||
|
## Fixes
|
||||||
|
|
||||||
|
* [#7669](https://github.com/openlayers/openlayers/pull/7559) - Use declutter tree only for text and image replays ([@ahocevar](https://github.com/ahocevar))
|
||||||
@@ -1,45 +0,0 @@
|
|||||||
{
|
|
||||||
"exports": [],
|
|
||||||
"src": [
|
|
||||||
"src/**/*.js",
|
|
||||||
"build/ol.ext/*.js",
|
|
||||||
"build/examples/{{id}}.js"
|
|
||||||
],
|
|
||||||
"compile": {
|
|
||||||
"js": [
|
|
||||||
"externs/olx.js",
|
|
||||||
"externs/oli.js"
|
|
||||||
],
|
|
||||||
"externs": [
|
|
||||||
"externs/bingmaps.js",
|
|
||||||
"externs/cartodb.js",
|
|
||||||
"externs/bootstrap.js",
|
|
||||||
"externs/closure-compiler.js",
|
|
||||||
"externs/esrijson.js",
|
|
||||||
"externs/example.js",
|
|
||||||
"externs/geojson.js",
|
|
||||||
"externs/jquery-1.9.js",
|
|
||||||
"externs/proj4js.js",
|
|
||||||
"externs/tilejson.js",
|
|
||||||
"externs/topojson.js"
|
|
||||||
],
|
|
||||||
"jscomp_error": [
|
|
||||||
"*"
|
|
||||||
],
|
|
||||||
"jscomp_off": [
|
|
||||||
"lintChecks",
|
|
||||||
"analyzerChecks",
|
|
||||||
"missingProvide",
|
|
||||||
"unknownDefines"
|
|
||||||
],
|
|
||||||
"extra_annotation_name": [
|
|
||||||
"api", "observable"
|
|
||||||
],
|
|
||||||
"rewrite_polyfills": "false",
|
|
||||||
"compilation_level": "ADVANCED",
|
|
||||||
"warning_level": "VERBOSE",
|
|
||||||
"output_wrapper": "(function(){%output%})();",
|
|
||||||
"use_types_for_optimization": true,
|
|
||||||
"manage_closure_dependencies": true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,45 +0,0 @@
|
|||||||
{
|
|
||||||
"exports": [],
|
|
||||||
"src": [
|
|
||||||
"src/**/*.js",
|
|
||||||
"build/ol.ext/*.js",
|
|
||||||
"build/compiled-examples/all.js"
|
|
||||||
],
|
|
||||||
"compile": {
|
|
||||||
"js": [
|
|
||||||
"externs/olx.js",
|
|
||||||
"externs/oli.js"
|
|
||||||
],
|
|
||||||
"externs": [
|
|
||||||
"externs/bingmaps.js",
|
|
||||||
"externs/bootstrap.js",
|
|
||||||
"externs/cartodb.js",
|
|
||||||
"externs/closure-compiler.js",
|
|
||||||
"externs/esrijson.js",
|
|
||||||
"externs/example.js",
|
|
||||||
"externs/geojson.js",
|
|
||||||
"externs/jquery-1.9.js",
|
|
||||||
"externs/proj4js.js",
|
|
||||||
"externs/tilejson.js",
|
|
||||||
"externs/topojson.js"
|
|
||||||
],
|
|
||||||
"jscomp_error": [
|
|
||||||
"*"
|
|
||||||
],
|
|
||||||
"jscomp_off": [
|
|
||||||
"lintChecks",
|
|
||||||
"analyzerChecks",
|
|
||||||
"unusedLocalVariables"
|
|
||||||
],
|
|
||||||
"extra_annotation_name": [
|
|
||||||
"api", "observable"
|
|
||||||
],
|
|
||||||
"rewrite_polyfills": "false",
|
|
||||||
"compilation_level": "ADVANCED",
|
|
||||||
"warning_level": "VERBOSE",
|
|
||||||
"output_wrapper": "(function(){%output%})();",
|
|
||||||
"use_types_for_optimization": true,
|
|
||||||
"manage_closure_dependencies": true
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,38 +1,36 @@
|
|||||||
{
|
{
|
||||||
"opts": {
|
"opts": {
|
||||||
"recurse": true,
|
"recurse": true,
|
||||||
"template": "config/jsdoc/api/template"
|
"template": "config/jsdoc/api/template"
|
||||||
|
},
|
||||||
|
"tags": {
|
||||||
|
"allowUnknownTags": true
|
||||||
|
},
|
||||||
|
"source": {
|
||||||
|
"includePattern": ".+\\.js(doc)?$",
|
||||||
|
"excludePattern": "(^|\\/|\\\\)_",
|
||||||
|
"include": [
|
||||||
|
"src/ol"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"plugins": [
|
||||||
|
"plugins/markdown",
|
||||||
|
"config/jsdoc/api/plugins/normalize-exports",
|
||||||
|
"config/jsdoc/api/plugins/inline-options",
|
||||||
|
"config/jsdoc/api/plugins/events",
|
||||||
|
"config/jsdoc/api/plugins/observable",
|
||||||
|
"config/jsdoc/api/plugins/api"
|
||||||
|
],
|
||||||
|
"markdown": {
|
||||||
|
"parser": "gfm"
|
||||||
|
},
|
||||||
|
"templates": {
|
||||||
|
"cleverLinks": true,
|
||||||
|
"monospaceLinks": true,
|
||||||
|
"default": {
|
||||||
|
"outputSourceFiles": false
|
||||||
},
|
},
|
||||||
"tags": {
|
"applicationName": "OpenLayers"
|
||||||
"allowUnknownTags": true
|
},
|
||||||
},
|
"jsVersion": 180
|
||||||
"source": {
|
|
||||||
"includePattern": ".+\\.js(doc)?$",
|
|
||||||
"excludePattern": "(^|\\/|\\\\)_",
|
|
||||||
"include": [
|
|
||||||
"src",
|
|
||||||
"externs/oli.js",
|
|
||||||
"externs/olx.js"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"plugins": [
|
|
||||||
"plugins/markdown",
|
|
||||||
"config/jsdoc/api/plugins/inheritdoc",
|
|
||||||
"config/jsdoc/api/plugins/typedefs",
|
|
||||||
"config/jsdoc/api/plugins/events",
|
|
||||||
"config/jsdoc/api/plugins/observable",
|
|
||||||
"config/jsdoc/api/plugins/api"
|
|
||||||
],
|
|
||||||
"markdown": {
|
|
||||||
"parser": "gfm"
|
|
||||||
},
|
|
||||||
"templates": {
|
|
||||||
"cleverLinks": true,
|
|
||||||
"monospaceLinks": true,
|
|
||||||
"default": {
|
|
||||||
"outputSourceFiles": false
|
|
||||||
},
|
|
||||||
"applicationName": "OpenLayers"
|
|
||||||
},
|
|
||||||
"jsVersion": 180
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,43 +1,43 @@
|
|||||||
<table><tr>
|
<table><tr>
|
||||||
<th width="33.3%">Map</th><th width="33.3%">View</th><th width="33.3%">Layers</th>
|
<th width="33.3%">Map</th><th width="33.3%">View</th><th width="33.3%">Layers</th>
|
||||||
</tr><tr>
|
</tr><tr>
|
||||||
<td><p>A [map](ol.Map.html) is made of [layers](ol.layer.html), a [view](ol.View.html) to visualize them, [interactions](ol.interaction.html) to modify map content and [controls](ol.control.html) with UI components.</p>
|
<td><p>A [map](module-ol_Map-Map.html) is made of [layers](module-ol_layer_Base-BaseLayer.html), a [view](module-ol_View-View.html) to visualize them, [interactions](module-ol_interaction_Interaction-Interaction.html) to modify map content and [controls](module-ol_control_Control-Control.html) with UI components.</p>
|
||||||
[Overview](ol.Map.html)<br>
|
[Overview](module-ol_Map-Map.html)<br>
|
||||||
[Creation](ol.Map.html#Map)<br>
|
[Creation](module-ol_Map-Map.html#Map)<br>
|
||||||
[Events](ol.MapBrowserEvent.html)</td>
|
[Events](module-ol_MapBrowserEvent-MapBrowserEvent.html)</td>
|
||||||
<td><p>The view manages the visual parameters of the map view, like resolution or rotation.</p>
|
<td><p>The view manages the visual parameters of the map view, like resolution or rotation.</p>
|
||||||
[ol.View](ol.View.html) with center, projection, resolution and rotation</td>
|
[View](module-ol_View-View.html) with center, projection, resolution and rotation</td>
|
||||||
<td><p>Layers are lightweight containers that get their data from [sources](ol.source.html).</p>
|
<td><p>Layers are lightweight containers that get their data from [sources](module-ol_source_Source-Source.html).</p>
|
||||||
[ol.layer.Tile](ol.layer.Tile.html)<br>
|
[layer/Tile](module-ol_layer_Tile-TileLayer.html)<br>
|
||||||
[ol.layer.Image](ol.layer.Image.html)<br>
|
[layer/Image](module-ol_layer_Image-ImageLayer.html)<br>
|
||||||
[ol.layer.Vector](ol.layer.Vector.html)<br>
|
[layer/Vector](module-ol_layer_Vector-VectorLayer.html)<br>
|
||||||
[ol.layer.VectorTile](ol.layer.VectorTile.html)</td>
|
[layer/VectorTile](module-ol_layer_VectorTile-VectorTileLayer.html)</td>
|
||||||
</tr><tr>
|
</tr><tr>
|
||||||
<th>Controls</th><th>Interactions</th><th>Sources and formats</th>
|
<th>Controls</th><th>Interactions</th><th>Sources and formats</th>
|
||||||
</tr><tr>
|
</tr><tr>
|
||||||
<td>[Map default controls](ol.control.html#.defaults)<br>
|
<td>[Map default controls](module-ol_control_util.html#.defaults)<br>
|
||||||
[All controls](ol.control.html)
|
[All controls](module-ol_control_Control-Control.html)
|
||||||
</td>
|
</td>
|
||||||
<td>
|
<td>
|
||||||
[Map default interactions](ol.interaction.html#.defaults)<br>
|
[Map default interactions](module-ol_interaction.html#~defaults)<br>
|
||||||
Interactions for [vector features](ol.Feature.html)
|
Interactions for [vector features](module-ol_Feature-Feature.html)
|
||||||
<ul><li>[ol.interaction.Select](ol.interaction.Select.html)</li>
|
<ul><li>[interaction/Select](module-ol_interaction_Select-Select.html)</li>
|
||||||
<li>[ol.interaction.Draw](ol.interaction.Draw.html)</li>
|
<li>[interaction/Draw](module-ol_interaction_Draw-Draw.html)</li>
|
||||||
<li>[ol.interaction.Modify](ol.interaction.Modify.html)</li></ul>
|
<li>[interaction/Modify](module-ol_interaction_Modify-Modify.html)</li></ul>
|
||||||
[All interactions](ol.interaction.html)</td>
|
[All interactions](module-ol_interaction_Interaction-Interaction.html)</td>
|
||||||
<td>[Tile sources](ol.source.Tile.html) for [ol.layer.Tile](ol.layer.Tile.html)
|
<td>[Tile sources](module-ol_source_Tile-TileSource.html) for [layer/Tile](module-ol_layer_Tile-TileLayer.html)
|
||||||
<br>[Image sources](ol.source.Image.html) for [ol.layer.Image](ol.layer.Image.html)
|
<br>[Image sources](module-ol_source_Image-ImageSource.html) for [layer/Image](module-ol_layer_Image-ImageLayer.html)
|
||||||
<br>[Vector sources](ol.source.Vector.html) for [ol.layer.Vector](ol.layer.Vector.html)
|
<br>[Vector sources](module-ol_source_Vector-VectorSource.html) for [layer/Vector](module-ol_layer_Vector-VectorLayer.html)
|
||||||
<br>[Vector tile sources](ol.source.VectorTile.html) for [ol.layer.VectorTile](ol.layer.VectorTile.html)
|
<br>[Vector tile sources](module-ol_source_VectorTile-VectorTile.html) for [layer/VectorTile](module-ol_layer_VectorTile-VectorTileLayer.html)
|
||||||
<br>[Formats](ol.format.Feature.html) for reading/writing vector data
|
<br>[Formats](module-ol_format_Feature-FeatureFormat.html) for reading/writing vector data
|
||||||
<br>[ol.format.WMSCapabilities](ol.format.WMSCapabilities.html)</td></tr>
|
<br>[format/WMSCapabilities](module-ol_format_WMSCapabilities-WMSCapabilities.html)</td></tr>
|
||||||
<tr><th>Projections</th><th>Observable objects</th><th>Other components</th></tr>
|
<tr><th>Projections</th><th>Observable objects</th><th>Other components</th></tr>
|
||||||
<tr><td><p>All coordinates and extents need to be provided in view projection (default: EPSG:3857). To transform, use [ol.proj.transform()](ol.proj.html#.transform) and [ol.proj.transformExtent()](ol.proj.html#.transformExtent).</p>
|
<tr><td><p>All coordinates and extents need to be provided in view projection (default: EPSG:3857). To transform, use [proj.transform()](module-ol_proj.html#.transform) and [proj.transformExtent()](module-ol_proj.html#.transformExtent).</p>
|
||||||
[ol.proj](ol.proj.html)</td>
|
[ol/proj](module-ol_proj.html)</td>
|
||||||
<td><p>Changes to all [ol.Objects](ol.Object.html) can be observed by calling the [object.on('propertychange')](ol.Object.html#on) method. Listeners receive an [ol.Object.Event](ol.Object.Event.html) with information on the changed property and old value.</p>
|
<td><p>Changes to all [ol/Object](module-ol_Object-BaseObject.html)s can be observed by calling the [object.on('propertychange')](module-ol_Object-BaseObject.html#on) method. Listeners receive an [ol/Object~ObjectEvent](module-ol_Object-ObjectEvent.html) with information on the changed property and old value.</p>
|
||||||
<td>
|
<td>
|
||||||
[ol.Geolocation](ol.Geolocation.html)<br>
|
[ol/Geolocation](module-ol_Geolocation.html)<br>
|
||||||
[ol.Overlay](ol.Overlay.html)<br></td>
|
[ol/Overlay](module-ol_Overlay-Overlay.html)<br></td>
|
||||||
</tr></table>
|
</tr></table>
|
||||||
|
|
||||||
|
|
||||||
@@ -52,11 +52,4 @@ The OpenLayers API consists of
|
|||||||
|
|
||||||
Within a major release series, the API will not be changed. Any changes to the API will be accompanied by a new major release.
|
Within a major release series, the API will not be changed. Any changes to the API will be accompanied by a new major release.
|
||||||
|
|
||||||
*Note*: The API change policy does not cover CSS class names that are used to style the
|
*Note*: The API change policy does not cover CSS class names that are used to style the OpenLayers UI. It also does not cover any typedefs and enums.
|
||||||
OpenLayers UI.
|
|
||||||
|
|
||||||
*Note for Closure Compiler users compiling their application code together with OpenLayers*:
|
|
||||||
The names of types other than those in the list above (e.g. `ol.Coordinate`) are subject to change. It
|
|
||||||
is therefore recommended to either use the resolved type as listed in the API docs (e.g.
|
|
||||||
`Array.<number>` instead of `ol.Coordinate`), or pay attention to the upgrade notes, which will list
|
|
||||||
the changes for those types.
|
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
/**
|
/**
|
||||||
* Define an @api tag
|
* Define an @api tag
|
||||||
|
* @param {Object} dictionary The tag dictionary.
|
||||||
*/
|
*/
|
||||||
exports.defineTags = function(dictionary) {
|
exports.defineTags = function(dictionary) {
|
||||||
dictionary.defineTag('api', {
|
dictionary.defineTag('api', {
|
||||||
@@ -8,32 +9,32 @@ exports.defineTags = function(dictionary) {
|
|||||||
canHaveName: false,
|
canHaveName: false,
|
||||||
onTagged: function(doclet, tag) {
|
onTagged: function(doclet, tag) {
|
||||||
includeTypes(doclet);
|
includeTypes(doclet);
|
||||||
doclet.stability = "stable";
|
doclet.stability = 'stable';
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Based on @api annotations, and assuming that items with no @api annotation
|
* Based on @api annotations, and assuming that items with no @api annotation
|
||||||
* should not be documented, this plugin removes undocumented symbols
|
* should not be documented, this plugin removes undocumented symbols
|
||||||
* from the documentation.
|
* from the documentation.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
var api = [];
|
const api = [];
|
||||||
var classes = {};
|
const classes = {};
|
||||||
var types = {};
|
const types = {};
|
||||||
|
const modules = {};
|
||||||
|
|
||||||
function hasApiMembers(doclet) {
|
function hasApiMembers(doclet) {
|
||||||
return doclet.longname.split('#')[0] == this.longname;
|
return doclet.longname.split('#')[0] == this.longname;
|
||||||
}
|
}
|
||||||
|
|
||||||
function includeAugments(doclet) {
|
function includeAugments(doclet) {
|
||||||
var augments = doclet.augments;
|
const augments = doclet.augments;
|
||||||
if (augments) {
|
if (augments) {
|
||||||
var cls;
|
let cls;
|
||||||
for (var i = augments.length - 1; i >= 0; --i) {
|
for (let i = augments.length - 1; i >= 0; --i) {
|
||||||
cls = classes[augments[i]];
|
cls = classes[augments[i]];
|
||||||
if (cls) {
|
if (cls) {
|
||||||
includeAugments(cls);
|
includeAugments(cls);
|
||||||
@@ -57,10 +58,8 @@ function includeAugments(doclet) {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
if (cls.longname.indexOf('oli.') !== 0) {
|
cls._hideConstructor = true;
|
||||||
cls._hideConstructor = true;
|
delete cls.undocumented;
|
||||||
delete cls.undocumented;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -68,25 +67,25 @@ function includeAugments(doclet) {
|
|||||||
|
|
||||||
function extractTypes(item) {
|
function extractTypes(item) {
|
||||||
item.type.names.forEach(function(type) {
|
item.type.names.forEach(function(type) {
|
||||||
var match = type.match(/^(.*<)?([^>]*)>?$/);
|
const match = type.match(/^(.*<)?([^>]*)>?$/);
|
||||||
if (match) {
|
if (match) {
|
||||||
|
modules[match[2]] = true;
|
||||||
types[match[2]] = true;
|
types[match[2]] = true;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
function includeTypes(doclet) {
|
function includeTypes(doclet) {
|
||||||
if (doclet.params && doclet.kind != 'class') {
|
if (doclet.params) {
|
||||||
doclet.params.forEach(extractTypes);
|
doclet.params.forEach(extractTypes);
|
||||||
}
|
}
|
||||||
if (doclet.returns) {
|
if (doclet.returns) {
|
||||||
doclet.returns.forEach(extractTypes);
|
doclet.returns.forEach(extractTypes);
|
||||||
}
|
}
|
||||||
if (doclet.isEnum) {
|
if (doclet.properties) {
|
||||||
types[doclet.meta.code.name] = true;
|
doclet.properties.forEach(extractTypes);
|
||||||
}
|
}
|
||||||
if (doclet.type && doclet.meta.code.type == 'MemberExpression') {
|
if (doclet.type && doclet.meta.code.type == 'MemberExpression') {
|
||||||
// types in olx.js
|
|
||||||
extractTypes(doclet);
|
extractTypes(doclet);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -94,13 +93,9 @@ function includeTypes(doclet) {
|
|||||||
exports.handlers = {
|
exports.handlers = {
|
||||||
|
|
||||||
newDoclet: function(e) {
|
newDoclet: function(e) {
|
||||||
var doclet = e.doclet;
|
const doclet = e.doclet;
|
||||||
// Keep track of api items - needed in parseComplete to determine classes
|
|
||||||
// with api members.
|
|
||||||
if (doclet.meta.filename == 'olx.js' && doclet.kind == 'typedef') {
|
|
||||||
doclet.undocumented = false;
|
|
||||||
}
|
|
||||||
if (doclet.stability) {
|
if (doclet.stability) {
|
||||||
|
modules[doclet.longname.split('~').shift()] = true;
|
||||||
api.push(doclet);
|
api.push(doclet);
|
||||||
}
|
}
|
||||||
// Mark explicity defined namespaces - needed in parseComplete to keep
|
// Mark explicity defined namespaces - needed in parseComplete to keep
|
||||||
@@ -109,14 +104,15 @@ exports.handlers = {
|
|||||||
doclet.namespace_ = true;
|
doclet.namespace_ = true;
|
||||||
}
|
}
|
||||||
if (doclet.kind == 'class') {
|
if (doclet.kind == 'class') {
|
||||||
|
modules[doclet.longname.split('~').shift()] = true;
|
||||||
classes[doclet.longname] = doclet;
|
classes[doclet.longname] = doclet;
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
parseComplete: function(e) {
|
parseComplete: function(e) {
|
||||||
var doclets = e.doclets;
|
const doclets = e.doclets;
|
||||||
for (var i = doclets.length - 1; i >= 0; --i) {
|
for (let i = doclets.length - 1; i >= 0; --i) {
|
||||||
var doclet = doclets[i];
|
const doclet = doclets[i];
|
||||||
if (doclet.stability || doclet.namespace_) {
|
if (doclet.stability || doclet.namespace_) {
|
||||||
if (doclet.kind == 'class') {
|
if (doclet.kind == 'class') {
|
||||||
includeAugments(doclet);
|
includeAugments(doclet);
|
||||||
@@ -134,6 +130,13 @@ exports.handlers = {
|
|||||||
// Always document namespaces and items with stability annotation
|
// Always document namespaces and items with stability annotation
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
if (doclet.kind == 'module' && doclet.longname in modules) {
|
||||||
|
// Document all modules that are referenced by the API
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (doclet.isEnum || doclet.kind == 'typedef') {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
if (doclet.kind == 'class' && api.some(hasApiMembers, doclet)) {
|
if (doclet.kind == 'class' && api.some(hasApiMembers, doclet)) {
|
||||||
// Mark undocumented classes with documented members as unexported.
|
// Mark undocumented classes with documented members as unexported.
|
||||||
// This is used in ../template/tmpl/container.tmpl to hide the
|
// This is used in ../template/tmpl/container.tmpl to hide the
|
||||||
|
|||||||
@@ -1,11 +1,11 @@
|
|||||||
var events = {};
|
const events = {};
|
||||||
var classes = {};
|
const classes = {};
|
||||||
|
|
||||||
exports.handlers = {
|
exports.handlers = {
|
||||||
|
|
||||||
newDoclet: function(e) {
|
newDoclet: function(e) {
|
||||||
var doclet = e.doclet;
|
const doclet = e.doclet;
|
||||||
var cls;
|
let cls;
|
||||||
if (doclet.kind == 'event') {
|
if (doclet.kind == 'event') {
|
||||||
cls = doclet.longname.split('#')[0];
|
cls = doclet.longname.split('#')[0];
|
||||||
if (!(cls in events)) {
|
if (!(cls in events)) {
|
||||||
@@ -18,8 +18,8 @@ exports.handlers = {
|
|||||||
},
|
},
|
||||||
|
|
||||||
parseComplete: function(e) {
|
parseComplete: function(e) {
|
||||||
var doclets = e.doclets;
|
const doclets = e.doclets;
|
||||||
var doclet, i, ii, j, jj, event, fires;
|
let doclet, i, ii, j, jj, event, fires;
|
||||||
for (i = 0, ii = doclets.length - 1; i < ii; ++i) {
|
for (i = 0, ii = doclets.length - 1; i < ii; ++i) {
|
||||||
doclet = doclets[i];
|
doclet = doclets[i];
|
||||||
if (doclet.fires) {
|
if (doclet.fires) {
|
||||||
@@ -28,7 +28,7 @@ exports.handlers = {
|
|||||||
for (j = 0, jj = doclet.fires.length; j < jj; ++j) {
|
for (j = 0, jj = doclet.fires.length; j < jj; ++j) {
|
||||||
event = doclet.fires[j].replace('event:', '');
|
event = doclet.fires[j].replace('event:', '');
|
||||||
if (events[event]) {
|
if (events[event]) {
|
||||||
fires.push.apply(fires, events[event]);
|
fires.push.apply(fires, events[event]);
|
||||||
} else {
|
} else {
|
||||||
fires.push(doclet.fires[j]);
|
fires.push(doclet.fires[j]);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,109 +0,0 @@
|
|||||||
/*
|
|
||||||
* This is a hack to prevent inheritDoc tags from entirely removing
|
|
||||||
* documentation of the method that inherits the documentation.
|
|
||||||
*
|
|
||||||
* TODO: Remove this hack when https://github.com/jsdoc3/jsdoc/issues/53
|
|
||||||
* is addressed.
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
exports.defineTags = function(dictionary) {
|
|
||||||
dictionary.defineTag('inheritDoc', {
|
|
||||||
mustHaveValue: false,
|
|
||||||
canHaveType: false,
|
|
||||||
canHaveName: false,
|
|
||||||
onTagged: function(doclet, tag) {
|
|
||||||
doclet.inheritdoc = true;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
var lookup = {};
|
|
||||||
var incompleteByClass = {};
|
|
||||||
var keepKeys = ['comment', 'meta', 'name', 'memberof', 'longname', 'augment',
|
|
||||||
'stability'];
|
|
||||||
|
|
||||||
exports.handlers = {
|
|
||||||
|
|
||||||
newDoclet: function(e) {
|
|
||||||
var doclet = e.doclet;
|
|
||||||
var incompletes;
|
|
||||||
if (!(doclet.longname in lookup)) {
|
|
||||||
lookup[doclet.longname] = [];
|
|
||||||
}
|
|
||||||
lookup[doclet.longname].push(doclet);
|
|
||||||
if (doclet.inheritdoc) {
|
|
||||||
if (!(doclet.memberof in incompleteByClass)) {
|
|
||||||
incompleteByClass[doclet.memberof] = [];
|
|
||||||
}
|
|
||||||
incompletes = incompleteByClass[doclet.memberof];
|
|
||||||
if (incompletes.indexOf(doclet.name) == -1) {
|
|
||||||
incompletes.push(doclet.name);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
parseComplete: function(e) {
|
|
||||||
var ancestors, candidate, candidates, doclet, i, j, k, l, key;
|
|
||||||
var incompleteDoclet, stability, incomplete, incompletes;
|
|
||||||
var doclets = e.doclets;
|
|
||||||
for (i = doclets.length - 1; i >= 0; --i) {
|
|
||||||
doclet = doclets[i];
|
|
||||||
if (doclet.augments) {
|
|
||||||
ancestors = [].concat(doclet.augments);
|
|
||||||
}
|
|
||||||
incompletes = incompleteByClass[doclet.longname];
|
|
||||||
if (ancestors && incompletes) {
|
|
||||||
// collect ancestors from the whole hierarchy
|
|
||||||
for (j = 0; j < ancestors.length; ++j) {
|
|
||||||
candidates = lookup[ancestors[j]];
|
|
||||||
if (candidates) {
|
|
||||||
for (k = candidates.length - 1; k >= 0; --k) {
|
|
||||||
candidate = candidates[k];
|
|
||||||
if (candidate.augments) {
|
|
||||||
ancestors = ancestors.concat(candidate.augments);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// walk through all inheritDoc members
|
|
||||||
for (j = incompletes.length - 1; j >= 0; --j) {
|
|
||||||
incomplete = incompletes[j];
|
|
||||||
candidates = lookup[doclet.longname + '#' + incomplete];
|
|
||||||
if (candidates) {
|
|
||||||
// get the incomplete doclet that needs to be augmented
|
|
||||||
for (k = candidates.length - 1; k >= 0; --k) {
|
|
||||||
incompleteDoclet = candidates[k];
|
|
||||||
if (incompleteDoclet.inheritdoc) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// find the documented ancestor
|
|
||||||
for (k = ancestors.length - 1; k >= 0; --k) {
|
|
||||||
candidates = lookup[ancestors[k] + '#' + incomplete];
|
|
||||||
if (candidates) {
|
|
||||||
for (l = candidates.length - 1; l >= 0; --l) {
|
|
||||||
candidate = candidates[l];
|
|
||||||
if (candidate && !candidate.inheritdoc) {
|
|
||||||
stability = candidate.stability || incompleteDoclet.stability;
|
|
||||||
if (stability) {
|
|
||||||
incompleteDoclet.stability = stability;
|
|
||||||
for (key in candidate) {
|
|
||||||
if (candidate.hasOwnProperty(key) &&
|
|
||||||
keepKeys.indexOf(key) == -1) {
|
|
||||||
incompleteDoclet[key] = candidate[key];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
};
|
|
||||||
49
config/jsdoc/api/plugins/inline-options.js
Normal file
49
config/jsdoc/api/plugins/inline-options.js
Normal file
@@ -0,0 +1,49 @@
|
|||||||
|
/**
|
||||||
|
* @filedesc
|
||||||
|
* Inlines option params from typedefs
|
||||||
|
*/
|
||||||
|
|
||||||
|
const properties = {};
|
||||||
|
|
||||||
|
exports.handlers = {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Collects all typedefs, keyed by longname
|
||||||
|
* @param {Object} e Event object.
|
||||||
|
*/
|
||||||
|
newDoclet: function(e) {
|
||||||
|
if (e.doclet.kind == 'typedef' && e.doclet.properties) {
|
||||||
|
properties[e.doclet.longname] = e.doclet.properties;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Adds `options.*` params for options that match the longname of one of the
|
||||||
|
* collected typedefs.
|
||||||
|
* @param {Object} e Event object.
|
||||||
|
*/
|
||||||
|
parseComplete: function(e) {
|
||||||
|
const doclets = e.doclets;
|
||||||
|
for (let i = 0, ii = doclets.length; i < ii; ++i) {
|
||||||
|
const doclet = doclets[i];
|
||||||
|
if (doclet.params) {
|
||||||
|
const params = doclet.params;
|
||||||
|
for (let j = 0, jj = params.length; j < jj; ++j) {
|
||||||
|
const param = params[j];
|
||||||
|
if (param.type && param.type.names) {
|
||||||
|
const type = param.type.names[0];
|
||||||
|
if (type in properties) {
|
||||||
|
param.type.names[0] = type;
|
||||||
|
params.push.apply(params, properties[type].map(p => {
|
||||||
|
const property = Object.assign({}, p);
|
||||||
|
property.name = `${param.name}.${property.name}`;
|
||||||
|
return property;
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
};
|
||||||
106
config/jsdoc/api/plugins/normalize-exports.js
Normal file
106
config/jsdoc/api/plugins/normalize-exports.js
Normal file
@@ -0,0 +1,106 @@
|
|||||||
|
/**
|
||||||
|
* @filedesc
|
||||||
|
* Expands module path type to point to default export when no name is given
|
||||||
|
*/
|
||||||
|
|
||||||
|
const fs = require('fs');
|
||||||
|
const path = require('path');
|
||||||
|
|
||||||
|
let moduleRoot;
|
||||||
|
|
||||||
|
function addDefaultExportPath(obj) {
|
||||||
|
if (!Array.isArray(obj)) {
|
||||||
|
obj = obj.names;
|
||||||
|
}
|
||||||
|
obj.forEach((name, index) => {
|
||||||
|
const matches = name.match(/module\:([^>|),\.<]|)+/g);
|
||||||
|
if (matches) {
|
||||||
|
matches.forEach(module => {
|
||||||
|
if (!/[~\.]/.test(module)) {
|
||||||
|
const checkFile = path.resolve(moduleRoot, module.replace(/^module\:/, ''));
|
||||||
|
const file = fs.readFileSync(require.resolve(checkFile), 'utf-8');
|
||||||
|
const lines = file.split('\n');
|
||||||
|
let hasDefaultExport = false;
|
||||||
|
for (let i = 0, ii = lines.length; i < ii; ++i) {
|
||||||
|
hasDefaultExport = hasDefaultExport || /^export default [^\{]/.test(lines[i]);
|
||||||
|
const match = lines[i].match(/^export default ([A-Za-z_$][A-Za-z0-9_$]+);$/);
|
||||||
|
if (match) {
|
||||||
|
// Use variable name if default export is assigned to a variable.
|
||||||
|
obj[index] = name = name.replace(module, `${module}~${match[1]}`);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (hasDefaultExport) {
|
||||||
|
// Duplicate last part if default export is not assigned to a variable.
|
||||||
|
obj[index] = name = name.replace(module, `${module}~${module.split('/').pop()}`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function replaceLinks(comment) {
|
||||||
|
const matches = comment.match(/\{@link [^\} #]+}/g);
|
||||||
|
if (matches) {
|
||||||
|
const modules = matches.map(m => {
|
||||||
|
const mm = m.match(/(module:[^\}]+)}$/);
|
||||||
|
if (mm) {
|
||||||
|
return mm[1];
|
||||||
|
}
|
||||||
|
}).filter(m => !!m);
|
||||||
|
const newModules = modules.concat();
|
||||||
|
addDefaultExportPath(newModules);
|
||||||
|
modules.forEach((module, i) => {
|
||||||
|
comment = comment.replace(module, newModules[i]);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
return comment;
|
||||||
|
}
|
||||||
|
|
||||||
|
exports.handlers = {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Adds default export to module path types without name
|
||||||
|
* @param {Object} e Event object.
|
||||||
|
*/
|
||||||
|
newDoclet: function(e) {
|
||||||
|
const doclet = e.doclet;
|
||||||
|
if (doclet.kind == 'module') {
|
||||||
|
const levelsUp = doclet.longname.replace(/^module\:/, '').split('/');
|
||||||
|
if (doclet.meta.filename != 'index.js') {
|
||||||
|
levelsUp.pop();
|
||||||
|
}
|
||||||
|
const pathArgs = [doclet.meta.path].concat(levelsUp.map(() => '../'));
|
||||||
|
moduleRoot = path.resolve.apply(null, pathArgs);
|
||||||
|
} else {
|
||||||
|
if (doclet.description) {
|
||||||
|
doclet.description = replaceLinks(doclet.description);
|
||||||
|
}
|
||||||
|
if (doclet.classdesc) {
|
||||||
|
doclet.classdesc = replaceLinks(doclet.classdesc);
|
||||||
|
}
|
||||||
|
|
||||||
|
const module = doclet.longname.split('#').shift();
|
||||||
|
if (module.indexOf('module:') == 0 && module.indexOf('.') !== -1) {
|
||||||
|
doclet.longname = doclet.longname.replace(module, module.replace('.', '~'));
|
||||||
|
}
|
||||||
|
if (doclet.augments) {
|
||||||
|
addDefaultExportPath(doclet.augments);
|
||||||
|
}
|
||||||
|
if (doclet.params) {
|
||||||
|
doclet.params.forEach(p => addDefaultExportPath(p.type));
|
||||||
|
}
|
||||||
|
if (doclet.returns) {
|
||||||
|
doclet.returns.forEach(r => addDefaultExportPath(r.type));
|
||||||
|
}
|
||||||
|
if (doclet.properties) {
|
||||||
|
doclet.properties.forEach(p => addDefaultExportPath(p.type));
|
||||||
|
}
|
||||||
|
if (doclet.type) {
|
||||||
|
addDefaultExportPath(doclet.type);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
};
|
||||||
@@ -1,25 +1,25 @@
|
|||||||
var classes = {};
|
const classes = {};
|
||||||
var observables = {};
|
const observables = {};
|
||||||
|
|
||||||
exports.handlers = {
|
exports.handlers = {
|
||||||
|
|
||||||
newDoclet: function(e) {
|
newDoclet: function(e) {
|
||||||
var doclet = e.doclet;
|
const doclet = e.doclet;
|
||||||
if (doclet.kind == 'class') {
|
if (doclet.kind == 'class') {
|
||||||
classes[doclet.longname] = doclet;
|
classes[doclet.longname] = doclet;
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
parseComplete: function(e) {
|
parseComplete: function(e) {
|
||||||
var doclets = e.doclets;
|
const doclets = e.doclets;
|
||||||
var cls, doclet, event, i, ii, observable;
|
let cls, doclet, event, i, ii, observable;
|
||||||
for (i = 0, ii = doclets.length - 1; i < ii; ++i) {
|
for (i = 0, ii = doclets.length - 1; i < ii; ++i) {
|
||||||
doclet = doclets[i];
|
doclet = doclets[i];
|
||||||
cls = classes[doclet.longname.split('#')[0]];
|
cls = classes[doclet.longname.split('#')[0]];
|
||||||
if (typeof doclet.observable == 'string' && cls) {
|
if (typeof doclet.observable == 'string' && cls) {
|
||||||
var name = doclet.name.replace(/^[sg]et/, '');
|
let name = doclet.name.replace(/^[sg]et/, '');
|
||||||
name = name.substr(0, 1).toLowerCase() + name.substr(1);
|
name = name.substr(0, 1).toLowerCase() + name.substr(1);
|
||||||
var key = doclet.longname.split('#')[0] + '#' + name;
|
const key = doclet.longname.split('#')[0] + '#' + name;
|
||||||
doclet.observable = key;
|
doclet.observable = key;
|
||||||
if (!observables[key]) {
|
if (!observables[key]) {
|
||||||
observables[key] = {};
|
observables[key] = {};
|
||||||
@@ -27,7 +27,7 @@ exports.handlers = {
|
|||||||
observable = observables[key];
|
observable = observables[key];
|
||||||
observable.name = name;
|
observable.name = name;
|
||||||
observable.readonly = typeof observable.readonly == 'boolean' ?
|
observable.readonly = typeof observable.readonly == 'boolean' ?
|
||||||
observable.readonly : true;
|
observable.readonly : true;
|
||||||
if (doclet.name.indexOf('get') === 0) {
|
if (doclet.name.indexOf('get') === 0) {
|
||||||
observable.type = doclet.returns[0].type;
|
observable.type = doclet.returns[0].type;
|
||||||
observable.description = doclet.returns[0].description;
|
observable.description = doclet.returns[0].description;
|
||||||
@@ -47,7 +47,7 @@ exports.handlers = {
|
|||||||
if (!cls.fires) {
|
if (!cls.fires) {
|
||||||
cls.fires = [];
|
cls.fires = [];
|
||||||
}
|
}
|
||||||
event = 'ol.Object.Event#event:change:' + name;
|
event = 'module:ol/Object~ObjectEvent#event:change:' + name;
|
||||||
if (cls.fires.indexOf(event) == -1) {
|
if (cls.fires.indexOf(event) == -1) {
|
||||||
cls.fires.push(event);
|
cls.fires.push(event);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,49 +1,27 @@
|
|||||||
/*
|
/*
|
||||||
* Converts olx.js @type annotations into properties of the previous @typedef.
|
|
||||||
* Changes @enum annotations into @typedef.
|
* Changes @enum annotations into @typedef.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
var lastOlxTypedef = null;
|
|
||||||
var olxTypes = {};
|
|
||||||
// names of the olx typenames
|
|
||||||
var olxTypeNames = [];
|
|
||||||
// types that are undefined or typedefs containing undefined
|
// types that are undefined or typedefs containing undefined
|
||||||
var undefinedLikes = null;
|
let undefinedLikes = null;
|
||||||
|
|
||||||
function addSubparams(params) {
|
|
||||||
for (var j = 0, jj = params.length; j < jj; ++j) {
|
|
||||||
var param = params[j];
|
|
||||||
var types = param.type.names;
|
|
||||||
for (var k = 0, kk = types.length; k < kk; ++k) {
|
|
||||||
var name = types[k];
|
|
||||||
if (name in olxTypes) {
|
|
||||||
param.subparams = olxTypes[name];
|
|
||||||
// TODO addSubparams(param.subparams);
|
|
||||||
// TODO Do we need to support multiple object literal types per
|
|
||||||
// param?
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Changes the description of the param, if it is found to be a required
|
* Changes the description of the param if it is required.
|
||||||
* option of an olxTypeName.
|
* @param {Object} doclet The doclet.
|
||||||
|
* @returns {Object} The modified doclet.
|
||||||
*/
|
*/
|
||||||
function markRequiredIfNeeded(doclet){
|
function markRequiredIfNeeded(doclet) {
|
||||||
var memberof = doclet.memberof;
|
const memberof = doclet.memberof;
|
||||||
// only check doclets that belong to an olxTypeName
|
if (!memberof) {
|
||||||
if (!memberof || olxTypeNames.indexOf(memberof) == -1) {
|
|
||||||
return doclet;
|
return doclet;
|
||||||
}
|
}
|
||||||
|
|
||||||
var types = doclet.type.names;
|
const types = doclet.type.names;
|
||||||
var isRequiredParam = true;
|
let isRequiredParam = true;
|
||||||
|
|
||||||
// iterate over all types that are like-undefined (see above for explanation)
|
// iterate over all types that are like-undefined (see above for explanation)
|
||||||
for (var idx = undefinedLikes.length - 1; idx >= 0; idx--) {
|
for (let idx = undefinedLikes.length - 1; idx >= 0; idx--) {
|
||||||
var undefinedLike = undefinedLikes[idx];
|
const undefinedLike = undefinedLikes[idx];
|
||||||
// … if the current types contains a type that is undefined-like,
|
// … if the current types contains a type that is undefined-like,
|
||||||
// it is not required.
|
// it is not required.
|
||||||
if (types.indexOf(undefinedLike) != -1) {
|
if (types.indexOf(undefinedLike) != -1) {
|
||||||
@@ -52,9 +30,9 @@ function markRequiredIfNeeded(doclet){
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (isRequiredParam) {
|
if (isRequiredParam) {
|
||||||
var reqSnippet = '<span class="required-option">Required.</span></p>';
|
const reqSnippet = '<span class="required-option">Required.</span></p>';
|
||||||
var endsWithP = /<\/p>$/i;
|
const endsWithP = /<\/p>$/i;
|
||||||
var description = doclet.description;
|
let description = doclet.description;
|
||||||
if (description && endsWithP.test(description)) {
|
if (description && endsWithP.test(description)) {
|
||||||
description = description.replace(endsWithP, ' ' + reqSnippet);
|
description = description.replace(endsWithP, ' ' + reqSnippet);
|
||||||
} else if (doclet.description === undefined) {
|
} else if (doclet.description === undefined) {
|
||||||
@@ -69,13 +47,14 @@ function markRequiredIfNeeded(doclet){
|
|||||||
* Iterates over all doclets and finds the names of types that contain
|
* Iterates over all doclets and finds the names of types that contain
|
||||||
* undefined. Stores the names in the global variable undefinedLikes, so
|
* undefined. Stores the names in the global variable undefinedLikes, so
|
||||||
* that e.g. markRequiredIfNeeded can use these.
|
* that e.g. markRequiredIfNeeded can use these.
|
||||||
|
* @param {Array} doclets The doclets.
|
||||||
*/
|
*/
|
||||||
function findTypesLikeUndefined(doclets) {
|
function findTypesLikeUndefined(doclets) {
|
||||||
undefinedLikes = ['undefined']; // include type 'undefined' explicitly
|
undefinedLikes = ['undefined']; // include type 'undefined' explicitly
|
||||||
for (var i = doclets.length - 1; i >= 0; --i) {
|
for (let i = doclets.length - 1; i >= 0; --i) {
|
||||||
var doclet = doclets[i];
|
const doclet = doclets[i];
|
||||||
if(doclet.kind === 'typedef') {
|
if (doclet.kind === 'typedef') {
|
||||||
var types = doclet.type.names;
|
const types = doclet.type.names;
|
||||||
if (types.indexOf('undefined') !== -1) {
|
if (types.indexOf('undefined') !== -1) {
|
||||||
// the typedef contains 'undefined', so it self is undefinedLike.
|
// the typedef contains 'undefined', so it self is undefinedLike.
|
||||||
undefinedLikes.push(doclet.longname);
|
undefinedLikes.push(doclet.longname);
|
||||||
@@ -87,20 +66,8 @@ function findTypesLikeUndefined(doclets) {
|
|||||||
exports.handlers = {
|
exports.handlers = {
|
||||||
|
|
||||||
newDoclet: function(e) {
|
newDoclet: function(e) {
|
||||||
var doclet = e.doclet;
|
const doclet = e.doclet;
|
||||||
if (doclet.meta.filename == 'olx.js') {
|
if (doclet.isEnum) {
|
||||||
if (doclet.kind == 'typedef') {
|
|
||||||
lastOlxTypedef = doclet;
|
|
||||||
olxTypeNames.push(doclet.longname);
|
|
||||||
olxTypes[doclet.longname] = [];
|
|
||||||
doclet.properties = [];
|
|
||||||
} else if (lastOlxTypedef && doclet.memberof == lastOlxTypedef.longname) {
|
|
||||||
lastOlxTypedef.properties.push(doclet);
|
|
||||||
olxTypes[lastOlxTypedef.longname].push(doclet);
|
|
||||||
} else {
|
|
||||||
lastOlxTypedef = null;
|
|
||||||
}
|
|
||||||
} else if (doclet.isEnum) {
|
|
||||||
// We never export enums, so we document them like typedefs
|
// We never export enums, so we document them like typedefs
|
||||||
doclet.kind = 'typedef';
|
doclet.kind = 'typedef';
|
||||||
delete doclet.isEnum;
|
delete doclet.isEnum;
|
||||||
@@ -108,15 +75,10 @@ exports.handlers = {
|
|||||||
},
|
},
|
||||||
|
|
||||||
parseComplete: function(e) {
|
parseComplete: function(e) {
|
||||||
var doclets = e.doclets;
|
const doclets = e.doclets;
|
||||||
findTypesLikeUndefined(doclets);
|
findTypesLikeUndefined(doclets);
|
||||||
for (var i = doclets.length - 1; i >= 0; --i) {
|
for (let i = doclets.length - 1; i >= 0; --i) {
|
||||||
var doclet = doclets[i];
|
markRequiredIfNeeded(doclets[i]);
|
||||||
var params = doclet.params;
|
|
||||||
if (params) {
|
|
||||||
addSubparams(params);
|
|
||||||
}
|
|
||||||
markRequiredIfNeeded(doclet);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -47,21 +47,6 @@ ol.MapBrowserEventType = {
|
|||||||
```
|
```
|
||||||
Note the value of the `@event` annotation. The text before the hash refers to the event class that the event belongs to, and the text after the hash is the type of the event.
|
Note the value of the `@event` annotation. The text before the hash refers to the event class that the event belongs to, and the text after the hash is the type of the event.
|
||||||
|
|
||||||
To export event properties, they need to be defined in `externs/oli.js` (also see `readme.md` in `externs/`) and marked with an @api annotation:
|
|
||||||
```js
|
|
||||||
/** @interface */
|
|
||||||
oli.MapBrowserEvent;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @type {ol.Coordinate}
|
|
||||||
* @api
|
|
||||||
*/
|
|
||||||
oli.MapBrowserEvent.prototype.coordinate;
|
|
||||||
|
|
||||||
// ...
|
|
||||||
|
|
||||||
};
|
|
||||||
```
|
|
||||||
To document which events are fired by a class or method, the `@fires` annotation is used:
|
To document which events are fired by a class or method, the `@fires` annotation is used:
|
||||||
```js
|
```js
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -1,152 +1,164 @@
|
|||||||
/*global env: true */
|
/*global env: true */
|
||||||
var template = require('jsdoc/lib/jsdoc/template'),
|
|
||||||
fs = require('jsdoc/lib/jsdoc/fs'),
|
const hasOwnProp = Object.prototype.hasOwnProperty;
|
||||||
path = require('jsdoc/lib/jsdoc/path'),
|
|
||||||
taffy = require('taffydb').taffy,
|
// Work around an issue with hasOwnProperty in JSDoc's templateHelper.js.
|
||||||
handle = require('jsdoc/lib/jsdoc/util/error').handle,
|
//TODO Fix in JSDoc.
|
||||||
helper = require('jsdoc/lib/jsdoc/util/templateHelper'),
|
Object.prototype.hasOwnProperty = function(property) {
|
||||||
_ = require('underscore'),
|
return property in this;
|
||||||
htmlsafe = helper.htmlsafe,
|
};
|
||||||
linkto = helper.linkto,
|
|
||||||
resolveAuthorLinks = helper.resolveAuthorLinks,
|
const template = require('jsdoc/lib/jsdoc/template');
|
||||||
scopeToPunc = helper.scopeToPunc,
|
const fs = require('jsdoc/lib/jsdoc/fs');
|
||||||
hasOwnProp = Object.prototype.hasOwnProperty,
|
const path = require('jsdoc/lib/jsdoc/path');
|
||||||
data,
|
const taffy = require('taffydb').taffy;
|
||||||
view,
|
const handle = require('jsdoc/lib/jsdoc/util/error').handle;
|
||||||
outdir = env.opts.destination;
|
const helper = require('jsdoc/lib/jsdoc/util/templateHelper');
|
||||||
|
const _ = require('underscore');
|
||||||
|
const htmlsafe = helper.htmlsafe;
|
||||||
|
const linkto = helper.linkto;
|
||||||
|
const resolveAuthorLinks = helper.resolveAuthorLinks;
|
||||||
|
const outdir = env.opts.destination;
|
||||||
|
|
||||||
|
// Work around an issue with hasOwnProperty in JSDoc's templateHelper.js.
|
||||||
|
//TODO Fix in JSDoc.
|
||||||
|
Object.prototype.hasOwnProperty = hasOwnProp;
|
||||||
|
|
||||||
|
let view;
|
||||||
|
let data;
|
||||||
|
|
||||||
function find(spec) {
|
function find(spec) {
|
||||||
return helper.find(data, spec);
|
return helper.find(data, spec);
|
||||||
}
|
}
|
||||||
|
|
||||||
function tutoriallink(tutorial) {
|
function tutoriallink(tutorial) {
|
||||||
return helper.toTutorial(tutorial, null, { tag: 'em', classname: 'disabled', prefix: 'Tutorial: ' });
|
return helper.toTutorial(tutorial, null, {tag: 'em', classname: 'disabled', prefix: 'Tutorial: '});
|
||||||
}
|
}
|
||||||
|
|
||||||
function getAncestorLinks(doclet) {
|
function getAncestorLinks(doclet) {
|
||||||
return helper.getAncestorLinks(data, doclet);
|
return helper.getAncestorLinks(data, doclet);
|
||||||
}
|
}
|
||||||
|
|
||||||
function hashToLink(doclet, hash) {
|
function hashToLink(doclet, hash) {
|
||||||
if ( !/^(#.+)/.test(hash) ) { return hash; }
|
if (!/^(#.+)/.test(hash)) {
|
||||||
|
return hash;
|
||||||
|
}
|
||||||
|
|
||||||
var url = helper.createLink(doclet);
|
let url = helper.createLink(doclet);
|
||||||
|
|
||||||
url = url.replace(/(#.+|$)/, hash);
|
url = url.replace(/(#.+|$)/, hash);
|
||||||
return '<a href="' + url + '">' + hash + '</a>';
|
return '<a href="' + url + '">' + hash + '</a>';
|
||||||
}
|
}
|
||||||
|
|
||||||
function needsSignature(doclet) {
|
function needsSignature(doclet) {
|
||||||
var needsSig = false;
|
let needsSig = false;
|
||||||
|
|
||||||
// function and class definitions always get a signature
|
// function and class definitions always get a signature
|
||||||
if (doclet.kind === 'function' || doclet.kind === 'class') {
|
if (doclet.kind === 'function' || doclet.kind === 'class') {
|
||||||
needsSig = true;
|
needsSig = true;
|
||||||
}
|
} else if (doclet.kind === 'typedef' && doclet.type && doclet.type.names &&
|
||||||
|
doclet.type.names.length) {
|
||||||
// typedefs that contain functions get a signature, too
|
// typedefs that contain functions get a signature, too
|
||||||
else if (doclet.kind === 'typedef' && doclet.type && doclet.type.names &&
|
for (let i = 0, l = doclet.type.names.length; i < l; i++) {
|
||||||
doclet.type.names.length) {
|
if (doclet.type.names[i].toLowerCase() === 'function') {
|
||||||
for (var i = 0, l = doclet.type.names.length; i < l; i++) {
|
needsSig = true;
|
||||||
if (doclet.type.names[i].toLowerCase() === 'function') {
|
break;
|
||||||
needsSig = true;
|
}
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return needsSig;
|
return needsSig;
|
||||||
}
|
}
|
||||||
|
|
||||||
function addSignatureParams(f) {
|
function addSignatureParams(f) {
|
||||||
var params = helper.getSignatureParams(f, 'optional');
|
const params = helper.getSignatureParams(f, 'optional');
|
||||||
|
|
||||||
f.signature = (f.signature || '') + '('+params.join(', ')+')';
|
f.signature = (f.signature || '') + '(' + params.join(', ') + ')';
|
||||||
}
|
}
|
||||||
|
|
||||||
function addSignatureReturns(f) {
|
function addSignatureReturns(f) {
|
||||||
var returnTypes = helper.getSignatureReturns(f);
|
const returnTypes = helper.getSignatureReturns(f);
|
||||||
|
|
||||||
f.signature = '<span class="signature">'+(f.signature || '') + '</span>';
|
f.signature = '<span class="signature">' + (f.signature || '') + '</span>';
|
||||||
|
|
||||||
if (returnTypes.length) {
|
if (returnTypes.length) {
|
||||||
f.signature += '<span class="glyphicon glyphicon-circle-arrow-right"></span><span class="type-signature returnType">'+(returnTypes.length ? '{'+returnTypes.join('|')+'}' : '')+'</span>';
|
f.signature += '<span class="glyphicon glyphicon-circle-arrow-right"></span><span class="type-signature returnType">' + (returnTypes.length ? '{' + returnTypes.join('|') + '}' : '') + '</span>';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function addSignatureTypes(f) {
|
function addSignatureTypes(f) {
|
||||||
var types = helper.getSignatureTypes(f);
|
const types = helper.getSignatureTypes(f);
|
||||||
|
|
||||||
f.signature = (f.signature || '') + '<span class="type-signature">'+(types.length? ' :'+types.join('|') : '')+' </span>';
|
f.signature = (f.signature || '') + '<span class="type-signature">' + (types.length ? ' :' + types.join('|') : '') + ' </span>';
|
||||||
}
|
}
|
||||||
|
|
||||||
function shortenPaths(files, commonPrefix) {
|
function shortenPaths(files, commonPrefix) {
|
||||||
// always use forward slashes
|
// always use forward slashes
|
||||||
var regexp = new RegExp('\\\\', 'g');
|
const regexp = new RegExp('\\\\', 'g');
|
||||||
|
|
||||||
Object.keys(files).forEach(function(file) {
|
Object.keys(files).forEach(function(file) {
|
||||||
files[file].shortened = files[file].resolved.replace(commonPrefix, '')
|
files[file].shortened = files[file].resolved.replace(commonPrefix, '')
|
||||||
.replace(regexp, '/');
|
.replace(regexp, '/');
|
||||||
});
|
});
|
||||||
|
|
||||||
return files;
|
return files;
|
||||||
}
|
}
|
||||||
|
|
||||||
function resolveSourcePath(filepath) {
|
function resolveSourcePath(filepath) {
|
||||||
return path.resolve(process.cwd(), filepath);
|
return path.resolve(process.cwd(), filepath);
|
||||||
}
|
}
|
||||||
|
|
||||||
function getPathFromDoclet(doclet) {
|
function getPathFromDoclet(doclet) {
|
||||||
if (!doclet.meta) {
|
if (!doclet.meta) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
var filepath = doclet.meta.path && doclet.meta.path !== 'null' ?
|
const filepath = doclet.meta.path && doclet.meta.path !== 'null' ?
|
||||||
doclet.meta.path + '/' + doclet.meta.filename.split(/[\/\\]/).pop() :
|
doclet.meta.path + '/' + doclet.meta.filename.split(/[\/\\]/).pop() :
|
||||||
doclet.meta.filename;
|
doclet.meta.filename;
|
||||||
|
|
||||||
return filepath;
|
return filepath;
|
||||||
}
|
}
|
||||||
|
|
||||||
function generate(title, docs, filename, resolveLinks) {
|
function generate(title, docs, filename, resolveLinks) {
|
||||||
resolveLinks = resolveLinks === false ? false : true;
|
resolveLinks = resolveLinks === false ? false : true;
|
||||||
|
|
||||||
var docData = {
|
const docData = {
|
||||||
filename: filename,
|
filename: filename,
|
||||||
title: title,
|
title: title,
|
||||||
docs: docs,
|
docs: docs,
|
||||||
packageInfo: ( find({kind: 'package'}) || [] ) [0]
|
packageInfo: (find({kind: 'package'}) || []) [0]
|
||||||
};
|
};
|
||||||
|
|
||||||
var outpath = path.join(outdir, filename),
|
const outpath = path.join(outdir, filename);
|
||||||
html = view.render('container.tmpl', docData);
|
let html = view.render('container.tmpl', docData);
|
||||||
|
|
||||||
if (resolveLinks) {
|
if (resolveLinks) {
|
||||||
html = helper.resolveLinks(html); // turn {@link foo} into <a href="foodoc.html">foo</a>
|
html = helper.resolveLinks(html); // turn {@link foo} into <a href="foodoc.html">foo</a>
|
||||||
}
|
}
|
||||||
|
|
||||||
fs.writeFileSync(outpath, html, 'utf8');
|
fs.writeFileSync(outpath, html, 'utf8');
|
||||||
}
|
}
|
||||||
|
|
||||||
function generateSourceFiles(sourceFiles) {
|
function generateSourceFiles(sourceFiles) {
|
||||||
Object.keys(sourceFiles).forEach(function(file) {
|
Object.keys(sourceFiles).forEach(function(file) {
|
||||||
var source;
|
let source;
|
||||||
// links are keyed to the shortened path in each doclet's `meta.filename` property
|
// links are keyed to the shortened path in each doclet's `meta.filename` property
|
||||||
var sourceOutfile = helper.getUniqueFilename(sourceFiles[file].shortened);
|
const sourceOutfile = helper.getUniqueFilename(sourceFiles[file].shortened);
|
||||||
helper.registerLink(sourceFiles[file].shortened, sourceOutfile);
|
helper.registerLink(sourceFiles[file].shortened, sourceOutfile);
|
||||||
|
|
||||||
try {
|
try {
|
||||||
source = {
|
source = {
|
||||||
kind: 'source',
|
kind: 'source',
|
||||||
code: helper.htmlsafe( fs.readFileSync(sourceFiles[file].resolved, 'utf8') )
|
code: helper.htmlsafe(fs.readFileSync(sourceFiles[file].resolved, 'utf8'))
|
||||||
};
|
};
|
||||||
}
|
} catch (e) {
|
||||||
catch(e) {
|
handle(e);
|
||||||
handle(e);
|
}
|
||||||
}
|
|
||||||
|
|
||||||
generate('Source: ' + sourceFiles[file].shortened, [source], sourceOutfile,
|
generate('Source: ' + sourceFiles[file].shortened, [source], sourceOutfile,
|
||||||
false);
|
false);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -161,346 +173,348 @@ function generateSourceFiles(sourceFiles) {
|
|||||||
* @param {Array.<module:jsdoc/doclet.Doclet>} modules - The array of module doclets to search.
|
* @param {Array.<module:jsdoc/doclet.Doclet>} modules - The array of module doclets to search.
|
||||||
*/
|
*/
|
||||||
function attachModuleSymbols(doclets, modules) {
|
function attachModuleSymbols(doclets, modules) {
|
||||||
var symbols = {};
|
const symbols = {};
|
||||||
|
|
||||||
// build a lookup table
|
// build a lookup table
|
||||||
doclets.forEach(function(symbol) {
|
doclets.forEach(function(symbol) {
|
||||||
symbols[symbol.longname] = symbol;
|
symbols[symbol.longname] = symbol;
|
||||||
});
|
});
|
||||||
|
|
||||||
return modules.map(function(module) {
|
modules.forEach(function(module) {
|
||||||
if (symbols[module.longname]) {
|
if (symbols[module.longname]) {
|
||||||
module.module = symbols[module.longname];
|
module.module = symbols[module.longname];
|
||||||
module.module.name = module.module.name.replace('module:', 'require("') + '")';
|
module.module.name = module.module.name.replace('module:', 'require("') + '")';
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create the navigation sidebar.
|
* Create the navigation sidebar.
|
||||||
* @param {object} members The members that will be used to create the sidebar.
|
* @param {object} members The members that will be used to create the sidebar.
|
||||||
* @param {array<object>} members.classes
|
* @param {Array<Object>} members.classes Classes.
|
||||||
* @param {array<object>} members.externals
|
* @param {Array<Object>} members.externals Externals.
|
||||||
* @param {array<object>} members.globals
|
* @param {Array<Object>} members.globals Globals.
|
||||||
* @param {array<object>} members.mixins
|
* @param {Array<Object>} members.mixins Mixins.
|
||||||
* @param {array<object>} members.modules
|
* @param {Array<Object>} members.modules Modules.
|
||||||
* @param {array<object>} members.namespaces
|
* @param {Array<Object>} members.namespaces Namespaces.
|
||||||
* @param {array<object>} members.tutorials
|
* @param {Array<Object>} members.tutorials Tutorials.
|
||||||
* @param {array<object>} members.events
|
* @param {Array<Object>} members.events Events.
|
||||||
* @return {string} The HTML for the navigation sidebar.
|
* @return {string} The HTML for the navigation sidebar.
|
||||||
*/
|
*/
|
||||||
function buildNav(members) {
|
function buildNav(members) {
|
||||||
var nav = [];
|
const nav = [];
|
||||||
// merge namespaces and classes, then sort
|
// merge namespaces and classes, then sort
|
||||||
var merged = members.namespaces.concat(members.classes);
|
const merged = members.modules.concat(members.classes);
|
||||||
merged.sort(function (a, b) {
|
merged.sort(function(a, b) {
|
||||||
if (a.longname > b.longname)
|
if (a.longname > b.longname) {
|
||||||
return 1;
|
return 1;
|
||||||
if (a.longname < b.longname)
|
}
|
||||||
return -1;
|
if (a.longname < b.longname) {
|
||||||
return 0;
|
return -1;
|
||||||
});
|
}
|
||||||
_.each(merged, function (v) {
|
return 0;
|
||||||
// exclude 'olx' and interfaces from sidebar
|
});
|
||||||
if (v.longname.indexOf('olx') !== 0 && v.interface !== true) {
|
_.each(merged, function(v) {
|
||||||
if (v.kind == 'namespace') {
|
// exclude interfaces from sidebar
|
||||||
nav.push({
|
if (v.interface !== true) {
|
||||||
type: 'namespace',
|
if (v.kind == 'module') {
|
||||||
longname: v.longname,
|
nav.push({
|
||||||
name: v.name,
|
type: 'module',
|
||||||
members: find({
|
longname: v.longname,
|
||||||
kind: 'member',
|
name: v.name,
|
||||||
memberof: v.longname
|
members: find({
|
||||||
}),
|
kind: 'member',
|
||||||
methods: find({
|
memberof: v.longname
|
||||||
kind: 'function',
|
}),
|
||||||
memberof: v.longname
|
methods: find({
|
||||||
}),
|
kind: 'function',
|
||||||
typedefs: find({
|
memberof: v.longname
|
||||||
kind: 'typedef',
|
}),
|
||||||
memberof: v.longname
|
typedefs: find({
|
||||||
}),
|
kind: 'typedef',
|
||||||
events: find({
|
memberof: v.longname
|
||||||
kind: 'event',
|
}),
|
||||||
memberof: v.longname
|
events: find({
|
||||||
})
|
kind: 'event',
|
||||||
});
|
memberof: v.longname
|
||||||
}
|
})
|
||||||
if (v.kind == 'class') {
|
});
|
||||||
nav.push({
|
|
||||||
type: 'class',
|
|
||||||
longname: v.longname,
|
|
||||||
name: v.name,
|
|
||||||
members: find({
|
|
||||||
kind: 'member',
|
|
||||||
memberof: v.longname
|
|
||||||
}),
|
|
||||||
methods: find({
|
|
||||||
kind: 'function',
|
|
||||||
memberof: v.longname
|
|
||||||
}),
|
|
||||||
typedefs: find({
|
|
||||||
kind: 'typedef',
|
|
||||||
memberof: v.longname
|
|
||||||
}),
|
|
||||||
fires: v.fires,
|
|
||||||
events: find({
|
|
||||||
kind: 'event',
|
|
||||||
memberof: v.longname
|
|
||||||
})
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
});
|
if (v.kind == 'class') {
|
||||||
return nav;
|
nav.push({
|
||||||
|
type: 'class',
|
||||||
|
longname: v.longname,
|
||||||
|
name: v.name,
|
||||||
|
members: find({
|
||||||
|
kind: 'member',
|
||||||
|
memberof: v.longname
|
||||||
|
}),
|
||||||
|
methods: find({
|
||||||
|
kind: 'function',
|
||||||
|
memberof: v.longname
|
||||||
|
}),
|
||||||
|
typedefs: find({
|
||||||
|
kind: 'typedef',
|
||||||
|
memberof: v.longname
|
||||||
|
}),
|
||||||
|
fires: v.fires,
|
||||||
|
events: find({
|
||||||
|
kind: 'event',
|
||||||
|
memberof: v.longname
|
||||||
|
})
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
return nav;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@param {TAFFY} taffyData See <http://taffydb.com/>.
|
* @param {Object} taffyData See <http://taffydb.com/>.
|
||||||
@param {object} opts
|
* @param {Object} opts Options.
|
||||||
@param {Tutorial} tutorials
|
* @param {Object} tutorials Tutorials.
|
||||||
*/
|
*/
|
||||||
exports.publish = function(taffyData, opts, tutorials) {
|
exports.publish = function(taffyData, opts, tutorials) {
|
||||||
data = taffyData;
|
data = taffyData;
|
||||||
|
|
||||||
var conf = env.conf.templates || {};
|
const conf = env.conf.templates || {};
|
||||||
conf['default'] = conf['default'] || {};
|
conf['default'] = conf['default'] || {};
|
||||||
|
|
||||||
var templatePath = opts.template;
|
const templatePath = opts.template;
|
||||||
view = new template.Template(templatePath + '/tmpl');
|
view = new template.Template(templatePath + '/tmpl');
|
||||||
|
|
||||||
// claim some special filenames in advance, so the All-Powerful Overseer of Filename Uniqueness
|
// claim some special filenames in advance, so the All-Powerful Overseer of Filename Uniqueness
|
||||||
// doesn't try to hand them out later
|
// doesn't try to hand them out later
|
||||||
var indexUrl = helper.getUniqueFilename('index');
|
const indexUrl = helper.getUniqueFilename('index');
|
||||||
// don't call registerLink() on this one! 'index' is also a valid longname
|
// don't call registerLink() on this one! 'index' is also a valid longname
|
||||||
|
|
||||||
var globalUrl = helper.getUniqueFilename('global');
|
const globalUrl = helper.getUniqueFilename('global');
|
||||||
helper.registerLink('global', globalUrl);
|
helper.registerLink('global', globalUrl);
|
||||||
|
|
||||||
// set up templating
|
// set up templating
|
||||||
view.layout = 'layout.tmpl';
|
view.layout = 'layout.tmpl';
|
||||||
|
|
||||||
// set up tutorials for helper
|
// set up tutorials for helper
|
||||||
helper.setTutorials(tutorials);
|
helper.setTutorials(tutorials);
|
||||||
|
|
||||||
data = helper.prune(data);
|
data = helper.prune(data);
|
||||||
data.sort('longname, version, since');
|
data.sort('longname, version, since');
|
||||||
helper.addEventListeners(data);
|
helper.addEventListeners(data);
|
||||||
|
|
||||||
var sourceFiles = {};
|
let sourceFiles = {};
|
||||||
var sourceFilePaths = [];
|
const sourceFilePaths = [];
|
||||||
data().each(function(doclet) {
|
data().each(function(doclet) {
|
||||||
doclet.attribs = '';
|
doclet.attribs = '';
|
||||||
|
|
||||||
if (doclet.examples) {
|
if (doclet.examples) {
|
||||||
doclet.examples = doclet.examples.map(function(example) {
|
doclet.examples = doclet.examples.map(function(example) {
|
||||||
var caption, code;
|
let caption, code;
|
||||||
|
|
||||||
if (example.match(/^\s*<caption>([\s\S]+?)<\/caption>(\s*[\n\r])([\s\S]+)$/i)) {
|
if (example.match(/^\s*<caption>([\s\S]+?)<\/caption>(\s*[\n\r])([\s\S]+)$/i)) {
|
||||||
caption = RegExp.$1;
|
caption = RegExp.$1;
|
||||||
code = RegExp.$3;
|
code = RegExp.$3;
|
||||||
}
|
|
||||||
|
|
||||||
return {
|
|
||||||
caption: caption || '',
|
|
||||||
code: code || example
|
|
||||||
};
|
|
||||||
});
|
|
||||||
}
|
|
||||||
if (doclet.see) {
|
|
||||||
doclet.see.forEach(function(seeItem, i) {
|
|
||||||
doclet.see[i] = hashToLink(doclet, seeItem);
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// build a list of source files
|
return {
|
||||||
var sourcePath;
|
caption: caption || '',
|
||||||
var resolvedSourcePath;
|
code: code || example
|
||||||
if (doclet.meta) {
|
};
|
||||||
sourcePath = getPathFromDoclet(doclet);
|
});
|
||||||
resolvedSourcePath = resolveSourcePath(sourcePath);
|
}
|
||||||
sourceFiles[sourcePath] = {
|
if (doclet.see) {
|
||||||
resolved: resolvedSourcePath,
|
doclet.see.forEach(function(seeItem, i) {
|
||||||
shortened: null
|
doclet.see[i] = hashToLink(doclet, seeItem);
|
||||||
};
|
});
|
||||||
sourceFilePaths.push(resolvedSourcePath);
|
}
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
fs.mkPath(outdir);
|
// build a list of source files
|
||||||
|
let sourcePath;
|
||||||
|
let resolvedSourcePath;
|
||||||
|
if (doclet.meta) {
|
||||||
|
sourcePath = getPathFromDoclet(doclet);
|
||||||
|
resolvedSourcePath = resolveSourcePath(sourcePath);
|
||||||
|
sourceFiles[sourcePath] = {
|
||||||
|
resolved: resolvedSourcePath,
|
||||||
|
shortened: null
|
||||||
|
};
|
||||||
|
sourceFilePaths.push(resolvedSourcePath);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
// copy the template's static files to outdir
|
fs.mkPath(outdir);
|
||||||
var fromDir = path.join(templatePath, 'static');
|
|
||||||
var staticFiles = fs.ls(fromDir, 3);
|
|
||||||
|
|
||||||
staticFiles.forEach(function(fileName) {
|
// copy the template's static files to outdir
|
||||||
var toDir = fs.toDir( fileName.replace(fromDir, outdir) );
|
const fromDir = path.join(templatePath, 'static');
|
||||||
|
const staticFiles = fs.ls(fromDir, 3);
|
||||||
|
|
||||||
|
staticFiles.forEach(function(fileName) {
|
||||||
|
const toDir = fs.toDir(fileName.replace(fromDir, outdir));
|
||||||
|
fs.mkPath(toDir);
|
||||||
|
fs.copyFileSync(fileName, toDir);
|
||||||
|
});
|
||||||
|
|
||||||
|
// copy user-specified static files to outdir
|
||||||
|
let staticFilePaths;
|
||||||
|
let staticFileFilter;
|
||||||
|
let staticFileScanner;
|
||||||
|
if (conf['default'].staticFiles) {
|
||||||
|
staticFilePaths = conf['default'].staticFiles.paths || [];
|
||||||
|
staticFileFilter = new (require('jsdoc/lib/jsdoc/src/filter')).Filter(conf['default'].staticFiles);
|
||||||
|
staticFileScanner = new (require('jsdoc/lib/jsdoc/src/scanner')).Scanner();
|
||||||
|
|
||||||
|
staticFilePaths.forEach(function(filePath) {
|
||||||
|
const extraStaticFiles = staticFileScanner.scan([filePath], 10, staticFileFilter);
|
||||||
|
|
||||||
|
extraStaticFiles.forEach(function(fileName) {
|
||||||
|
const sourcePath = fs.statSync(filePath).isDirectory() ? filePath :
|
||||||
|
path.dirname(filePath);
|
||||||
|
const toDir = fs.toDir(fileName.replace(sourcePath, outdir));
|
||||||
fs.mkPath(toDir);
|
fs.mkPath(toDir);
|
||||||
fs.copyFileSync(fileName, toDir);
|
fs.copyFileSync(fileName, toDir);
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
}
|
||||||
|
|
||||||
// copy user-specified static files to outdir
|
if (sourceFilePaths.length) {
|
||||||
var staticFilePaths;
|
sourceFiles = shortenPaths(sourceFiles, path.commonPrefix(sourceFilePaths));
|
||||||
var staticFileFilter;
|
}
|
||||||
var staticFileScanner;
|
data().each(function(doclet) {
|
||||||
if (conf['default'].staticFiles) {
|
const url = helper.createLink(doclet);
|
||||||
staticFilePaths = conf['default'].staticFiles.paths || [];
|
helper.registerLink(doclet.longname, url);
|
||||||
staticFileFilter = new (require('jsdoc/lib/jsdoc/src/filter')).Filter(conf['default'].staticFiles);
|
|
||||||
staticFileScanner = new (require('jsdoc/lib/jsdoc/src/scanner')).Scanner();
|
|
||||||
|
|
||||||
staticFilePaths.forEach(function(filePath) {
|
// replace the filename with a shortened version of the full path
|
||||||
var extraStaticFiles = staticFileScanner.scan([filePath], 10, staticFileFilter);
|
let docletPath;
|
||||||
|
if (doclet.meta) {
|
||||||
|
docletPath = getPathFromDoclet(doclet);
|
||||||
|
docletPath = sourceFiles[docletPath].shortened;
|
||||||
|
if (docletPath) {
|
||||||
|
doclet.meta.filename = docletPath;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
extraStaticFiles.forEach(function(fileName) {
|
data().each(function(doclet) {
|
||||||
var sourcePath = fs.statSync(filePath).isDirectory() ? filePath :
|
const url = helper.longnameToUrl[doclet.longname];
|
||||||
path.dirname(filePath);
|
|
||||||
var toDir = fs.toDir( fileName.replace(sourcePath, outdir) );
|
if (url.indexOf('#') > -1) {
|
||||||
fs.mkPath(toDir);
|
doclet.id = helper.longnameToUrl[doclet.longname].split(/#/).pop();
|
||||||
fs.copyFileSync(fileName, toDir);
|
} else {
|
||||||
});
|
doclet.id = doclet.name;
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (sourceFilePaths.length) {
|
if (needsSignature(doclet)) {
|
||||||
sourceFiles = shortenPaths( sourceFiles, path.commonPrefix(sourceFilePaths) );
|
addSignatureParams(doclet);
|
||||||
|
addSignatureReturns(doclet);
|
||||||
}
|
}
|
||||||
data().each(function(doclet) {
|
});
|
||||||
var url = helper.createLink(doclet);
|
|
||||||
helper.registerLink(doclet.longname, url);
|
|
||||||
|
|
||||||
// replace the filename with a shortened version of the full path
|
// do this after the urls have all been generated
|
||||||
var docletPath;
|
data().each(function(doclet) {
|
||||||
if (doclet.meta) {
|
doclet.ancestors = getAncestorLinks(doclet);
|
||||||
docletPath = getPathFromDoclet(doclet);
|
|
||||||
docletPath = sourceFiles[docletPath].shortened;
|
|
||||||
if (docletPath) {
|
|
||||||
doclet.meta.filename = docletPath;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
data().each(function(doclet) {
|
if (doclet.kind === 'member') {
|
||||||
var url = helper.longnameToUrl[doclet.longname];
|
addSignatureTypes(doclet);
|
||||||
|
|
||||||
if (url.indexOf('#') > -1) {
|
|
||||||
doclet.id = helper.longnameToUrl[doclet.longname].split(/#/).pop();
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
doclet.id = doclet.name;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( needsSignature(doclet) ) {
|
|
||||||
addSignatureParams(doclet);
|
|
||||||
addSignatureReturns(doclet);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
// do this after the urls have all been generated
|
|
||||||
data().each(function(doclet) {
|
|
||||||
doclet.ancestors = getAncestorLinks(doclet);
|
|
||||||
|
|
||||||
if (doclet.kind === 'member') {
|
|
||||||
addSignatureTypes(doclet);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (doclet.kind === 'constant') {
|
|
||||||
addSignatureTypes(doclet);
|
|
||||||
doclet.kind = 'member';
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
var members = helper.getMembers(data);
|
|
||||||
members.tutorials = tutorials.children;
|
|
||||||
|
|
||||||
// add template helpers
|
|
||||||
view.find = find;
|
|
||||||
view.linkto = linkto;
|
|
||||||
view.resolveAuthorLinks = resolveAuthorLinks;
|
|
||||||
view.tutoriallink = tutoriallink;
|
|
||||||
view.htmlsafe = htmlsafe;
|
|
||||||
view.members = members; //@davidshimjs: To make navigation for customizing
|
|
||||||
|
|
||||||
// once for all
|
|
||||||
view.nav = buildNav(members);
|
|
||||||
attachModuleSymbols( find({ kind: ['class', 'function'], longname: {left: 'module:'} }),
|
|
||||||
members.modules );
|
|
||||||
|
|
||||||
// only output pretty-printed source files if requested; do this before generating any other
|
|
||||||
// pages, so the other pages can link to the source files
|
|
||||||
if (conf['default'].outputSourceFiles) {
|
|
||||||
generateSourceFiles(sourceFiles);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (members.globals.length) { generate('Global', [{kind: 'globalobj'}], globalUrl); }
|
if (doclet.kind === 'constant') {
|
||||||
|
addSignatureTypes(doclet);
|
||||||
|
doclet.kind = 'member';
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
// index page displays information from package.json and lists files
|
const members = helper.getMembers(data);
|
||||||
var files = find({kind: 'file'});
|
members.tutorials = tutorials.children;
|
||||||
|
|
||||||
generate('Index',
|
// add template helpers
|
||||||
[{kind: 'mainpage', readme: opts.readme, longname: (opts.mainpagetitle) ? opts.mainpagetitle : 'Main Page'}].concat(files),
|
view.find = find;
|
||||||
|
view.linkto = linkto;
|
||||||
|
view.resolveAuthorLinks = resolveAuthorLinks;
|
||||||
|
view.tutoriallink = tutoriallink;
|
||||||
|
view.htmlsafe = htmlsafe;
|
||||||
|
view.members = members; //@davidshimjs: To make navigation for customizing
|
||||||
|
|
||||||
|
// once for all
|
||||||
|
view.nav = buildNav(members);
|
||||||
|
attachModuleSymbols(find({kind: ['class', 'function'], longname: {left: 'module:'}}),
|
||||||
|
members.modules);
|
||||||
|
|
||||||
|
// only output pretty-printed source files if requested; do this before generating any other
|
||||||
|
// pages, so the other pages can link to the source files
|
||||||
|
if (conf['default'].outputSourceFiles) {
|
||||||
|
generateSourceFiles(sourceFiles);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (members.globals.length) {
|
||||||
|
generate('Global', [{kind: 'globalobj'}], globalUrl);
|
||||||
|
}
|
||||||
|
|
||||||
|
// index page displays information from package.json and lists files
|
||||||
|
const files = find({kind: 'file'});
|
||||||
|
|
||||||
|
generate('Index',
|
||||||
|
[{kind: 'mainpage', readme: opts.readme, longname: (opts.mainpagetitle) ? opts.mainpagetitle : 'Main Page'}].concat(files),
|
||||||
indexUrl);
|
indexUrl);
|
||||||
|
|
||||||
// set up the lists that we'll use to generate pages
|
// set up the lists that we'll use to generate pages
|
||||||
var classes = taffy(members.classes);
|
const classes = taffy(members.classes);
|
||||||
var modules = taffy(members.modules);
|
const modules = taffy(members.modules);
|
||||||
var namespaces = taffy(members.namespaces);
|
const namespaces = taffy(members.namespaces);
|
||||||
var mixins = taffy(members.mixins);
|
const mixins = taffy(members.mixins);
|
||||||
var externals = taffy(members.externals);
|
const externals = taffy(members.externals);
|
||||||
|
|
||||||
for (var longname in helper.longnameToUrl) {
|
for (const longname in helper.longnameToUrl) {
|
||||||
if ( hasOwnProp.call(helper.longnameToUrl, longname) ) {
|
if (hasOwnProp.call(helper.longnameToUrl, longname)) {
|
||||||
var myClasses = helper.find(classes, {longname: longname});
|
const myClasses = helper.find(classes, {longname: longname});
|
||||||
if (myClasses.length) {
|
if (myClasses.length) {
|
||||||
generate('Class: ' + myClasses[0].name, myClasses, helper.longnameToUrl[longname]);
|
generate('Class: ' + myClasses[0].name, myClasses, helper.longnameToUrl[longname]);
|
||||||
}
|
}
|
||||||
|
|
||||||
var myModules = helper.find(modules, {longname: longname});
|
const myModules = helper.find(modules, {longname: longname});
|
||||||
if (myModules.length) {
|
if (myModules.length) {
|
||||||
generate('Module: ' + myModules[0].name, myModules, helper.longnameToUrl[longname]);
|
generate('Module: ' + myModules[0].name, myModules, helper.longnameToUrl[longname]);
|
||||||
}
|
}
|
||||||
|
|
||||||
var myNamespaces = helper.find(namespaces, {longname: longname});
|
const myNamespaces = helper.find(namespaces, {longname: longname});
|
||||||
if (myNamespaces.length) {
|
if (myNamespaces.length) {
|
||||||
generate('Namespace: ' + myNamespaces[0].name, myNamespaces, helper.longnameToUrl[longname]);
|
generate('Namespace: ' + myNamespaces[0].name, myNamespaces, helper.longnameToUrl[longname]);
|
||||||
}
|
}
|
||||||
|
|
||||||
var myMixins = helper.find(mixins, {longname: longname});
|
const myMixins = helper.find(mixins, {longname: longname});
|
||||||
if (myMixins.length) {
|
if (myMixins.length) {
|
||||||
generate('Mixin: ' + myMixins[0].name, myMixins, helper.longnameToUrl[longname]);
|
generate('Mixin: ' + myMixins[0].name, myMixins, helper.longnameToUrl[longname]);
|
||||||
}
|
}
|
||||||
|
|
||||||
var myExternals = helper.find(externals, {longname: longname});
|
const myExternals = helper.find(externals, {longname: longname});
|
||||||
if (myExternals.length) {
|
if (myExternals.length) {
|
||||||
generate('External: ' + myExternals[0].name, myExternals, helper.longnameToUrl[longname]);
|
generate('External: ' + myExternals[0].name, myExternals, helper.longnameToUrl[longname]);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// TODO: move the tutorial functions to templateHelper.js
|
// TODO: move the tutorial functions to templateHelper.js
|
||||||
function generateTutorial(title, tutorial, filename) {
|
function generateTutorial(title, tutorial, filename) {
|
||||||
var tutorialData = {
|
const tutorialData = {
|
||||||
title: title,
|
title: title,
|
||||||
header: tutorial.title,
|
header: tutorial.title,
|
||||||
content: tutorial.parse(),
|
content: tutorial.parse(),
|
||||||
children: tutorial.children
|
children: tutorial.children
|
||||||
};
|
};
|
||||||
|
|
||||||
var tutorialPath = path.join(outdir, filename),
|
let html = view.render('tutorial.tmpl', tutorialData);
|
||||||
html = view.render('tutorial.tmpl', tutorialData);
|
// yes, you can use {@link} in tutorials too!
|
||||||
|
html = helper.resolveLinks(html); // turn {@link foo} into <a href="foodoc.html">foo</a>
|
||||||
|
|
||||||
// yes, you can use {@link} in tutorials too!
|
const tutorialPath = path.join(outdir, filename);
|
||||||
html = helper.resolveLinks(html); // turn {@link foo} into <a href="foodoc.html">foo</a>
|
fs.writeFileSync(tutorialPath, html, 'utf8');
|
||||||
|
}
|
||||||
|
|
||||||
fs.writeFileSync(tutorialPath, html, 'utf8');
|
// tutorials can have only one parent so there is no risk for loops
|
||||||
}
|
function saveChildren(node) {
|
||||||
|
node.children.forEach(function(child) {
|
||||||
// tutorials can have only one parent so there is no risk for loops
|
generateTutorial('Tutorial: ' + child.title, child, helper.tutorialToUrl(child.name));
|
||||||
function saveChildren(node) {
|
saveChildren(child);
|
||||||
node.children.forEach(function(child) {
|
});
|
||||||
generateTutorial('Tutorial: ' + child.title, child, helper.tutorialToUrl(child.name));
|
}
|
||||||
saveChildren(child);
|
saveChildren(tutorials);
|
||||||
});
|
|
||||||
}
|
|
||||||
saveChildren(tutorials);
|
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -85,7 +85,7 @@ $(function () {
|
|||||||
var srcLinks = $('div.tag-source');
|
var srcLinks = $('div.tag-source');
|
||||||
srcLinks.each(function(i, el) {
|
srcLinks.each(function(i, el) {
|
||||||
var textParts = el.innerHTML.trim().split(', ');
|
var textParts = el.innerHTML.trim().split(', ');
|
||||||
var link = 'https://github.com/openlayers/openlayers/blob/v' + currentVersion + '/' +
|
var link = 'https://github.com/openlayers/openlayers/blob/v' + currentVersion + '/src/ol/' +
|
||||||
textParts[0];
|
textParts[0];
|
||||||
el.innerHTML = '<a href="' + link + '">' + textParts[0] + '</a>, ' +
|
el.innerHTML = '<a href="' + link + '">' + textParts[0] + '</a>, ' +
|
||||||
'<a href="' + link + textParts[1].replace('line ', '#L') + '">' +
|
'<a href="' + link + textParts[1].replace('line ', '#L') + '">' +
|
||||||
|
|||||||
@@ -20,12 +20,10 @@
|
|||||||
<br>
|
<br>
|
||||||
<?js if (doc.stability || doc.kind == 'namespace') {
|
<?js if (doc.stability || doc.kind == 'namespace') {
|
||||||
var ancestors = doc.ancestors.map(a => a.replace(/>\./g, '>').replace(/\.</g, '<')).join('/');
|
var ancestors = doc.ancestors.map(a => a.replace(/>\./g, '>').replace(/\.</g, '<')).join('/');
|
||||||
var name = doc.name.toLowerCase();
|
|
||||||
var parts = [];
|
var parts = [];
|
||||||
if (ancestors) {
|
if (ancestors) {
|
||||||
parts.push(ancestors);
|
parts.push(ancestors.split('~').shift());
|
||||||
}
|
}
|
||||||
parts.push(name);
|
|
||||||
var importPath = parts.join('/');
|
var importPath = parts.join('/');
|
||||||
?>
|
?>
|
||||||
<pre class="prettyprint source"><code>import <?js= doc.name ?> from '<?js= importPath ?>';</code></pre>
|
<pre class="prettyprint source"><code>import <?js= doc.name ?> from '<?js= importPath ?>';</code></pre>
|
||||||
|
|||||||
@@ -11,7 +11,7 @@ var self = this;
|
|||||||
?>
|
?>
|
||||||
<li class="item" data-name="<?js= item.longname ?>">
|
<li class="item" data-name="<?js= item.longname ?>">
|
||||||
<span class="title">
|
<span class="title">
|
||||||
<?js= self.linkto(item.longname, item.longname) ?>
|
<?js= self.linkto(item.longname, item.longname.replace('module:', '')) ?>
|
||||||
<?js if (item.type === 'namespace' &&
|
<?js if (item.type === 'namespace' &&
|
||||||
(item.members.length + item.typedefs.length + item.methods.length +
|
(item.members.length + item.typedefs.length + item.methods.length +
|
||||||
item.events.length > 0)) { ?>
|
item.events.length > 0)) { ?>
|
||||||
|
|||||||
@@ -8,7 +8,7 @@
|
|||||||
<th>Name</th>
|
<th>Name</th>
|
||||||
<th>Type</th>
|
<th>Type</th>
|
||||||
<th>Settable</th>
|
<th>Settable</th>
|
||||||
<th><a href="ol.Object.Event.html">ol.Object.Event</a> type</th>
|
<th><a href="module-ol_Object-ObjectEvent.html">ol/Object~ObjectEvent</a> type</th>
|
||||||
<th class="last">Description</th>
|
<th class="last">Description</th>
|
||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ exports.defineTags = function(dictionary) {
|
|||||||
|
|
||||||
dictionary.defineTag('api', {
|
dictionary.defineTag('api', {
|
||||||
onTagged: function(doclet, tag) {
|
onTagged: function(doclet, tag) {
|
||||||
doclet.api = tag.text || 'experimental';
|
doclet.api = true;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@@ -11,7 +11,6 @@
|
|||||||
},
|
},
|
||||||
"plugins": [
|
"plugins": [
|
||||||
"config/jsdoc/info/api-plugin",
|
"config/jsdoc/info/api-plugin",
|
||||||
"config/jsdoc/info/define-plugin",
|
"config/jsdoc/info/module-plugin"
|
||||||
"config/jsdoc/info/virtual-plugin"
|
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,35 +0,0 @@
|
|||||||
/**
|
|
||||||
* @fileoverview This plugin extracts info from boolean defines. This only
|
|
||||||
* handles boolean defines with the default value in the description. Default
|
|
||||||
* is assumed to be provided with something like "default is `true`" (case
|
|
||||||
* insensitive, with or without ticks).
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
var DEFAULT_VALUE = /default\s+is\s+`?(true|false)`?/i;
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Hook to define new tags.
|
|
||||||
* @param {Object} dictionary The tag dictionary.
|
|
||||||
*/
|
|
||||||
exports.defineTags = function(dictionary) {
|
|
||||||
|
|
||||||
dictionary.defineTag('define', {
|
|
||||||
canHaveType: true,
|
|
||||||
mustHaveValue: true,
|
|
||||||
onTagged: function(doclet, tag) {
|
|
||||||
var types = tag.value.type.names;
|
|
||||||
if (types.length === 1 && types[0] === 'boolean') {
|
|
||||||
var match = tag.value.description.match(DEFAULT_VALUE);
|
|
||||||
if (match) {
|
|
||||||
doclet.define = {
|
|
||||||
default: match[1] === 'true'
|
|
||||||
};
|
|
||||||
doclet.description = tag.value.description;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
};
|
|
||||||
135
config/jsdoc/info/module-plugin.js
Normal file
135
config/jsdoc/info/module-plugin.js
Normal file
@@ -0,0 +1,135 @@
|
|||||||
|
const path = require('path');
|
||||||
|
|
||||||
|
const exportLookup = {};
|
||||||
|
const moduleLookup = {};
|
||||||
|
|
||||||
|
const MODULE_PATH = /^module:(.*)~(\w+)$/;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add exports to modules.
|
||||||
|
*/
|
||||||
|
exports.handlers = {
|
||||||
|
|
||||||
|
symbolFound(event) {
|
||||||
|
const filename = event.filename;
|
||||||
|
const node = event.astnode;
|
||||||
|
let local, exported;
|
||||||
|
switch (node.type) {
|
||||||
|
|
||||||
|
case 'ExportDefaultDeclaration': {
|
||||||
|
exported = 'default';
|
||||||
|
|
||||||
|
switch (node.declaration.type) {
|
||||||
|
|
||||||
|
case 'Identifier': {
|
||||||
|
// export default foo;
|
||||||
|
local = node.declaration.name;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case 'FunctionDeclaration': {
|
||||||
|
if (!node.declaration.id) {
|
||||||
|
// export default function() {}
|
||||||
|
local = '';
|
||||||
|
} else {
|
||||||
|
// export default function foo() {}
|
||||||
|
local = node.declaration.id.name;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
default: {
|
||||||
|
local = '';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case 'ExportNamedDeclaration': {
|
||||||
|
if (!node.declaration) {
|
||||||
|
// export {foo}
|
||||||
|
// export {foo as bar}
|
||||||
|
// handled below in ExportSpecifier
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (node.declaration.type) {
|
||||||
|
case 'FunctionDeclaration': {
|
||||||
|
if (!node.declaration.id) {
|
||||||
|
throw new Error(`Expected function declaration to have an id in ${filename}`);
|
||||||
|
}
|
||||||
|
const name = node.declaration.id.name;
|
||||||
|
local = name;
|
||||||
|
exported = name;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default: {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case 'ExportSpecifier': {
|
||||||
|
if (node.exported.type === 'Identifier') {
|
||||||
|
exported = node.exported.name;
|
||||||
|
if (node.local.type === 'Identifier') {
|
||||||
|
local = node.local.name;
|
||||||
|
if (node.parent.source) {
|
||||||
|
const resolved = path.resolve(path.dirname(filename), node.parent.source.value);
|
||||||
|
local = `module:${resolved}~${local}`;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
local = '';
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
default: {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!(filename in exportLookup)) {
|
||||||
|
exportLookup[filename] = {};
|
||||||
|
}
|
||||||
|
const exports = exportLookup[filename];
|
||||||
|
if (exports.hasOwnProperty(exported)) {
|
||||||
|
throw new Error(`Duplicate export {${local} as ${exported}} in ${filename}`);
|
||||||
|
}
|
||||||
|
exports[exported] = local;
|
||||||
|
},
|
||||||
|
|
||||||
|
newDoclet(event) {
|
||||||
|
const doclet = event.doclet;
|
||||||
|
if (doclet.kind === 'module') {
|
||||||
|
const filepath = path.join(doclet.meta.path, doclet.meta.filename);
|
||||||
|
if (filepath in moduleLookup) {
|
||||||
|
throw new Error(`Duplicate @module annotation in ${filepath}`);
|
||||||
|
}
|
||||||
|
moduleLookup[filepath] = doclet;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
parseComplete(event) {
|
||||||
|
for (const filepath in moduleLookup) {
|
||||||
|
const doclet = moduleLookup[filepath];
|
||||||
|
const exports = exportLookup[filepath];
|
||||||
|
for (const exported in exports) {
|
||||||
|
const local = exports[exported];
|
||||||
|
const match = local.match(MODULE_PATH);
|
||||||
|
if (match) {
|
||||||
|
const filepath = match[1];
|
||||||
|
const mod = moduleLookup[filepath];
|
||||||
|
if (mod) {
|
||||||
|
exports[exported] = `module:${mod.name}~${match[2]}`;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
doclet.exports = exports; // undefined if no exports
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
};
|
||||||
@@ -1,9 +1,8 @@
|
|||||||
/**
|
/**
|
||||||
* @fileoverview Generates JSON output based on exportable symbols (those with
|
* @fileoverview Generates JSON output based on exportable symbols.
|
||||||
* an api tag) and boolean defines (with a define tag and a default value).
|
|
||||||
*/
|
*/
|
||||||
var assert = require('assert');
|
const assert = require('assert');
|
||||||
var path = require('path');
|
const path = require('path');
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -15,72 +14,55 @@ var path = require('path');
|
|||||||
exports.publish = function(data, opts) {
|
exports.publish = function(data, opts) {
|
||||||
|
|
||||||
function getTypes(data) {
|
function getTypes(data) {
|
||||||
var types = [];
|
const types = [];
|
||||||
data.forEach(function(name) {
|
data.forEach(function(name) {
|
||||||
types.push(name.replace(/^function$/, 'Function'));
|
types.push(name.replace(/^function$/, 'Function'));
|
||||||
});
|
});
|
||||||
return types;
|
return types;
|
||||||
}
|
}
|
||||||
|
|
||||||
// get all doclets with the "api" property or define (excluding events) or
|
// get all doclets with the "api" property
|
||||||
// with olx namespace
|
const classes = {};
|
||||||
var classes = {};
|
const docs = data(
|
||||||
var docs = data(
|
[
|
||||||
[
|
{define: {isObject: true}},
|
||||||
{define: {isObject: true}},
|
function() {
|
||||||
function() {
|
if (this.kind == 'class') {
|
||||||
if (this.kind == 'class') {
|
if (!('extends' in this) || typeof this.api == 'boolean') {
|
||||||
if (!('extends' in this) || typeof this.api == 'string') {
|
classes[this.longname] = this;
|
||||||
classes[this.longname] = this;
|
return true;
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return (typeof this.api == 'string' ||
|
|
||||||
this.meta && (/[\\\/]externs$/).test(this.meta.path));
|
|
||||||
}
|
}
|
||||||
],
|
return (this.kind === 'module' || typeof this.api == 'boolean' ||
|
||||||
{kind: {'!is': 'file'}},
|
this.meta && (/[\\\/]externs$/).test(this.meta.path));
|
||||||
{kind: {'!is': 'event'}}).get();
|
}
|
||||||
|
],
|
||||||
|
{kind: {'!is': 'file'}},
|
||||||
|
{kind: {'!is': 'event'}}).get();
|
||||||
|
|
||||||
// get symbols data, filter out those that are members of private classes
|
// get symbols data, filter out those that are members of private classes
|
||||||
var symbols = [];
|
const symbols = [];
|
||||||
var defines = [];
|
const typedefs = [];
|
||||||
var typedefs = [];
|
const externs = [];
|
||||||
var externs = [];
|
const modules = [];
|
||||||
var base = [];
|
let base = [];
|
||||||
var augments = {};
|
const augments = {};
|
||||||
var symbolsByName = {};
|
const symbolsByName = {};
|
||||||
docs.filter(function(doc) {
|
docs.filter(function(doc) {
|
||||||
var include = true;
|
let include = true;
|
||||||
var constructor = doc.memberof;
|
const constructor = doc.memberof;
|
||||||
if (constructor && constructor.substr(-1) === '_') {
|
if (constructor && constructor.substr(-1) === '_' && constructor.indexOf('module:') === -1) {
|
||||||
assert.strictEqual(doc.inherited, true,
|
assert.strictEqual(doc.inherited, true,
|
||||||
'Unexpected export on private class: ' + doc.longname);
|
'Unexpected export on private class: ' + doc.longname);
|
||||||
include = false;
|
include = false;
|
||||||
}
|
}
|
||||||
return include;
|
return include;
|
||||||
}).forEach(function(doc) {
|
}).forEach(function(doc) {
|
||||||
var isExterns = (/[\\\/]externs$/).test(doc.meta.path);
|
if (doc.kind == 'module') {
|
||||||
if (isExterns && doc.longname.indexOf('olx.') === 0) {
|
modules.push({
|
||||||
if (doc.kind == 'typedef') {
|
|
||||||
typedefs.push({
|
|
||||||
name: doc.longname,
|
|
||||||
types: ['{}']
|
|
||||||
});
|
|
||||||
} else {
|
|
||||||
var typedef = typedefs[typedefs.length - 1];
|
|
||||||
var type = typedef.types[0];
|
|
||||||
typedef.types[0] = type
|
|
||||||
.replace(/\}$/, ', ' + doc.longname.split('#')[1] +
|
|
||||||
': (' + getTypes(doc.type.names).join('|') + ')}')
|
|
||||||
.replace('{, ', '{');
|
|
||||||
}
|
|
||||||
} else if (doc.define) {
|
|
||||||
defines.push({
|
|
||||||
name: doc.longname,
|
name: doc.longname,
|
||||||
description: doc.description,
|
exports: doc.exports || null,
|
||||||
path: path.join(doc.meta.path, doc.meta.filename),
|
path: path.join(doc.meta.path, doc.meta.filename)
|
||||||
default: doc.define.default
|
|
||||||
});
|
});
|
||||||
} else if (doc.kind == 'typedef' || doc.isEnum === true) {
|
} else if (doc.kind == 'typedef' || doc.isEnum === true) {
|
||||||
typedefs.push({
|
typedefs.push({
|
||||||
@@ -88,16 +70,18 @@ exports.publish = function(data, opts) {
|
|||||||
types: getTypes(doc.type.names)
|
types: getTypes(doc.type.names)
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
var symbol = {
|
const symbol = {
|
||||||
name: doc.longname,
|
name: doc.longname,
|
||||||
kind: doc.kind,
|
kind: doc.kind,
|
||||||
description: doc.classdesc || doc.description,
|
description: doc.classdesc || doc.description,
|
||||||
stability: doc.api,
|
|
||||||
path: path.join(doc.meta.path, doc.meta.filename)
|
path: path.join(doc.meta.path, doc.meta.filename)
|
||||||
};
|
};
|
||||||
if (doc.augments) {
|
if (doc.augments) {
|
||||||
symbol.extends = doc.augments[0];
|
symbol.extends = doc.augments[0];
|
||||||
}
|
}
|
||||||
|
if (doc.memberof) {
|
||||||
|
symbol.memberof = doc.memberof;
|
||||||
|
}
|
||||||
if (doc.virtual) {
|
if (doc.virtual) {
|
||||||
symbol.virtual = true;
|
symbol.virtual = true;
|
||||||
}
|
}
|
||||||
@@ -105,10 +89,11 @@ exports.publish = function(data, opts) {
|
|||||||
symbol.types = getTypes(doc.type.names);
|
symbol.types = getTypes(doc.type.names);
|
||||||
}
|
}
|
||||||
if (doc.params) {
|
if (doc.params) {
|
||||||
var params = [];
|
const params = [];
|
||||||
doc.params.forEach(function(param) {
|
doc.params.forEach(function(param) {
|
||||||
var paramInfo = {
|
const paramInfo = {
|
||||||
name: param.name
|
name: param.name,
|
||||||
|
description: param.description
|
||||||
};
|
};
|
||||||
params.push(paramInfo);
|
params.push(paramInfo);
|
||||||
paramInfo.types = getTypes(param.type.names);
|
paramInfo.types = getTypes(param.type.names);
|
||||||
@@ -142,10 +127,10 @@ exports.publish = function(data, opts) {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
var target = isExterns ? externs : (doc.api ? symbols : base);
|
const target = doc.api ? symbols : base;
|
||||||
var existingSymbol = symbolsByName[symbol.name];
|
const existingSymbol = symbolsByName[symbol.name];
|
||||||
if (existingSymbol) {
|
if (existingSymbol) {
|
||||||
var idx = target.indexOf(existingSymbol);
|
const idx = target.indexOf(existingSymbol);
|
||||||
target.splice(idx, 1);
|
target.splice(idx, 1);
|
||||||
}
|
}
|
||||||
target.push(symbol);
|
target.push(symbol);
|
||||||
@@ -169,13 +154,13 @@ exports.publish = function(data, opts) {
|
|||||||
|
|
||||||
return new Promise(function(resolve, reject) {
|
return new Promise(function(resolve, reject) {
|
||||||
process.stdout.write(
|
process.stdout.write(
|
||||||
JSON.stringify({
|
JSON.stringify({
|
||||||
symbols: symbols,
|
symbols: symbols,
|
||||||
defines: defines,
|
typedefs: typedefs,
|
||||||
typedefs: typedefs,
|
externs: externs,
|
||||||
externs: externs,
|
base: base,
|
||||||
base: base
|
modules: modules
|
||||||
}, null, 2));
|
}, null, 2));
|
||||||
});
|
});
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -1,16 +0,0 @@
|
|||||||
/**
|
|
||||||
* Handle the interface and abstract annotations.
|
|
||||||
* @param {Object} dictionary The tag dictionary.
|
|
||||||
*/
|
|
||||||
exports.defineTags = function(dictionary) {
|
|
||||||
|
|
||||||
var classTag = dictionary.lookUp('class');
|
|
||||||
dictionary.defineTag('interface', {
|
|
||||||
mustHaveValue: false,
|
|
||||||
onTagged: function(doclet, tag) {
|
|
||||||
classTag.onTagged.apply(this, arguments);
|
|
||||||
doclet.virtual = true;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
};
|
|
||||||
@@ -1,4 +0,0 @@
|
|||||||
{
|
|
||||||
"exports": ["*"],
|
|
||||||
"umd": true
|
|
||||||
}
|
|
||||||
@@ -1,38 +0,0 @@
|
|||||||
{
|
|
||||||
"exports": ["*"],
|
|
||||||
"umd": true,
|
|
||||||
"compile": {
|
|
||||||
"externs": [
|
|
||||||
"externs/bingmaps.js",
|
|
||||||
"externs/cartodb.js",
|
|
||||||
"externs/closure-compiler.js",
|
|
||||||
"externs/esrijson.js",
|
|
||||||
"externs/geojson.js",
|
|
||||||
"externs/oli.js",
|
|
||||||
"externs/olx.js",
|
|
||||||
"externs/proj4js.js",
|
|
||||||
"externs/tilejson.js",
|
|
||||||
"externs/topojson.js"
|
|
||||||
],
|
|
||||||
"define": [
|
|
||||||
"ol.DEBUG_WEBGL=false"
|
|
||||||
],
|
|
||||||
"jscomp_error": [
|
|
||||||
"*"
|
|
||||||
],
|
|
||||||
"jscomp_off": [
|
|
||||||
"lintChecks",
|
|
||||||
"analyzerChecks"
|
|
||||||
],
|
|
||||||
"extra_annotation_name": [
|
|
||||||
"api", "observable"
|
|
||||||
],
|
|
||||||
"rewrite_polyfills": "false",
|
|
||||||
"compilation_level": "ADVANCED",
|
|
||||||
"warning_level": "VERBOSE",
|
|
||||||
"use_types_for_optimization": true,
|
|
||||||
"manage_closure_dependencies": true,
|
|
||||||
"create_source_map": "build/ol.js.map",
|
|
||||||
"source_map_format": "V3"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
# Configuration Files
|
|
||||||
|
|
||||||
This directory includes configuration files for the build scripts in and documentation templates.
|
|
||||||
21
config/rollup.js
Normal file
21
config/rollup.js
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
// Rollup configuration for the full build
|
||||||
|
|
||||||
|
import noderesolve from 'rollup-plugin-node-resolve';
|
||||||
|
import commonjs from 'rollup-plugin-commonjs';
|
||||||
|
import {uglify} from 'rollup-plugin-uglify';
|
||||||
|
import buble from 'rollup-plugin-buble';
|
||||||
|
import sourcemaps from 'rollup-plugin-sourcemaps';
|
||||||
|
|
||||||
|
export default {
|
||||||
|
input: 'src/index.js',
|
||||||
|
output: [
|
||||||
|
{file: 'build/ol.js', format: 'iife', sourcemap: true}
|
||||||
|
],
|
||||||
|
plugins: [
|
||||||
|
noderesolve(),
|
||||||
|
commonjs(),
|
||||||
|
buble(),
|
||||||
|
uglify(),
|
||||||
|
sourcemaps()
|
||||||
|
]
|
||||||
|
};
|
||||||
18
css/ol.css
18
css/ol.css
@@ -44,10 +44,10 @@
|
|||||||
}
|
}
|
||||||
.ol-selectable {
|
.ol-selectable {
|
||||||
-webkit-touch-callout: default;
|
-webkit-touch-callout: default;
|
||||||
-webkit-user-select: auto;
|
-webkit-user-select: text;
|
||||||
-moz-user-select: auto;
|
-moz-user-select: text;
|
||||||
-ms-user-select: auto;
|
-ms-user-select: text;
|
||||||
user-select: auto;
|
user-select: text;
|
||||||
}
|
}
|
||||||
.ol-grabbing {
|
.ol-grabbing {
|
||||||
cursor: -webkit-grabbing;
|
cursor: -webkit-grabbing;
|
||||||
@@ -179,9 +179,6 @@
|
|||||||
.ol-attribution.ol-collapsed ul {
|
.ol-attribution.ol-collapsed ul {
|
||||||
display: none;
|
display: none;
|
||||||
}
|
}
|
||||||
.ol-attribution.ol-logo-only ul {
|
|
||||||
display: block;
|
|
||||||
}
|
|
||||||
.ol-attribution:not(.ol-collapsed) {
|
.ol-attribution:not(.ol-collapsed) {
|
||||||
background: rgba(255,255,255,0.8);
|
background: rgba(255,255,255,0.8);
|
||||||
}
|
}
|
||||||
@@ -192,17 +189,10 @@
|
|||||||
height: 1.1em;
|
height: 1.1em;
|
||||||
line-height: 1em;
|
line-height: 1em;
|
||||||
}
|
}
|
||||||
.ol-attribution.ol-logo-only {
|
|
||||||
background: transparent;
|
|
||||||
bottom: .4em;
|
|
||||||
height: 1.1em;
|
|
||||||
line-height: 1em;
|
|
||||||
}
|
|
||||||
.ol-attribution.ol-uncollapsible img {
|
.ol-attribution.ol-uncollapsible img {
|
||||||
margin-top: -.2em;
|
margin-top: -.2em;
|
||||||
max-height: 1.6em;
|
max-height: 1.6em;
|
||||||
}
|
}
|
||||||
.ol-attribution.ol-logo-only button,
|
|
||||||
.ol-attribution.ol-uncollapsible button {
|
.ol-attribution.ol-uncollapsible button {
|
||||||
display: none;
|
display: none;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -43,7 +43,7 @@ Unknown `serverType` configured.
|
|||||||
|
|
||||||
### 10
|
### 10
|
||||||
|
|
||||||
The default `geometryFunction` can only handle `ol.geom.Point` geometries.
|
The default `geometryFunction` can only handle `ol/geom/Point` geometries.
|
||||||
|
|
||||||
### 11
|
### 11
|
||||||
|
|
||||||
@@ -139,7 +139,7 @@ Invalid geometry layout. Must be `XY`, `XYZ`, `XYM` or `XYZM`.
|
|||||||
|
|
||||||
### 36
|
### 36
|
||||||
|
|
||||||
Unknown SRS type. Expected `"name"` or `"EPSG"`.
|
Unknown SRS type. Expected `"name"`.
|
||||||
|
|
||||||
### 37
|
### 37
|
||||||
|
|
||||||
@@ -165,14 +165,6 @@ Expected an `ol.style.Style` or an array of `ol.style.Style`.
|
|||||||
|
|
||||||
Expected `layers` to be an array or an `ol.Collection`.
|
Expected `layers` to be an array or an `ol.Collection`.
|
||||||
|
|
||||||
### 44
|
|
||||||
|
|
||||||
`logo.href` should be a string.
|
|
||||||
|
|
||||||
### 45
|
|
||||||
|
|
||||||
`logo.src` should be a string.
|
|
||||||
|
|
||||||
### 46
|
### 46
|
||||||
|
|
||||||
Incorrect format for `renderer` option.
|
Incorrect format for `renderer` option.
|
||||||
|
|||||||
37
doc/faq.md
37
doc/faq.md
@@ -21,9 +21,6 @@ Table of contents:
|
|||||||
* [Why aren't there any features in my source?](#why-aren-t-there-any-features-in-my-source-)
|
* [Why aren't there any features in my source?](#why-aren-t-there-any-features-in-my-source-)
|
||||||
* [How do I force a re-render of the map?](#how-do-i-force-a-re-render-of-the-map-)
|
* [How do I force a re-render of the map?](#how-do-i-force-a-re-render-of-the-map-)
|
||||||
* [Why are my features not found?](#why-are-my-features-not-found-)
|
* [Why are my features not found?](#why-are-my-features-not-found-)
|
||||||
* [How do I create a custom build of OpenLayers?](#how-do-i-create-a-custom-build-of-openlayers-)
|
|
||||||
* [Do I need to write my own code using Closure library?](#do-i-need-to-write-my-own-code-using-closure-library-)
|
|
||||||
* [Do I need to compress my code with Closure compiler?](#do-i-need-to-compress-my-code-with-closure-compiler-)
|
|
||||||
|
|
||||||
|
|
||||||
## What projection is OpenLayers using?
|
## What projection is OpenLayers using?
|
||||||
@@ -335,37 +332,3 @@ var vectorLayer = new ol.layer.Vector({
|
|||||||
```
|
```
|
||||||
|
|
||||||
The recommended value is the size of the largest symbol, line width or label.
|
The recommended value is the size of the largest symbol, line width or label.
|
||||||
|
|
||||||
## How do I create a custom build of OpenLayers?
|
|
||||||
|
|
||||||
Please refer to the [official create custom builds tutorial](tutorials/custom-builds.html)
|
|
||||||
which explains how to create a custom build of OpenLayers with just those parts
|
|
||||||
included that you want.
|
|
||||||
|
|
||||||
|
|
||||||
## Do I need to write my own code using Closure library?
|
|
||||||
|
|
||||||
OpenLayers is built on top of the [Google Closure JavaScript
|
|
||||||
library](https://developers.google.com/closure/library/), but this
|
|
||||||
does not mean that you must use that library in your application code.
|
|
||||||
|
|
||||||
OpenLayers should play well with all sorts of JavaScript libraries out there,
|
|
||||||
and you are in no way forced to use a specific one. Choose one that looks
|
|
||||||
right for you.
|
|
||||||
|
|
||||||
|
|
||||||
## Do I need to compress my code with Closure compiler?
|
|
||||||
|
|
||||||
No, you don't need to do compress your code with the [Google Closure
|
|
||||||
compiler](https://developers.google.com/closure/compiler/).
|
|
||||||
|
|
||||||
It may be a good choice though, because when your application code and the
|
|
||||||
OpenLayers source code is compiled together using closure compiler, the
|
|
||||||
resulting build will most probably be the smallest in terms of byte-size. For
|
|
||||||
more details refer to the
|
|
||||||
[compile application and OpenLayers together tutorial](tutorials/closure.html).
|
|
||||||
|
|
||||||
If you don't want to use the closure compiler, or you can't, you are not at all
|
|
||||||
forced to use it.
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,305 +0,0 @@
|
|||||||
---
|
|
||||||
title: Compiling Application with Closure Compiler
|
|
||||||
layout: doc.hbs
|
|
||||||
---
|
|
||||||
|
|
||||||
# Compiling Application with Closure Compiler
|
|
||||||
|
|
||||||
**Note**: When building an application with dependencies that are available as [npm](https://npmjs.com/) packages, it will probably be easier to use the [ol](https://npmjs.com/package/ol) package and follow the instructions there.
|
|
||||||
|
|
||||||
The OpenLayers code uses the Closure Library, and it is compiled with the
|
|
||||||
Closure Compiler. Using OpenLayers in an application does not require using
|
|
||||||
Closure. But using Closure in an OpenLayers application is possible. And this
|
|
||||||
is what this tutorial is about.
|
|
||||||
|
|
||||||
When you want to include OpenLayers as separate script without bundling with your application, follow the [Creating custom builds](./custom-builds.html) tutorial instead.
|
|
||||||
|
|
||||||
This tutorial will teach you how to set up an OpenLayers application based on
|
|
||||||
the [`closure-util`](https://github.com/openlayers/closure-util) node package,
|
|
||||||
which provides utilities for working with Closure. Using `closure-util` is one
|
|
||||||
way to use Closure in a web application, but there are others. This tutorial
|
|
||||||
just covers the "`closure-util`" way.
|
|
||||||
|
|
||||||
The `closure-util` documentation is available on the [`closure-util` readme
|
|
||||||
page](https://github.com/openlayers/closure-util/blob/master/readme.md). You
|
|
||||||
don't need to read the `closure-util` documentation to follow this tutorial,
|
|
||||||
but it's available in `closure-util`'s [readme
|
|
||||||
file](https://github.com/openlayers/closure-util/blob/master/readme.md) if you
|
|
||||||
need it.
|
|
||||||
|
|
||||||
Also, the sample application built in this tutorial is
|
|
||||||
[available](https://github.com/openlayers/openlayers-closure-application) on
|
|
||||||
GitHub.
|
|
||||||
|
|
||||||
## Advantages of using Closure
|
|
||||||
|
|
||||||
This tutorial will show you how to use the Closure Compiler to compile an
|
|
||||||
application and OpenLayers together. Compiling the application code together
|
|
||||||
with the OpenLayers code has a number of advantages.
|
|
||||||
|
|
||||||
First of all, it allows you to only "pay" for the OpenLayers code your
|
|
||||||
application uses, as the compiler will exclude the OpenLayers code that the
|
|
||||||
application doesn't use. And there is no need to write and maintain a list of
|
|
||||||
"exports", which is necessary when creating custom builds of OpenLayers.
|
|
||||||
|
|
||||||
Also, compiling the application and OpenLayers together allows using
|
|
||||||
OpenLayers functions and objects that are not part of the official OpenLayers
|
|
||||||
3 API. Using non-API functions and objects may be risky, but it is mitigated by
|
|
||||||
the fact that the compiler will complain if you use functions or objects
|
|
||||||
that are not in OpenLayers anymore.
|
|
||||||
|
|
||||||
## Setting up the Application
|
|
||||||
|
|
||||||
First, create a directory for the application. We will name that directory
|
|
||||||
`openlayers-closure-application` in this tutorial.
|
|
||||||
|
|
||||||
$ mkdir openlayers-closure-application
|
|
||||||
|
|
||||||
Now change to that directory:
|
|
||||||
|
|
||||||
$ cd openlayers-closure-application
|
|
||||||
|
|
||||||
Our application will be a `node` application, and the `openlayers` and
|
|
||||||
`closure-util` node packages will be downloaded from the node package registry
|
|
||||||
using the `npm` command line tool.
|
|
||||||
|
|
||||||
So we're going to create a `package.json` file for the application, which every
|
|
||||||
node application includes. This file basically includes metadata for the
|
|
||||||
application.
|
|
||||||
|
|
||||||
Create the application's `package.json` file:
|
|
||||||
|
|
||||||
$ npm init
|
|
||||||
|
|
||||||
You can pretty much use the default answers to the questions `npm init` asks
|
|
||||||
you.
|
|
||||||
|
|
||||||
Now install OpenLayers using:
|
|
||||||
|
|
||||||
$ npm install openlayers --save
|
|
||||||
|
|
||||||
The `--save` flag persists the `openlayers` dependency in the application's
|
|
||||||
`package.json` file. You can edit `package.json` to verify that the dependency
|
|
||||||
was added.
|
|
||||||
|
|
||||||
`closure-util` is a dependency of the `openlayers` package, so it should have
|
|
||||||
been installed with `openlayers`. Use the following to verify that
|
|
||||||
`closure-util` is installed:
|
|
||||||
|
|
||||||
$ ./node_modules/openlayers/node_modules/.bin/closure-util
|
|
||||||
|
|
||||||
command argument is required
|
|
||||||
|
|
||||||
Usage: node closure-util <command> [options]
|
|
||||||
|
|
||||||
command
|
|
||||||
update-compiler Update the Compiler
|
|
||||||
update-library Update the Library
|
|
||||||
update Update both the Library and the Compiler
|
|
||||||
build Build with Closure Compiler
|
|
||||||
serve Start the development server
|
|
||||||
|
|
||||||
Options:
|
|
||||||
-l LEVEL, --loglevel LEVEL Log level [info]
|
|
||||||
|
|
||||||
|
|
||||||
## Create an OpenLayers map
|
|
||||||
|
|
||||||
You're now going to create a JavaScript file that creates an OpenLayers map.
|
|
||||||
This is the file that we will define the application's entry point.
|
|
||||||
|
|
||||||
First of all create an `src` directory at the root of the application:
|
|
||||||
|
|
||||||
$ mkdir src
|
|
||||||
|
|
||||||
Now add a file `main.js` to `src`, with the following content:
|
|
||||||
|
|
||||||
```js
|
|
||||||
goog.provide('app');
|
|
||||||
|
|
||||||
goog.require('ol.Map');
|
|
||||||
goog.require('ol.View');
|
|
||||||
goog.require('ol.layer.Tile');
|
|
||||||
goog.require('ol.source.OSM');
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @type {ol.PluggableMap}
|
|
||||||
*/
|
|
||||||
app.map = new ol.Map({
|
|
||||||
target: 'map',
|
|
||||||
layers: [
|
|
||||||
new ol.layer.Tile({
|
|
||||||
source: new ol.source.OSM()
|
|
||||||
})
|
|
||||||
],
|
|
||||||
view: new ol.View({
|
|
||||||
center: [0, 0],
|
|
||||||
zoom: 4
|
|
||||||
})
|
|
||||||
});
|
|
||||||
```
|
|
||||||
|
|
||||||
`goog.provide('app')` creates the namespace `app` for the application. The
|
|
||||||
`goog.require` statements that follow define the OpenLayers constructors and
|
|
||||||
namespaces that the application uses. The rest of the code just creates the
|
|
||||||
OpenLayers map as you would do in any OpenLayers application.
|
|
||||||
|
|
||||||
## Compiling the Application
|
|
||||||
|
|
||||||
We're now going to compile the application and OpenLayers together, using the
|
|
||||||
Closure Compiler and `closure-util`. For this we need to create a JSON config
|
|
||||||
file, that we will then pass as an input file to the `closure-util` command.
|
|
||||||
|
|
||||||
The minimum config file looks like this:
|
|
||||||
|
|
||||||
```json
|
|
||||||
{
|
|
||||||
"lib": [
|
|
||||||
"node_modules/openlayers/src/**/*.js",
|
|
||||||
"node_modules/openlayers/build/ol.ext/**/*.js",
|
|
||||||
"src/**/*.js"
|
|
||||||
],
|
|
||||||
"compile": {
|
|
||||||
"closure_entry_point": "app",
|
|
||||||
"externs": [
|
|
||||||
"node_modules/openlayers/externs/bingmaps.js",
|
|
||||||
"node_modules/openlayers/externs/cartodb.js",
|
|
||||||
"node_modules/openlayers/externs/closure-compiler.js",
|
|
||||||
"node_modules/openlayers/externs/esrijson.js",
|
|
||||||
"node_modules/openlayers/externs/geojson.js",
|
|
||||||
"node_modules/openlayers/externs/proj4js.js",
|
|
||||||
"node_modules/openlayers/externs/tilejson.js",
|
|
||||||
"node_modules/openlayers/externs/topojson.js"
|
|
||||||
],
|
|
||||||
"define": [
|
|
||||||
"ol.ENABLE_WEBGL=false"
|
|
||||||
],
|
|
||||||
"js": [
|
|
||||||
"node_modules/openlayers/src/ol/typedefs.js",
|
|
||||||
"node_modules/openlayers/externs/olx.js",
|
|
||||||
"node_modules/openlayers/externs/oli.js"
|
|
||||||
],
|
|
||||||
"extra_annotation_name": [
|
|
||||||
"api", "observable"
|
|
||||||
],
|
|
||||||
"rewrite_polyfills": "false",
|
|
||||||
"compilation_level": "ADVANCED",
|
|
||||||
"warning_level": "VERBOSE",
|
|
||||||
"output_wrapper": "(function(){%output%})();",
|
|
||||||
"use_types_for_optimization": true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
Create a `config.json` file with the above content at the root of the
|
|
||||||
application directory.
|
|
||||||
|
|
||||||
We can now use `closure-util` to compile the code:
|
|
||||||
|
|
||||||
$ ./node_modules/openlayers/node_modules/.bin/closure-util build config.json app.js
|
|
||||||
|
|
||||||
The resulting `app.js` file, which you can view in your editor if you're
|
|
||||||
curious, includes a minified version of the application code (`main.js`), and
|
|
||||||
the OpenLayers code that the application code uses.
|
|
||||||
|
|
||||||
Here is a version of `config.json` with more compilation checks enabled:
|
|
||||||
|
|
||||||
```json
|
|
||||||
{
|
|
||||||
"lib": [
|
|
||||||
"node_modules/openlayers/src/**/*.js",
|
|
||||||
"node_modules/openlayers/build/ol.ext/**/*.js",
|
|
||||||
"src/**/*.js"
|
|
||||||
],
|
|
||||||
"compile": {
|
|
||||||
"closure_entry_point": "app",
|
|
||||||
"externs": [
|
|
||||||
"node_modules/openlayers/externs/bingmaps.js",
|
|
||||||
"node_modules/openlayers/externs/cartodb.js",
|
|
||||||
"node_modules/openlayers/externs/closure-compiler.js",
|
|
||||||
"node_modules/openlayers/externs/esrijson.js",
|
|
||||||
"node_modules/openlayers/externs/geojson.js",
|
|
||||||
"node_modules/openlayers/externs/proj4js.js",
|
|
||||||
"node_modules/openlayers/externs/tilejson.js",
|
|
||||||
"node_modules/openlayers/externs/topojson.js"
|
|
||||||
],
|
|
||||||
"define": [
|
|
||||||
"ol.ENABLE_WEBGL=false"
|
|
||||||
],
|
|
||||||
"js": [
|
|
||||||
"node_modules/openlayers/src/ol/typedefs.js",
|
|
||||||
"node_modules/openlayers/externs/olx.js",
|
|
||||||
"node_modules/openlayers/externs/oli.js"
|
|
||||||
],
|
|
||||||
"jscomp_error": [
|
|
||||||
"*"
|
|
||||||
],
|
|
||||||
"jscomp_off": [
|
|
||||||
"unknownDefines",
|
|
||||||
"lintChecks",
|
|
||||||
"analyzerChecks"
|
|
||||||
],
|
|
||||||
"extra_annotation_name": [
|
|
||||||
"api", "observable"
|
|
||||||
],
|
|
||||||
"compilation_level": "ADVANCED",
|
|
||||||
"warning_level": "VERBOSE",
|
|
||||||
"output_wrapper": "(function(){%output%})();",
|
|
||||||
"use_types_for_optimization": true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
## Create an HTML file for the Application
|
|
||||||
|
|
||||||
You can now go ahead and create a simple HTML for the application. Create
|
|
||||||
a `index.html` file with the following content at the root the application
|
|
||||||
directory:
|
|
||||||
|
|
||||||
```html
|
|
||||||
<!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">
|
|
||||||
<link rel="stylesheet" href="node_modules/openlayers/css/ol.css" type="text/css">
|
|
||||||
<title>Simple example</title>
|
|
||||||
<style>
|
|
||||||
#map {
|
|
||||||
width: 600px;
|
|
||||||
height: 400px;
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
<div id="map"></div>
|
|
||||||
<script src="app.js" type="text/javascript"></script>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
```
|
|
||||||
|
|
||||||
Note that the page includes a `script` tag referencing the `app.js` file,
|
|
||||||
which is the file resulting from the compilation.
|
|
||||||
|
|
||||||
You are done!
|
|
||||||
|
|
||||||
## Run Application in Debug Mode
|
|
||||||
|
|
||||||
As a bonus, we're going to show how to use `closure-util` to run the
|
|
||||||
application in "debug" mode, where the original application and OpenLayers
|
|
||||||
scripts are loaded one by one in the page.
|
|
||||||
|
|
||||||
Start the `closure-util` development server:
|
|
||||||
|
|
||||||
$ ./node_modules/openlayers/node_modules/.bin/closure-util serve config.json
|
|
||||||
|
|
||||||
Now change the `script` tag to the following in the `index.html` file:
|
|
||||||
|
|
||||||
```html
|
|
||||||
<script src="@?main=src/main.js" type="text/javascript"></script>
|
|
||||||
```
|
|
||||||
|
|
||||||
Reload the page in your browser and you should see that scripts are now loaded
|
|
||||||
individually, making debugging much easier.
|
|
||||||
@@ -1,237 +0,0 @@
|
|||||||
---
|
|
||||||
title: Custom builds
|
|
||||||
layout: doc.hbs
|
|
||||||
---
|
|
||||||
|
|
||||||
# Creating custom builds
|
|
||||||
|
|
||||||
OpenLayers is a big library providing a lot of functionality. So it is unlikely that an application will need and use all the functionality OpenLayers provides. This is why creating application-specific OpenLayers builds, with just the functionality your application needs, is often a good idea.
|
|
||||||
|
|
||||||
An alternative to creating custom builds is to compile your application code together with OpenLayers. See the [Compiling Application with Closure Compiler](closure.html) tutorial for more information.
|
|
||||||
|
|
||||||
This particular tutorial explains how to create custom builds of OpenLayers.
|
|
||||||
|
|
||||||
## Requirements
|
|
||||||
|
|
||||||
OpenLayers's build tools use Node and Java, so you need to have Node and Java installed on your machine. You can run `node --version` and `java -version` to test that Node and Java are installed, respectively. See [developing guide](https://github.com/openlayers/openlayers/blob/master/DEVELOPING.md) for minimum version numbers required.
|
|
||||||
|
|
||||||
## Download OpenLayers
|
|
||||||
|
|
||||||
Obviously, creating a custom build requires the OpenLayers source and specific build scripts.
|
|
||||||
|
|
||||||
To get the OpenLayers source and the build scripts you can clone the openlayers [repository](https://github.com/openlayers/openlayers), or you can download one of the release archives. You can also download the `openlayers` Node package from the Node package registry, using NPM (the Node Package Manager). This is the method we are going to use in this tutorial.
|
|
||||||
|
|
||||||
Create a directory:
|
|
||||||
|
|
||||||
$ mkdir openlayers
|
|
||||||
|
|
||||||
Download the OpenLayers distribution using NPM:
|
|
||||||
|
|
||||||
$ npm install openlayers
|
|
||||||
|
|
||||||
This will download the latest stable version of OpenLayers, and install it under `node_modules`. You can list the content of `node_modules` to verify that it effectively contains a directory named "openlayers".
|
|
||||||
|
|
||||||
The Node packages onto which the `openlayers` package depends are installed under `node_modules/openlayers/node_modules`. That directory should, for example, include `closure-util`, which is the utility library OpenLayers uses for Closure.
|
|
||||||
|
|
||||||
You should now have everything you need to create custom builds of OpenLayers!
|
|
||||||
|
|
||||||
## Create a build configuration file
|
|
||||||
|
|
||||||
Creating a custom build requires writing a build configuration file. The format of build configuration files is JSON. Here is a simple example of a build configuration file:
|
|
||||||
|
|
||||||
```json
|
|
||||||
{
|
|
||||||
"exports": [
|
|
||||||
"ol.Map",
|
|
||||||
"ol.View",
|
|
||||||
"ol.control.defaults",
|
|
||||||
"ol.layer.Tile",
|
|
||||||
"ol.source.OSM"
|
|
||||||
],
|
|
||||||
"compile": {
|
|
||||||
"externs": [
|
|
||||||
"externs/bingmaps.js",
|
|
||||||
"externs/cartodb.js",
|
|
||||||
"externs/closure-compiler.js",
|
|
||||||
"externs/esrijson.js",
|
|
||||||
"externs/geojson.js",
|
|
||||||
"externs/oli.js",
|
|
||||||
"externs/olx.js",
|
|
||||||
"externs/proj4js.js",
|
|
||||||
"externs/tilejson.js",
|
|
||||||
"externs/topojson.js"
|
|
||||||
],
|
|
||||||
"extra_annotation_name": [
|
|
||||||
"api", "observable"
|
|
||||||
],
|
|
||||||
"compilation_level": "ADVANCED",
|
|
||||||
"manage_closure_dependencies": true,
|
|
||||||
"rewrite_polyfills": false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
Create a file named `ol-custom.json` with that content, and save it under the `node_modules/openlayers/build` directory. (You can save it to any location really.)
|
|
||||||
|
|
||||||
The most relevant part of this configuration object is the `"exports"` array. This array declares the functions/constructors you use in your JavaScript code. For example, the above configuration file is what you'd use for the following JavaScript code:
|
|
||||||
|
|
||||||
```js
|
|
||||||
var map = new ol.Map({
|
|
||||||
target: 'map',
|
|
||||||
layers: [
|
|
||||||
new ol.layer.Tile({
|
|
||||||
source: new ol.source.OSM()
|
|
||||||
})
|
|
||||||
],
|
|
||||||
controls: ol.control.defaults({
|
|
||||||
attributionOptions: {
|
|
||||||
collapsible: false
|
|
||||||
}
|
|
||||||
}),
|
|
||||||
view: new ol.View({
|
|
||||||
center: [0, 0],
|
|
||||||
zoom: 4
|
|
||||||
})
|
|
||||||
});
|
|
||||||
```
|
|
||||||
|
|
||||||
Note that this JavaScript code corresponds to OpenLayers's [`simple`](https://openlayers.org/en/master/examples/simple.html) example.
|
|
||||||
|
|
||||||
You are now ready to create your first OpenLayers build. Use the following command to create the build:
|
|
||||||
|
|
||||||
$ cd node_modules/openlayers
|
|
||||||
$ node tasks/build.js build/ol-custom.json build/ol-custom.js
|
|
||||||
|
|
||||||
The build command may take some time, but it should end with an output in the console such as the following:
|
|
||||||
|
|
||||||
info ol Parsing dependencies
|
|
||||||
info ol Compiling 364 sources
|
|
||||||
|
|
||||||
The build command should have created an `ol-custom.js` file in the `node_modules/openlayers/build` directory. You can verify that the file was created. You can even open it in your editor if you're curious.
|
|
||||||
|
|
||||||
As a test, you can use the following HTML file to verify that your custom build works as expected:
|
|
||||||
|
|
||||||
```html
|
|
||||||
<!DOCTYPE html>
|
|
||||||
<html>
|
|
||||||
<head>
|
|
||||||
<meta charset="utf-8" />
|
|
||||||
<title>OpenLayers example</title>
|
|
||||||
<link rel="stylesheet" href="node_modules/openlayers/css/ol.css" />
|
|
||||||
<style>
|
|
||||||
#map {
|
|
||||||
width: 600px;
|
|
||||||
height: 400px;
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
<div id="map"></div>
|
|
||||||
<script src="node_modules/openlayers/build/ol-custom.js"></script>
|
|
||||||
<script>
|
|
||||||
var map = new ol.Map({
|
|
||||||
target: 'map',
|
|
||||||
layers: [
|
|
||||||
new ol.layer.Tile({
|
|
||||||
source: new ol.source.OSM()
|
|
||||||
})
|
|
||||||
],
|
|
||||||
view: new ol.View({
|
|
||||||
center: [0, 0],
|
|
||||||
zoom: 4
|
|
||||||
})
|
|
||||||
});
|
|
||||||
</script>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
```
|
|
||||||
|
|
||||||
## More on the config file
|
|
||||||
|
|
||||||
### `define`'s
|
|
||||||
|
|
||||||
Closure allows you to define constants that can be set at compile time. The OpenLayers code defines several such values.
|
|
||||||
|
|
||||||
Setting some of these to `false` means that the portions of the code relating to this setting become "dead", i.e. are never executed. As Closure Compiler's `ADVANCED` mode removes dead code, this makes the size of the advanced compiled file smaller.
|
|
||||||
|
|
||||||
You might have noticed that the build file you've just created is considerably smaller than the full build, but it can be reduced further. This is because both renderers and other optional code are included by default. We only need one renderer, and we do not use the optional code, so can exclude what we don't use by setting properties with `define`s. So add a define section to the config above:
|
|
||||||
```
|
|
||||||
"define": [
|
|
||||||
"ol.ENABLE_WEBGL=false",
|
|
||||||
"ol.ENABLE_PROJ4JS=false",
|
|
||||||
"ol.ENABLE_RASTER_REPROJECTION=false"
|
|
||||||
],
|
|
||||||
```
|
|
||||||
|
|
||||||
and re-run the build script. The build size should now be smaller.
|
|
||||||
|
|
||||||
### Externs
|
|
||||||
|
|
||||||
The Closure documentation explains that "externs" are for external names used in the code being compiled. The compiler includes externs for built-ins such as `document`. The `externs` directory of the OpenLayers code includes files for all those used in some part of the library. For example, if you use Bing Maps, you should include the Bing externs file in the `externs` section of the config file.
|
|
||||||
|
|
||||||
`oli.js` and `olx.js` are externs files for the OpenLayers API. For example `olx.js` includes extern definitions for OpenLayers's constructor options. `closure-compiler.js` fixes any issues that may arise with a specific compiler version. You should always use these three files as externs when creating custom builds.
|
|
||||||
|
|
||||||
### Other compiler options
|
|
||||||
|
|
||||||
There are a couple of other compiler options in the config file above. `manage_closure_dependencies` and `rewrite_polyfills` should always be used.
|
|
||||||
|
|
||||||
You can specify any of the other compiler options here as needed, such as the renaming reports, output manifest, or source maps. There is a full list of available options in [closure-util](https://github.com/openlayers/closure-util/blob/master/compiler-options.txt).
|
|
||||||
|
|
||||||
Note that `build.js` currently requires you to enter an output file and will write the output from the compiler to it; it does not use the `js_output_file` compiler option. If you specify this in the config file, there will be no compiler output, so `build.js`'s output file will be empty.
|
|
||||||
|
|
||||||
## A more complicated example
|
|
||||||
|
|
||||||
Now let's try a more complicated example: [`heatmaps-earthquakes`](https://openlayers.org/en/master/examples/heatmap-earthquakes.html). The build configuration file looks like this:
|
|
||||||
|
|
||||||
```json
|
|
||||||
{
|
|
||||||
"exports": [
|
|
||||||
"ol.layer.Heatmap",
|
|
||||||
"ol.source.Vector",
|
|
||||||
"ol.format.KML",
|
|
||||||
"ol.layer.Heatmap#getSource",
|
|
||||||
"ol.source.Vector#on",
|
|
||||||
"ol.source.Vector.Event#feature",
|
|
||||||
"ol.Feature#get",
|
|
||||||
"ol.Feature#set",
|
|
||||||
"ol.layer.Tile",
|
|
||||||
"ol.source.Stamen",
|
|
||||||
"ol.Map",
|
|
||||||
"ol.View",
|
|
||||||
"ol.layer.Heatmap#setRadius",
|
|
||||||
"ol.layer.Heatmap#setBlur"
|
|
||||||
],
|
|
||||||
"compile": {
|
|
||||||
"externs": [
|
|
||||||
"externs/bingmaps.js",
|
|
||||||
"externs/cartodb.js",
|
|
||||||
"externs/closure-compiler.js",
|
|
||||||
"externs/esrijson.js",
|
|
||||||
"externs/geojson.js",
|
|
||||||
"externs/olx.js",
|
|
||||||
"externs/oli.js",
|
|
||||||
"externs/proj4js.js",
|
|
||||||
"externs/tilejson.js",
|
|
||||||
"externs/topojson.js"
|
|
||||||
],
|
|
||||||
"define": [
|
|
||||||
"ol.ENABLE_WEBGL=false",
|
|
||||||
"ol.ENABLE_PROJ4JS=false",
|
|
||||||
"ol.ENABLE_RASTER_REPROJECTION=false"
|
|
||||||
],
|
|
||||||
"compilation_level": "ADVANCED",
|
|
||||||
"manage_closure_dependencies": true,
|
|
||||||
"rewrite_polyfills": false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
The exports are given here in the order in which they occur in the `heatmaps-earthquakes` example's JavaScript code. In this example we not only use the `ol.` functions and constructors, but also `prototype` methods where the `ol` namespace is not directly used. In the code, we have for example `vector.getSource().on()`. This means we are using the `getSource` method of `layer.Heatmap` and the `on` method of `source.KML`, so this is what has to be exported. Similarly, `event.feature.get()` means we are using the `feature` property of `source.Vector.Event` and the `get` method of `Feature`. If any of these names are left out, the compile will complete successfully, but the missing names will be obfuscated and you will get a 'property undefined' error when you try and run the script.
|
|
||||||
|
|
||||||
## Maintaining the code
|
|
||||||
|
|
||||||
If you installed OpenLayers from the Node package, you can use `npm` to upgrade to the latest version. If you cloned the Github repo, simply pulling in the latest code may not be enough, as some of the packages used, for example, the compiler, may need upgrading too. Do this by using `npm install` rather than `npm update`.
|
|
||||||
|
|
||||||
## Conclusion
|
|
||||||
|
|
||||||
This tutorial should have given you the information you need to create custom builds, i.e. builds tailored to your application. See the [tasks readme](https://github.com/openlayers/openlayers/tree/master/tasks/readme.md) for more information on the build scripts and the properties you can use in the build configuration file.
|
|
||||||
@@ -9,5 +9,4 @@ layout: doc.hbs
|
|||||||
* [Basic Concepts](concepts.html)
|
* [Basic Concepts](concepts.html)
|
||||||
* [Create Custom Builds](custom-builds.html)
|
* [Create Custom Builds](custom-builds.html)
|
||||||
* [Bundle Application and OpenLayers using Browserify](browserify.html)
|
* [Bundle Application and OpenLayers using Browserify](browserify.html)
|
||||||
* [Compile Application and OpenLayers together](closure.html)
|
|
||||||
* [Raster Reprojection](raster-reprojection.html)
|
* [Raster Reprojection](raster-reprojection.html)
|
||||||
|
|||||||
@@ -12,9 +12,6 @@ The initial release aims to support much of the functionality provided by versio
|
|||||||
|
|
||||||
It is also designed such that major new features, such as displaying 3D maps, or using WebGL to quickly display large vector data sets, can be added in later releases.
|
It is also designed such that major new features, such as displaying 3D maps, or using WebGL to quickly display large vector data sets, can be added in later releases.
|
||||||
|
|
||||||
## Google Closure
|
|
||||||
OpenLayers was written in a way so it can be compiled with [__Closure Compiler__](https://developers.google.com/closure/compiler/). Its 'advanced' compilation mode offers a level of compression that exceeds anything else available.
|
|
||||||
|
|
||||||
## Public API
|
## Public API
|
||||||
Using the advanced optimizations of the Closure Compiler means that properties and methods are renamed – `longMeaningfulName` might become `xB` – and so are effectively unusable in applications using the library. To be usable, they have to be explicitly `exported`. This means the exported names, those not renamed, effectively become the public API of the library. These __exportable__ properties and methods are marked in the source, and documented in the [API docs](../../apidoc). This is the officially supported API of the library. A build containing all these exportable names is known as a __full build__. A hosted version of this is available, which can be used by any application.
|
Using the advanced optimizations of the Closure Compiler means that properties and methods are renamed – `longMeaningfulName` might become `xB` – and so are effectively unusable in applications using the library. To be usable, they have to be explicitly `exported`. This means the exported names, those not renamed, effectively become the public API of the library. These __exportable__ properties and methods are marked in the source, and documented in the [API docs](../../apidoc). This is the officially supported API of the library. A build containing all these exportable names is known as a __full build__. A hosted version of this is available, which can be used by any application.
|
||||||
|
|
||||||
|
|||||||
@@ -107,7 +107,7 @@ In case you are creating a custom build of OpenLayers and do not need the reproj
|
|||||||
See [Custom builds](custom-builds.html#defines) tutorial on how to do this.
|
See [Custom builds](custom-builds.html#defines) tutorial on how to do this.
|
||||||
|
|
||||||
### Triangulation precision threshold
|
### Triangulation precision threshold
|
||||||
The default [triangulation error threshold](#dynamic-triangulation) in pixels is given by `ol.DEFAULT_RASTER_REPROJECTION_ERROR_THRESHOLD` (0.5 pixel).
|
The default [triangulation error threshold](#dynamic-triangulation) in pixels is given by `ERROR_THRESHOLD` (0.5 pixel).
|
||||||
In case a different threshold needs to be defined for different sources, the `reprojectionErrorThreshold` option can be passed when constructing the tile image source.
|
In case a different threshold needs to be defined for different sources, the `reprojectionErrorThreshold` option can be passed when constructing the tile image source.
|
||||||
|
|
||||||
###Limiting visibility of reprojected map by extent
|
###Limiting visibility of reprojected map by extent
|
||||||
|
|||||||
@@ -1,3 +1,10 @@
|
|||||||
|
/*
|
||||||
|
* Jugl.js -- JavaScript Template Library
|
||||||
|
*
|
||||||
|
* Copyright 2007-2010 Tim Schaub
|
||||||
|
* Released under the MIT license. Please see
|
||||||
|
* http://github.com/tschaub/jugl/blob/master/license.txt for the full license.
|
||||||
|
*/
|
||||||
/*
|
/*
|
||||||
* Jugl.js -- JavaScript Template Library
|
* Jugl.js -- JavaScript Template Library
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -1,36 +1,36 @@
|
|||||||
goog.require('ol.Map');
|
import Map from '../src/ol/Map.js';
|
||||||
goog.require('ol.View');
|
import View from '../src/ol/View.js';
|
||||||
goog.require('ol.control');
|
import {defaults as defaultControls} from '../src/ol/control.js';
|
||||||
goog.require('ol.layer.Tile');
|
import TileLayer from '../src/ol/layer/Tile.js';
|
||||||
goog.require('ol.source.OSM');
|
import OSM from '../src/ol/source/OSM.js';
|
||||||
|
|
||||||
|
|
||||||
var map = new ol.Map({
|
const map = new Map({
|
||||||
layers: [
|
layers: [
|
||||||
new ol.layer.Tile({
|
new TileLayer({
|
||||||
source: new ol.source.OSM()
|
source: new OSM()
|
||||||
})
|
})
|
||||||
],
|
],
|
||||||
target: 'map',
|
target: 'map',
|
||||||
controls: ol.control.defaults({
|
controls: defaultControls({
|
||||||
attributionOptions: {
|
attributionOptions: {
|
||||||
collapsible: false
|
collapsible: false
|
||||||
}
|
}
|
||||||
}),
|
}),
|
||||||
view: new ol.View({
|
view: new View({
|
||||||
center: [0, 0],
|
center: [0, 0],
|
||||||
zoom: 2
|
zoom: 2
|
||||||
})
|
})
|
||||||
});
|
});
|
||||||
|
|
||||||
document.getElementById('zoom-out').onclick = function() {
|
document.getElementById('zoom-out').onclick = function() {
|
||||||
var view = map.getView();
|
const view = map.getView();
|
||||||
var zoom = view.getZoom();
|
const zoom = view.getZoom();
|
||||||
view.setZoom(zoom - 1);
|
view.setZoom(zoom - 1);
|
||||||
};
|
};
|
||||||
|
|
||||||
document.getElementById('zoom-in').onclick = function() {
|
document.getElementById('zoom-in').onclick = function() {
|
||||||
var view = map.getView();
|
const view = map.getView();
|
||||||
var zoom = view.getZoom();
|
const zoom = view.getZoom();
|
||||||
view.setZoom(zoom + 1);
|
view.setZoom(zoom + 1);
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -1,27 +1,27 @@
|
|||||||
goog.require('ol.Map');
|
import Map from '../src/ol/Map.js';
|
||||||
goog.require('ol.View');
|
import View from '../src/ol/View.js';
|
||||||
goog.require('ol.easing');
|
import {easeIn, easeOut} from '../src/ol/easing.js';
|
||||||
goog.require('ol.layer.Tile');
|
import TileLayer from '../src/ol/layer/Tile.js';
|
||||||
goog.require('ol.proj');
|
import {fromLonLat} from '../src/ol/proj.js';
|
||||||
goog.require('ol.source.OSM');
|
import OSM from '../src/ol/source/OSM.js';
|
||||||
|
|
||||||
var london = ol.proj.fromLonLat([-0.12755, 51.507222]);
|
const london = fromLonLat([-0.12755, 51.507222]);
|
||||||
var moscow = ol.proj.fromLonLat([37.6178, 55.7517]);
|
const moscow = fromLonLat([37.6178, 55.7517]);
|
||||||
var istanbul = ol.proj.fromLonLat([28.9744, 41.0128]);
|
const istanbul = fromLonLat([28.9744, 41.0128]);
|
||||||
var rome = ol.proj.fromLonLat([12.5, 41.9]);
|
const rome = fromLonLat([12.5, 41.9]);
|
||||||
var bern = ol.proj.fromLonLat([7.4458, 46.95]);
|
const bern = fromLonLat([7.4458, 46.95]);
|
||||||
|
|
||||||
var view = new ol.View({
|
const view = new View({
|
||||||
center: istanbul,
|
center: istanbul,
|
||||||
zoom: 6
|
zoom: 6
|
||||||
});
|
});
|
||||||
|
|
||||||
var map = new ol.Map({
|
const map = new Map({
|
||||||
target: 'map',
|
target: 'map',
|
||||||
layers: [
|
layers: [
|
||||||
new ol.layer.Tile({
|
new TileLayer({
|
||||||
preload: 4,
|
preload: 4,
|
||||||
source: new ol.source.OSM()
|
source: new OSM()
|
||||||
})
|
})
|
||||||
],
|
],
|
||||||
// Improve user experience by loading tiles while animating. Will make
|
// Improve user experience by loading tiles while animating. Will make
|
||||||
@@ -32,7 +32,9 @@ var map = new ol.Map({
|
|||||||
|
|
||||||
// A bounce easing method (from https://github.com/DmitryBaranovskiy/raphael).
|
// A bounce easing method (from https://github.com/DmitryBaranovskiy/raphael).
|
||||||
function bounce(t) {
|
function bounce(t) {
|
||||||
var s = 7.5625, p = 2.75, l;
|
const s = 7.5625;
|
||||||
|
const p = 2.75;
|
||||||
|
let l;
|
||||||
if (t < (1 / p)) {
|
if (t < (1 / p)) {
|
||||||
l = s * t * t;
|
l = s * t * t;
|
||||||
} else {
|
} else {
|
||||||
@@ -75,15 +77,15 @@ onClick('rotate-right', function() {
|
|||||||
|
|
||||||
onClick('rotate-around-rome', function() {
|
onClick('rotate-around-rome', function() {
|
||||||
// Rotation animation takes the shortest arc, so animate in two parts
|
// Rotation animation takes the shortest arc, so animate in two parts
|
||||||
var rotation = view.getRotation();
|
const rotation = view.getRotation();
|
||||||
view.animate({
|
view.animate({
|
||||||
rotation: rotation + Math.PI,
|
rotation: rotation + Math.PI,
|
||||||
anchor: rome,
|
anchor: rome,
|
||||||
easing: ol.easing.easeIn
|
easing: easeIn
|
||||||
}, {
|
}, {
|
||||||
rotation: rotation + 2 * Math.PI,
|
rotation: rotation + 2 * Math.PI,
|
||||||
anchor: rome,
|
anchor: rome,
|
||||||
easing: ol.easing.easeOut
|
easing: easeOut
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -112,26 +114,26 @@ onClick('bounce-to-istanbul', function() {
|
|||||||
|
|
||||||
onClick('spin-to-rome', function() {
|
onClick('spin-to-rome', function() {
|
||||||
// Rotation animation takes the shortest arc, so animate in two parts
|
// Rotation animation takes the shortest arc, so animate in two parts
|
||||||
var center = view.getCenter();
|
const center = view.getCenter();
|
||||||
view.animate({
|
view.animate({
|
||||||
center: [
|
center: [
|
||||||
center[0] + (rome[0] - center[0]) / 2,
|
center[0] + (rome[0] - center[0]) / 2,
|
||||||
center[1] + (rome[1] - center[1]) / 2
|
center[1] + (rome[1] - center[1]) / 2
|
||||||
],
|
],
|
||||||
rotation: Math.PI,
|
rotation: Math.PI,
|
||||||
easing: ol.easing.easeIn
|
easing: easeIn
|
||||||
}, {
|
}, {
|
||||||
center: rome,
|
center: rome,
|
||||||
rotation: 2 * Math.PI,
|
rotation: 2 * Math.PI,
|
||||||
easing: ol.easing.easeOut
|
easing: easeOut
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
function flyTo(location, done) {
|
function flyTo(location, done) {
|
||||||
var duration = 2000;
|
const duration = 2000;
|
||||||
var zoom = view.getZoom();
|
const zoom = view.getZoom();
|
||||||
var parts = 2;
|
let parts = 2;
|
||||||
var called = false;
|
let called = false;
|
||||||
function callback(complete) {
|
function callback(complete) {
|
||||||
--parts;
|
--parts;
|
||||||
if (called) {
|
if (called) {
|
||||||
@@ -160,13 +162,13 @@ onClick('fly-to-bern', function() {
|
|||||||
});
|
});
|
||||||
|
|
||||||
function tour() {
|
function tour() {
|
||||||
var locations = [london, bern, rome, moscow, istanbul];
|
const locations = [london, bern, rome, moscow, istanbul];
|
||||||
var index = -1;
|
let index = -1;
|
||||||
function next(more) {
|
function next(more) {
|
||||||
if (more) {
|
if (more) {
|
||||||
++index;
|
++index;
|
||||||
if (index < locations.length) {
|
if (index < locations.length) {
|
||||||
var delay = index === 0 ? 0 : 750;
|
const delay = index === 0 ? 0 : 750;
|
||||||
setTimeout(function() {
|
setTimeout(function() {
|
||||||
flyTo(locations[index], next);
|
flyTo(locations[index], next);
|
||||||
}, delay);
|
}, delay);
|
||||||
|
|||||||
@@ -1,29 +1,27 @@
|
|||||||
goog.require('ol.Map');
|
import Map from '../src/ol/Map.js';
|
||||||
goog.require('ol.View');
|
import View from '../src/ol/View.js';
|
||||||
goog.require('ol.layer.Tile');
|
import {Tile as TileLayer, Image as ImageLayer} from '../src/ol/layer.js';
|
||||||
goog.require('ol.layer.Image');
|
import {OSM, ImageArcGISRest} from '../src/ol/source.js';
|
||||||
goog.require('ol.source.OSM');
|
|
||||||
goog.require('ol.source.ImageArcGISRest');
|
|
||||||
|
|
||||||
var url = 'https://sampleserver1.arcgisonline.com/ArcGIS/rest/services/' +
|
const url = 'https://sampleserver1.arcgisonline.com/ArcGIS/rest/services/' +
|
||||||
'Specialty/ESRI_StateCityHighway_USA/MapServer';
|
'Specialty/ESRI_StateCityHighway_USA/MapServer';
|
||||||
|
|
||||||
var layers = [
|
const layers = [
|
||||||
new ol.layer.Tile({
|
new TileLayer({
|
||||||
source: new ol.source.OSM()
|
source: new OSM()
|
||||||
}),
|
}),
|
||||||
new ol.layer.Image({
|
new ImageLayer({
|
||||||
source: new ol.source.ImageArcGISRest({
|
source: new ImageArcGISRest({
|
||||||
ratio: 1,
|
ratio: 1,
|
||||||
params: {},
|
params: {},
|
||||||
url: url
|
url: url
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
];
|
];
|
||||||
var map = new ol.Map({
|
const map = new Map({
|
||||||
layers: layers,
|
layers: layers,
|
||||||
target: 'map',
|
target: 'map',
|
||||||
view: new ol.View({
|
view: new View({
|
||||||
center: [-10997148, 4569099],
|
center: [-10997148, 4569099],
|
||||||
zoom: 4
|
zoom: 4
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ docs: >
|
|||||||
This example shows how to use an ArcGIS REST MapService as tiles.
|
This example shows how to use an ArcGIS REST MapService as tiles.
|
||||||
This source type supports Map and Image Services. For cached ArcGIS
|
This source type supports Map and Image Services. For cached ArcGIS
|
||||||
services, better performance is available by using
|
services, better performance is available by using
|
||||||
<code>ol.source.XYZ</code> instead.
|
<code>ol/source/XYZ</code> instead.
|
||||||
tags: arcgis, tile, tilelayer"
|
tags: arcgis, tile, tilelayer"
|
||||||
---
|
---
|
||||||
<div id="map" class="map"></div>
|
<div id="map" class="map"></div>
|
||||||
|
|||||||
@@ -1,27 +1,26 @@
|
|||||||
goog.require('ol.Map');
|
import Map from '../src/ol/Map.js';
|
||||||
goog.require('ol.View');
|
import View from '../src/ol/View.js';
|
||||||
goog.require('ol.layer.Tile');
|
import TileLayer from '../src/ol/layer/Tile.js';
|
||||||
goog.require('ol.source.OSM');
|
import {OSM, TileArcGISRest} from '../src/ol/source.js';
|
||||||
goog.require('ol.source.TileArcGISRest');
|
|
||||||
|
|
||||||
var url = 'https://sampleserver1.arcgisonline.com/ArcGIS/rest/services/' +
|
const url = 'https://sampleserver1.arcgisonline.com/ArcGIS/rest/services/' +
|
||||||
'Specialty/ESRI_StateCityHighway_USA/MapServer';
|
'Specialty/ESRI_StateCityHighway_USA/MapServer';
|
||||||
|
|
||||||
var layers = [
|
const layers = [
|
||||||
new ol.layer.Tile({
|
new TileLayer({
|
||||||
source: new ol.source.OSM()
|
source: new OSM()
|
||||||
}),
|
}),
|
||||||
new ol.layer.Tile({
|
new TileLayer({
|
||||||
extent: [-13884991, 2870341, -7455066, 6338219],
|
extent: [-13884991, 2870341, -7455066, 6338219],
|
||||||
source: new ol.source.TileArcGISRest({
|
source: new TileArcGISRest({
|
||||||
url: url
|
url: url
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
];
|
];
|
||||||
var map = new ol.Map({
|
const map = new Map({
|
||||||
layers: layers,
|
layers: layers,
|
||||||
target: 'map',
|
target: 'map',
|
||||||
view: new ol.View({
|
view: new View({
|
||||||
center: [-10997148, 4569099],
|
center: [-10997148, 4569099],
|
||||||
zoom: 4
|
zoom: 4
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -1,29 +1,28 @@
|
|||||||
goog.require('ol.Map');
|
import Map from '../src/ol/Map.js';
|
||||||
goog.require('ol.View');
|
import View from '../src/ol/View.js';
|
||||||
goog.require('ol.control');
|
import {defaults as defaultControls, Attribution} from '../src/ol/control.js';
|
||||||
goog.require('ol.control.Attribution');
|
import TileLayer from '../src/ol/layer/Tile.js';
|
||||||
goog.require('ol.layer.Tile');
|
import OSM from '../src/ol/source/OSM.js';
|
||||||
goog.require('ol.source.OSM');
|
|
||||||
|
|
||||||
var attribution = new ol.control.Attribution({
|
const attribution = new Attribution({
|
||||||
collapsible: false
|
collapsible: false
|
||||||
});
|
});
|
||||||
var map = new ol.Map({
|
const map = new Map({
|
||||||
layers: [
|
layers: [
|
||||||
new ol.layer.Tile({
|
new TileLayer({
|
||||||
source: new ol.source.OSM()
|
source: new OSM()
|
||||||
})
|
})
|
||||||
],
|
],
|
||||||
controls: ol.control.defaults({attribution: false}).extend([attribution]),
|
controls: defaultControls({attribution: false}).extend([attribution]),
|
||||||
target: 'map',
|
target: 'map',
|
||||||
view: new ol.View({
|
view: new View({
|
||||||
center: [0, 0],
|
center: [0, 0],
|
||||||
zoom: 2
|
zoom: 2
|
||||||
})
|
})
|
||||||
});
|
});
|
||||||
|
|
||||||
function checkSize() {
|
function checkSize() {
|
||||||
var small = map.getSize()[0] < 600;
|
const small = map.getSize()[0] < 600;
|
||||||
attribution.setCollapsible(small);
|
attribution.setCollapsible(small);
|
||||||
attribution.setCollapsed(small);
|
attribution.setCollapsed(small);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,10 +3,11 @@ layout: example.html
|
|||||||
title: Bing Maps
|
title: Bing Maps
|
||||||
shortdesc: Example of a Bing Maps layer.
|
shortdesc: Example of a Bing Maps layer.
|
||||||
docs: >
|
docs: >
|
||||||
<p>When the Bing Maps tile service doesn't have tiles for a given resolution and region it returns "placeholder" tiles indicating that. Zoom the map beyond level 19 to see the "placeholder" tiles. If you want OpenLayers to display stretched tiles in place of "placeholder" tiles beyond zoom level 19 then set <code>maxZoom</code> to <code>19</code> in the options passed to <code>ol.source.BingMaps</code>.</p>
|
<p>When the Bing Maps tile service doesn't have tiles for a given resolution and region it returns "placeholder" tiles indicating that. Zoom the map beyond level 19 to see the "placeholder" tiles. If you want OpenLayers to display stretched tiles in place of "placeholder" tiles beyond zoom level 19 then set <code>maxZoom</code> to <code>19</code> in the options passed to <code>ol/source/BingMaps</code>.</p>
|
||||||
tags: "bing, bing-maps"
|
tags: "bing, bing-maps"
|
||||||
cloak:
|
cloak:
|
||||||
As1HiMj1PvLPlqc_gtM7AqZfBL8ZL3VrjaS3zIb22Uvb9WKhuJObROC-qUpa81U5: Your Bing Maps Key from http://www.bingmapsportal.com/ here
|
- key: As1HiMj1PvLPlqc_gtM7AqZfBL8ZL3VrjaS3zIb22Uvb9WKhuJObROC-qUpa81U5
|
||||||
|
value: Your Bing Maps Key from http://www.bingmapsportal.com/ here
|
||||||
---
|
---
|
||||||
<div id="map" class="map"></div>
|
<div id="map" class="map"></div>
|
||||||
<select id="layer-select">
|
<select id="layer-select">
|
||||||
|
|||||||
@@ -1,10 +1,10 @@
|
|||||||
goog.require('ol.Map');
|
import Map from '../src/ol/Map.js';
|
||||||
goog.require('ol.View');
|
import View from '../src/ol/View.js';
|
||||||
goog.require('ol.layer.Tile');
|
import TileLayer from '../src/ol/layer/Tile.js';
|
||||||
goog.require('ol.source.BingMaps');
|
import BingMaps from '../src/ol/source/BingMaps.js';
|
||||||
|
|
||||||
|
|
||||||
var styles = [
|
const styles = [
|
||||||
'Road',
|
'Road',
|
||||||
'RoadOnDemand',
|
'RoadOnDemand',
|
||||||
'Aerial',
|
'Aerial',
|
||||||
@@ -12,13 +12,13 @@ var styles = [
|
|||||||
'collinsBart',
|
'collinsBart',
|
||||||
'ordnanceSurvey'
|
'ordnanceSurvey'
|
||||||
];
|
];
|
||||||
var layers = [];
|
const layers = [];
|
||||||
var i, ii;
|
let i, ii;
|
||||||
for (i = 0, ii = styles.length; i < ii; ++i) {
|
for (i = 0, ii = styles.length; i < ii; ++i) {
|
||||||
layers.push(new ol.layer.Tile({
|
layers.push(new TileLayer({
|
||||||
visible: false,
|
visible: false,
|
||||||
preload: Infinity,
|
preload: Infinity,
|
||||||
source: new ol.source.BingMaps({
|
source: new BingMaps({
|
||||||
key: 'As1HiMj1PvLPlqc_gtM7AqZfBL8ZL3VrjaS3zIb22Uvb9WKhuJObROC-qUpa81U5',
|
key: 'As1HiMj1PvLPlqc_gtM7AqZfBL8ZL3VrjaS3zIb22Uvb9WKhuJObROC-qUpa81U5',
|
||||||
imagerySet: styles[i]
|
imagerySet: styles[i]
|
||||||
// use maxZoom 19 to see stretched tiles instead of the BingMaps
|
// use maxZoom 19 to see stretched tiles instead of the BingMaps
|
||||||
@@ -27,22 +27,22 @@ for (i = 0, ii = styles.length; i < ii; ++i) {
|
|||||||
})
|
})
|
||||||
}));
|
}));
|
||||||
}
|
}
|
||||||
var map = new ol.Map({
|
const map = new Map({
|
||||||
layers: layers,
|
layers: layers,
|
||||||
// Improve user experience by loading tiles while dragging/zooming. Will make
|
// Improve user experience by loading tiles while dragging/zooming. Will make
|
||||||
// zooming choppy on mobile or slow devices.
|
// zooming choppy on mobile or slow devices.
|
||||||
loadTilesWhileInteracting: true,
|
loadTilesWhileInteracting: true,
|
||||||
target: 'map',
|
target: 'map',
|
||||||
view: new ol.View({
|
view: new View({
|
||||||
center: [-6655.5402445057125, 6709968.258934638],
|
center: [-6655.5402445057125, 6709968.258934638],
|
||||||
zoom: 13
|
zoom: 13
|
||||||
})
|
})
|
||||||
});
|
});
|
||||||
|
|
||||||
var select = document.getElementById('layer-select');
|
const select = document.getElementById('layer-select');
|
||||||
function onChange() {
|
function onChange() {
|
||||||
var style = select.value;
|
const style = select.value;
|
||||||
for (var i = 0, ii = layers.length; i < ii; ++i) {
|
for (let i = 0, ii = layers.length; i < ii; ++i) {
|
||||||
layers[i].setVisible(styles[i] === style);
|
layers[i].setVisible(styles[i] === style);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,29 +1,26 @@
|
|||||||
goog.require('ol.Feature');
|
import Feature from '../src/ol/Feature.js';
|
||||||
goog.require('ol.Map');
|
import Map from '../src/ol/Map.js';
|
||||||
goog.require('ol.View');
|
import View from '../src/ol/View.js';
|
||||||
goog.require('ol.geom.Point');
|
import Point from '../src/ol/geom/Point.js';
|
||||||
goog.require('ol.layer.Vector');
|
import VectorLayer from '../src/ol/layer/Vector.js';
|
||||||
goog.require('ol.source.Vector');
|
import VectorSource from '../src/ol/source/Vector.js';
|
||||||
goog.require('ol.style.Circle');
|
import {Circle as CircleStyle, Fill, Stroke, Style} from '../src/ol/style.js';
|
||||||
goog.require('ol.style.Fill');
|
|
||||||
goog.require('ol.style.Stroke');
|
|
||||||
goog.require('ol.style.Style');
|
|
||||||
|
|
||||||
|
|
||||||
// Create separate layers for red, green an blue circles.
|
// Create separate layers for red, green an blue circles.
|
||||||
//
|
//
|
||||||
// Every layer has one feature that is styled with a circle, together the
|
// 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
|
// features form the corners of an equilateral triangle and their styles overlap
|
||||||
var redLayer = new ol.layer.Vector({
|
const redLayer = new VectorLayer({
|
||||||
source: new ol.source.Vector({
|
source: new VectorSource({
|
||||||
features: [new ol.Feature(new ol.geom.Point([0, 0]))]
|
features: [new Feature(new Point([0, 0]))]
|
||||||
}),
|
}),
|
||||||
style: new ol.style.Style({
|
style: new Style({
|
||||||
image: new ol.style.Circle({
|
image: new CircleStyle({
|
||||||
fill: new ol.style.Fill({
|
fill: new Fill({
|
||||||
color: 'rgba(255,0,0,0.8)'
|
color: 'rgba(255,0,0,0.8)'
|
||||||
}),
|
}),
|
||||||
stroke: new ol.style.Stroke({
|
stroke: new Stroke({
|
||||||
color: 'rgb(255,0,0)',
|
color: 'rgb(255,0,0)',
|
||||||
width: 15
|
width: 15
|
||||||
}),
|
}),
|
||||||
@@ -31,17 +28,17 @@ var redLayer = new ol.layer.Vector({
|
|||||||
})
|
})
|
||||||
})
|
})
|
||||||
});
|
});
|
||||||
var greenLayer = new ol.layer.Vector({
|
const greenLayer = new VectorLayer({
|
||||||
source: new ol.source.Vector({
|
source: new VectorSource({
|
||||||
// 433.013 is roughly 250 * Math.sqrt(3)
|
// 433.013 is roughly 250 * Math.sqrt(3)
|
||||||
features: [new ol.Feature(new ol.geom.Point([250, 433.013]))]
|
features: [new Feature(new Point([250, 433.013]))]
|
||||||
}),
|
}),
|
||||||
style: new ol.style.Style({
|
style: new Style({
|
||||||
image: new ol.style.Circle({
|
image: new CircleStyle({
|
||||||
fill: new ol.style.Fill({
|
fill: new Fill({
|
||||||
color: 'rgba(0,255,0,0.8)'
|
color: 'rgba(0,255,0,0.8)'
|
||||||
}),
|
}),
|
||||||
stroke: new ol.style.Stroke({
|
stroke: new Stroke({
|
||||||
color: 'rgb(0,255,0)',
|
color: 'rgb(0,255,0)',
|
||||||
width: 15
|
width: 15
|
||||||
}),
|
}),
|
||||||
@@ -49,16 +46,16 @@ var greenLayer = new ol.layer.Vector({
|
|||||||
})
|
})
|
||||||
})
|
})
|
||||||
});
|
});
|
||||||
var blueLayer = new ol.layer.Vector({
|
const blueLayer = new VectorLayer({
|
||||||
source: new ol.source.Vector({
|
source: new VectorSource({
|
||||||
features: [new ol.Feature(new ol.geom.Point([500, 0]))]
|
features: [new Feature(new Point([500, 0]))]
|
||||||
}),
|
}),
|
||||||
style: new ol.style.Style({
|
style: new Style({
|
||||||
image: new ol.style.Circle({
|
image: new CircleStyle({
|
||||||
fill: new ol.style.Fill({
|
fill: new Fill({
|
||||||
color: 'rgba(0,0,255,0.8)'
|
color: 'rgba(0,0,255,0.8)'
|
||||||
}),
|
}),
|
||||||
stroke: new ol.style.Stroke({
|
stroke: new Stroke({
|
||||||
color: 'rgb(0,0,255)',
|
color: 'rgb(0,0,255)',
|
||||||
width: 15
|
width: 15
|
||||||
}),
|
}),
|
||||||
@@ -69,14 +66,14 @@ var blueLayer = new ol.layer.Vector({
|
|||||||
|
|
||||||
// Create the map, the view is centered on the triangle. Zooming and panning is
|
// Create the map, the view is centered on the triangle. Zooming and panning is
|
||||||
// restricted to a sane area
|
// restricted to a sane area
|
||||||
var map = new ol.Map({
|
const map = new Map({
|
||||||
layers: [
|
layers: [
|
||||||
redLayer,
|
redLayer,
|
||||||
greenLayer,
|
greenLayer,
|
||||||
blueLayer
|
blueLayer
|
||||||
],
|
],
|
||||||
target: 'map',
|
target: 'map',
|
||||||
view: new ol.View({
|
view: new View({
|
||||||
center: [250, 220],
|
center: [250, 220],
|
||||||
extent: [0, 0, 500, 500],
|
extent: [0, 0, 500, 500],
|
||||||
resolution: 4,
|
resolution: 4,
|
||||||
@@ -86,19 +83,19 @@ var map = new ol.Map({
|
|||||||
});
|
});
|
||||||
|
|
||||||
// Get the form elements and bind the listeners
|
// Get the form elements and bind the listeners
|
||||||
var select = document.getElementById('blend-mode');
|
const select = document.getElementById('blend-mode');
|
||||||
var affectRed = document.getElementById('affect-red');
|
const affectRed = document.getElementById('affect-red');
|
||||||
var affectGreen = document.getElementById('affect-green');
|
const affectGreen = document.getElementById('affect-green');
|
||||||
var affectBlue = document.getElementById('affect-blue');
|
const affectBlue = document.getElementById('affect-blue');
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This method sets the globalCompositeOperation to the value of the select
|
* This method sets the globalCompositeOperation to the value of the select
|
||||||
* field and it is bound to the precompose event of the layers.
|
* field and it is bound to the precompose event of the layers.
|
||||||
*
|
*
|
||||||
* @param {ol.render.Event} evt The render event.
|
* @param {module:ol/render/Event~RenderEvent} evt The render event.
|
||||||
*/
|
*/
|
||||||
var setBlendModeFromSelect = function(evt) {
|
const setBlendModeFromSelect = function(evt) {
|
||||||
evt.context.globalCompositeOperation = select.value;
|
evt.context.globalCompositeOperation = select.value;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -107,9 +104,9 @@ var setBlendModeFromSelect = function(evt) {
|
|||||||
* This method resets the globalCompositeOperation to the default value of
|
* This method resets the globalCompositeOperation to the default value of
|
||||||
* 'source-over' and it is bound to the postcompose event of the layers.
|
* 'source-over' and it is bound to the postcompose event of the layers.
|
||||||
*
|
*
|
||||||
* @param {ol.render.Event} evt The render event.
|
* @param {module:ol/render/Event~RenderEvent} evt The render event.
|
||||||
*/
|
*/
|
||||||
var resetBlendModeFromSelect = function(evt) {
|
const resetBlendModeFromSelect = function(evt) {
|
||||||
evt.context.globalCompositeOperation = 'source-over';
|
evt.context.globalCompositeOperation = 'source-over';
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -117,9 +114,9 @@ var resetBlendModeFromSelect = function(evt) {
|
|||||||
/**
|
/**
|
||||||
* Bind the pre- and postcompose handlers to the passed layer.
|
* Bind the pre- and postcompose handlers to the passed layer.
|
||||||
*
|
*
|
||||||
* @param {ol.layer.Vector} layer The layer to bind the handlers to.
|
* @param {module:ol/layer/Vector} layer The layer to bind the handlers to.
|
||||||
*/
|
*/
|
||||||
var bindLayerListeners = function(layer) {
|
const bindLayerListeners = function(layer) {
|
||||||
layer.on('precompose', setBlendModeFromSelect);
|
layer.on('precompose', setBlendModeFromSelect);
|
||||||
layer.on('postcompose', resetBlendModeFromSelect);
|
layer.on('postcompose', resetBlendModeFromSelect);
|
||||||
};
|
};
|
||||||
@@ -128,9 +125,9 @@ var bindLayerListeners = function(layer) {
|
|||||||
/**
|
/**
|
||||||
* Unind the pre- and postcompose handlers to the passed layers.
|
* Unind the pre- and postcompose handlers to the passed layers.
|
||||||
*
|
*
|
||||||
* @param {ol.layer.Vector} layer The layer to unbind the handlers from.
|
* @param {module:ol/layer/Vector} layer The layer to unbind the handlers from.
|
||||||
*/
|
*/
|
||||||
var unbindLayerListeners = function(layer) {
|
const unbindLayerListeners = function(layer) {
|
||||||
layer.un('precompose', setBlendModeFromSelect);
|
layer.un('precompose', setBlendModeFromSelect);
|
||||||
layer.un('postcompose', resetBlendModeFromSelect);
|
layer.un('postcompose', resetBlendModeFromSelect);
|
||||||
};
|
};
|
||||||
@@ -141,8 +138,8 @@ var unbindLayerListeners = function(layer) {
|
|||||||
*
|
*
|
||||||
* @this {HTMLInputElement}
|
* @this {HTMLInputElement}
|
||||||
*/
|
*/
|
||||||
var affectLayerClicked = function() {
|
const affectLayerClicked = function() {
|
||||||
var layer;
|
let layer;
|
||||||
if (this.id == 'affect-red') {
|
if (this.id == 'affect-red') {
|
||||||
layer = redLayer;
|
layer = redLayer;
|
||||||
} else if (this.id == 'affect-green') {
|
} else if (this.id == 'affect-green') {
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ title: Box Selection
|
|||||||
shortdesc: Using a DragBox interaction to select features.
|
shortdesc: Using a DragBox interaction to select features.
|
||||||
docs: >
|
docs: >
|
||||||
<p>This example shows how to use a <code>DragBox</code> interaction to select features. Selected features are added
|
<p>This example shows how to use a <code>DragBox</code> interaction to select features. Selected features are added
|
||||||
to the feature overlay of a select interaction (<code>ol.interaction.Select</code>) for highlighting.</p>
|
to the feature overlay of a select interaction (<code>ol/interaction/Select</code>) for highlighting.</p>
|
||||||
<p>Use <code>Ctrl+Drag</code> (<code>Command+Drag</code> on Mac) to draw boxes.</p>
|
<p>Use <code>Ctrl+Drag</code> (<code>Command+Drag</code> on Mac) to draw boxes.</p>
|
||||||
tags: "DragBox, feature, selection, box"
|
tags: "DragBox, feature, selection, box"
|
||||||
---
|
---
|
||||||
|
|||||||
@@ -1,46 +1,43 @@
|
|||||||
goog.require('ol.Map');
|
import Map from '../src/ol/Map.js';
|
||||||
goog.require('ol.View');
|
import View from '../src/ol/View.js';
|
||||||
goog.require('ol.events.condition');
|
import {platformModifierKeyOnly} from '../src/ol/events/condition.js';
|
||||||
goog.require('ol.format.GeoJSON');
|
import GeoJSON from '../src/ol/format/GeoJSON.js';
|
||||||
goog.require('ol.interaction.DragBox');
|
import {DragBox, Select} from '../src/ol/interaction.js';
|
||||||
goog.require('ol.interaction.Select');
|
import {Tile as TileLayer, Vector as VectorLayer} from '../src/ol/layer.js';
|
||||||
goog.require('ol.layer.Tile');
|
import {OSM, Vector as VectorSource} from '../src/ol/source.js';
|
||||||
goog.require('ol.layer.Vector');
|
|
||||||
goog.require('ol.source.OSM');
|
|
||||||
goog.require('ol.source.Vector');
|
|
||||||
|
|
||||||
|
|
||||||
var vectorSource = new ol.source.Vector({
|
const vectorSource = new VectorSource({
|
||||||
url: 'data/geojson/countries.geojson',
|
url: 'data/geojson/countries.geojson',
|
||||||
format: new ol.format.GeoJSON()
|
format: new GeoJSON()
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
var map = new ol.Map({
|
const map = new Map({
|
||||||
layers: [
|
layers: [
|
||||||
new ol.layer.Tile({
|
new TileLayer({
|
||||||
source: new ol.source.OSM()
|
source: new OSM()
|
||||||
}),
|
}),
|
||||||
new ol.layer.Vector({
|
new VectorLayer({
|
||||||
source: vectorSource
|
source: vectorSource
|
||||||
})
|
})
|
||||||
],
|
],
|
||||||
target: 'map',
|
target: 'map',
|
||||||
view: new ol.View({
|
view: new View({
|
||||||
center: [0, 0],
|
center: [0, 0],
|
||||||
zoom: 2
|
zoom: 2
|
||||||
})
|
})
|
||||||
});
|
});
|
||||||
|
|
||||||
// a normal select interaction to handle click
|
// a normal select interaction to handle click
|
||||||
var select = new ol.interaction.Select();
|
const select = new Select();
|
||||||
map.addInteraction(select);
|
map.addInteraction(select);
|
||||||
|
|
||||||
var selectedFeatures = select.getFeatures();
|
const selectedFeatures = select.getFeatures();
|
||||||
|
|
||||||
// a DragBox interaction used to select features by drawing boxes
|
// a DragBox interaction used to select features by drawing boxes
|
||||||
var dragBox = new ol.interaction.DragBox({
|
const dragBox = new DragBox({
|
||||||
condition: ol.events.condition.platformModifierKeyOnly
|
condition: platformModifierKeyOnly
|
||||||
});
|
});
|
||||||
|
|
||||||
map.addInteraction(dragBox);
|
map.addInteraction(dragBox);
|
||||||
@@ -48,7 +45,7 @@ map.addInteraction(dragBox);
|
|||||||
dragBox.on('boxend', function() {
|
dragBox.on('boxend', function() {
|
||||||
// features that intersect the box are added to the collection of
|
// features that intersect the box are added to the collection of
|
||||||
// selected features
|
// selected features
|
||||||
var extent = dragBox.getGeometry().getExtent();
|
const extent = dragBox.getGeometry().getExtent();
|
||||||
vectorSource.forEachFeatureIntersectingExtent(extent, function(feature) {
|
vectorSource.forEachFeatureIntersectingExtent(extent, function(feature) {
|
||||||
selectedFeatures.push(feature);
|
selectedFeatures.push(feature);
|
||||||
});
|
});
|
||||||
@@ -59,10 +56,10 @@ dragBox.on('boxstart', function() {
|
|||||||
selectedFeatures.clear();
|
selectedFeatures.clear();
|
||||||
});
|
});
|
||||||
|
|
||||||
var infoBox = document.getElementById('info');
|
const infoBox = document.getElementById('info');
|
||||||
|
|
||||||
selectedFeatures.on(['add', 'remove'], function() {
|
selectedFeatures.on(['add', 'remove'], function() {
|
||||||
var names = selectedFeatures.getArray().map(function(feature) {
|
const names = selectedFeatures.getArray().map(function(feature) {
|
||||||
return feature.get('name');
|
return feature.get('name');
|
||||||
});
|
});
|
||||||
if (names.length > 0) {
|
if (names.length > 0) {
|
||||||
|
|||||||
@@ -1,16 +1,16 @@
|
|||||||
goog.require('ol.Map');
|
import Map from '../src/ol/Map.js';
|
||||||
goog.require('ol.View');
|
import View from '../src/ol/View.js';
|
||||||
goog.require('ol.layer.Tile');
|
import TileLayer from '../src/ol/layer/Tile.js';
|
||||||
goog.require('ol.source.OSM');
|
import OSM from '../src/ol/source/OSM.js';
|
||||||
|
|
||||||
var map = new ol.Map({
|
const map = new Map({
|
||||||
layers: [
|
layers: [
|
||||||
new ol.layer.Tile({
|
new TileLayer({
|
||||||
source: new ol.source.OSM()
|
source: new OSM()
|
||||||
})
|
})
|
||||||
],
|
],
|
||||||
target: 'map',
|
target: 'map',
|
||||||
view: new ol.View({
|
view: new View({
|
||||||
center: [-8730000, 5930000],
|
center: [-8730000, 5930000],
|
||||||
rotation: Math.PI / 5,
|
rotation: Math.PI / 5,
|
||||||
zoom: 8
|
zoom: 8
|
||||||
|
|||||||
@@ -3,10 +3,11 @@ layout: example.html
|
|||||||
title: Styling feature with CanvasGradient or CanvasPattern
|
title: Styling feature with CanvasGradient or CanvasPattern
|
||||||
shortdesc: Example showing the countries vector layer styled with patterns and gradients.
|
shortdesc: Example showing the countries vector layer styled with patterns and gradients.
|
||||||
docs: >
|
docs: >
|
||||||
First this example creates a reusable [`CanvasPattern`](https://developer.mozilla.org/en-US/docs/Web/API/CanvasPattern)
|
This example creates a [`CanvasPattern`](https://developer.mozilla.org/en-US/docs/Web/API/CanvasPattern)
|
||||||
and a [`CanvasGradient`](https://developer.mozilla.org/en/docs/Web/API/CanvasGradient). The countries are loaded from
|
and a [`CanvasGradient`](https://developer.mozilla.org/en/docs/Web/API/CanvasGradient). The countries are loaded from
|
||||||
a GeoJSON file. A style function determines for each country whether to use a fill with the pregenerated
|
a GeoJSON file. A style function determines for each country whether to use a fill with the
|
||||||
CanvasGradient (rainbow colors) or a CanvasPattern (repeating stacked circles).
|
CanvasGradient (rainbow colors) or a CanvasPattern (repeating stacked circles). **Note**: For seamless repeat patterns,
|
||||||
|
image width and height of the pattern image must be a factor of two (2, 4, 8, ..., 512).
|
||||||
tags: "canvas, gradient, pattern, style"
|
tags: "canvas, gradient, pattern, style"
|
||||||
---
|
---
|
||||||
<div id="map" class="map"></div>
|
<div id="map" class="map"></div>
|
||||||
|
|||||||
@@ -1,31 +1,22 @@
|
|||||||
goog.require('ol.Map');
|
import Map from '../src/ol/Map.js';
|
||||||
goog.require('ol.View');
|
import View from '../src/ol/View.js';
|
||||||
goog.require('ol.extent');
|
import GeoJSON from '../src/ol/format/GeoJSON.js';
|
||||||
goog.require('ol.format.GeoJSON');
|
import {DEVICE_PIXEL_RATIO} from '../src/ol/has.js';
|
||||||
goog.require('ol.has');
|
import VectorLayer from '../src/ol/layer/Vector.js';
|
||||||
goog.require('ol.layer.Vector');
|
import {fromLonLat} from '../src/ol/proj.js';
|
||||||
goog.require('ol.proj');
|
import VectorSource from '../src/ol/source/Vector.js';
|
||||||
goog.require('ol.source.Vector');
|
import {Fill, Stroke, Style} from '../src/ol/style.js';
|
||||||
goog.require('ol.style.Fill');
|
|
||||||
goog.require('ol.style.Stroke');
|
|
||||||
goog.require('ol.style.Style');
|
|
||||||
|
|
||||||
var canvas = document.createElement('canvas');
|
const canvas = document.createElement('canvas');
|
||||||
var context = canvas.getContext('2d');
|
const context = canvas.getContext('2d');
|
||||||
|
|
||||||
// Gradient and pattern are in canvas pixel space, so we adjust for the
|
// Gradient and pattern are in canvas pixel space, so we adjust for the
|
||||||
// renderer's pixel ratio
|
// renderer's pixel ratio
|
||||||
var pixelRatio = ol.has.DEVICE_PIXEL_RATIO;
|
const pixelRatio = DEVICE_PIXEL_RATIO;
|
||||||
|
|
||||||
// Generate a rainbow gradient
|
// Generate a rainbow gradient
|
||||||
function gradient(feature, resolution) {
|
const gradient = (function() {
|
||||||
var extent = feature.getGeometry().getExtent();
|
const grad = context.createLinearGradient(0, 0, 512 * pixelRatio, 0);
|
||||||
// Gradient starts on the left edge of each feature, and ends on the right.
|
|
||||||
// Coordinate origin is the top-left corner of the extent of the geometry, so
|
|
||||||
// we just divide the geometry's extent width by resolution and multiply with
|
|
||||||
// pixelRatio to match the renderer's pixel coordinate system.
|
|
||||||
var grad = context.createLinearGradient(0, 0,
|
|
||||||
ol.extent.getWidth(extent) / resolution * pixelRatio, 0);
|
|
||||||
grad.addColorStop(0, 'red');
|
grad.addColorStop(0, 'red');
|
||||||
grad.addColorStop(1 / 6, 'orange');
|
grad.addColorStop(1 / 6, 'orange');
|
||||||
grad.addColorStop(2 / 6, 'yellow');
|
grad.addColorStop(2 / 6, 'yellow');
|
||||||
@@ -34,33 +25,33 @@ function gradient(feature, resolution) {
|
|||||||
grad.addColorStop(5 / 6, 'blue');
|
grad.addColorStop(5 / 6, 'blue');
|
||||||
grad.addColorStop(1, 'purple');
|
grad.addColorStop(1, 'purple');
|
||||||
return grad;
|
return grad;
|
||||||
}
|
})();
|
||||||
|
|
||||||
// Generate a canvasPattern with two circles on white background
|
// Generate a canvasPattern with two circles on white background
|
||||||
var pattern = (function() {
|
const pattern = (function() {
|
||||||
canvas.width = 11 * pixelRatio;
|
canvas.width = 8 * pixelRatio;
|
||||||
canvas.height = 11 * pixelRatio;
|
canvas.height = 8 * pixelRatio;
|
||||||
// white background
|
// white background
|
||||||
context.fillStyle = 'white';
|
context.fillStyle = 'white';
|
||||||
context.fillRect(0, 0, canvas.width, canvas.height);
|
context.fillRect(0, 0, canvas.width, canvas.height);
|
||||||
// outer circle
|
// outer circle
|
||||||
context.fillStyle = 'rgba(102, 0, 102, 0.5)';
|
context.fillStyle = 'rgba(102, 0, 102, 0.5)';
|
||||||
context.beginPath();
|
context.beginPath();
|
||||||
context.arc(5 * pixelRatio, 5 * pixelRatio, 4 * pixelRatio, 0, 2 * Math.PI);
|
context.arc(4 * pixelRatio, 4 * pixelRatio, 3 * pixelRatio, 0, 2 * Math.PI);
|
||||||
context.fill();
|
context.fill();
|
||||||
// inner circle
|
// inner circle
|
||||||
context.fillStyle = 'rgb(55, 0, 170)';
|
context.fillStyle = 'rgb(55, 0, 170)';
|
||||||
context.beginPath();
|
context.beginPath();
|
||||||
context.arc(5 * pixelRatio, 5 * pixelRatio, 2 * pixelRatio, 0, 2 * Math.PI);
|
context.arc(4 * pixelRatio, 4 * pixelRatio, 1.5 * pixelRatio, 0, 2 * Math.PI);
|
||||||
context.fill();
|
context.fill();
|
||||||
return context.createPattern(canvas, 'repeat');
|
return context.createPattern(canvas, 'repeat');
|
||||||
}());
|
}());
|
||||||
|
|
||||||
// Generate style for gradient or pattern fill
|
// Generate style for gradient or pattern fill
|
||||||
var fill = new ol.style.Fill();
|
const fill = new Fill();
|
||||||
var style = new ol.style.Style({
|
const style = new Style({
|
||||||
fill: fill,
|
fill: fill,
|
||||||
stroke: new ol.style.Stroke({
|
stroke: new Stroke({
|
||||||
color: '#333',
|
color: '#333',
|
||||||
width: 2
|
width: 2
|
||||||
})
|
})
|
||||||
@@ -70,33 +61,32 @@ var style = new ol.style.Style({
|
|||||||
* The styling function for the vector layer, will return an array of styles
|
* The styling function for the vector layer, will return an array of styles
|
||||||
* which either contains the aboove gradient or pattern.
|
* which either contains the aboove gradient or pattern.
|
||||||
*
|
*
|
||||||
* @param {ol.Feature} feature The feature to style.
|
* @param {module:ol/Feature~Feature} feature The feature to style.
|
||||||
* @param {number} resolution Resolution.
|
* @return {module:ol/style/Style} The style to use for the feature.
|
||||||
* @return {ol.style.Style} The style to use for the feature.
|
|
||||||
*/
|
*/
|
||||||
var getStackedStyle = function(feature, resolution) {
|
const getStackedStyle = function(feature) {
|
||||||
var id = feature.getId();
|
const id = feature.getId();
|
||||||
fill.setColor(id > 'J' ? gradient(feature, resolution) : pattern);
|
fill.setColor(id > 'J' ? gradient : pattern);
|
||||||
return style;
|
return style;
|
||||||
};
|
};
|
||||||
|
|
||||||
// Create a vector layer that makes use of the style function above…
|
// Create a vector layer that makes use of the style function above…
|
||||||
var vectorLayer = new ol.layer.Vector({
|
const vectorLayer = new VectorLayer({
|
||||||
source: new ol.source.Vector({
|
source: new VectorSource({
|
||||||
url: 'data/geojson/countries.geojson',
|
url: 'data/geojson/countries.geojson',
|
||||||
format: new ol.format.GeoJSON()
|
format: new GeoJSON()
|
||||||
}),
|
}),
|
||||||
style: getStackedStyle
|
style: getStackedStyle
|
||||||
});
|
});
|
||||||
|
|
||||||
// … finally create a map with that layer.
|
// … finally create a map with that layer.
|
||||||
var map = new ol.Map({
|
const map = new Map({
|
||||||
layers: [
|
layers: [
|
||||||
vectorLayer
|
vectorLayer
|
||||||
],
|
],
|
||||||
target: 'map',
|
target: 'map',
|
||||||
view: new ol.View({
|
view: new View({
|
||||||
center: ol.proj.fromLonLat([7, 52]),
|
center: fromLonLat([16, 48]),
|
||||||
zoom: 3
|
zoom: 3
|
||||||
})
|
})
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -1,34 +1,32 @@
|
|||||||
goog.require('ol.Map');
|
import Map from '../src/ol/Map.js';
|
||||||
goog.require('ol.View');
|
import View from '../src/ol/View.js';
|
||||||
goog.require('ol.control');
|
import {defaults as defaultControls} from '../src/ol/control.js';
|
||||||
goog.require('ol.layer.Tile');
|
import TileLayer from '../src/ol/layer/Tile.js';
|
||||||
goog.require('ol.proj');
|
import {fromLonLat} from '../src/ol/proj.js';
|
||||||
goog.require('ol.source.OSM');
|
import {OSM, TileDebug} from '../src/ol/source.js';
|
||||||
goog.require('ol.source.TileDebug');
|
|
||||||
|
|
||||||
|
|
||||||
var osmSource = new ol.source.OSM();
|
const osmSource = new OSM();
|
||||||
var map = new ol.Map({
|
const map = new Map({
|
||||||
layers: [
|
layers: [
|
||||||
new ol.layer.Tile({
|
new TileLayer({
|
||||||
source: osmSource
|
source: osmSource
|
||||||
}),
|
}),
|
||||||
new ol.layer.Tile({
|
new TileLayer({
|
||||||
source: new ol.source.TileDebug({
|
source: new TileDebug({
|
||||||
projection: 'EPSG:3857',
|
projection: 'EPSG:3857',
|
||||||
tileGrid: osmSource.getTileGrid()
|
tileGrid: osmSource.getTileGrid()
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
],
|
],
|
||||||
target: 'map',
|
target: 'map',
|
||||||
controls: ol.control.defaults({
|
controls: defaultControls({
|
||||||
attributionOptions: {
|
attributionOptions: {
|
||||||
collapsible: false
|
collapsible: false
|
||||||
}
|
}
|
||||||
}),
|
}),
|
||||||
view: new ol.View({
|
view: new View({
|
||||||
center: ol.proj.transform(
|
center: fromLonLat([-0.1275, 51.507222]),
|
||||||
[-0.1275, 51.507222], 'EPSG:4326', 'EPSG:3857'),
|
|
||||||
zoom: 10
|
zoom: 10
|
||||||
})
|
})
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -1,10 +1,9 @@
|
|||||||
goog.require('ol.Map');
|
import Map from '../src/ol/Map.js';
|
||||||
goog.require('ol.View');
|
import View from '../src/ol/View.js';
|
||||||
goog.require('ol.layer.Tile');
|
import TileLayer from '../src/ol/layer/Tile.js';
|
||||||
goog.require('ol.source.CartoDB');
|
import {CartoDB, OSM} from '../src/ol/source.js';
|
||||||
goog.require('ol.source.OSM');
|
|
||||||
|
|
||||||
var mapConfig = {
|
const mapConfig = {
|
||||||
'layers': [{
|
'layers': [{
|
||||||
'type': 'cartodb',
|
'type': 'cartodb',
|
||||||
'options': {
|
'options': {
|
||||||
@@ -15,22 +14,22 @@ var mapConfig = {
|
|||||||
}]
|
}]
|
||||||
};
|
};
|
||||||
|
|
||||||
var cartoDBSource = new ol.source.CartoDB({
|
const cartoDBSource = new CartoDB({
|
||||||
account: 'documentation',
|
account: 'documentation',
|
||||||
config: mapConfig
|
config: mapConfig
|
||||||
});
|
});
|
||||||
|
|
||||||
var map = new ol.Map({
|
const map = new Map({
|
||||||
layers: [
|
layers: [
|
||||||
new ol.layer.Tile({
|
new TileLayer({
|
||||||
source: new ol.source.OSM()
|
source: new OSM()
|
||||||
}),
|
}),
|
||||||
new ol.layer.Tile({
|
new TileLayer({
|
||||||
source: cartoDBSource
|
source: cartoDBSource
|
||||||
})
|
})
|
||||||
],
|
],
|
||||||
target: 'map',
|
target: 'map',
|
||||||
view: new ol.View({
|
view: new View({
|
||||||
center: [0, 0],
|
center: [0, 0],
|
||||||
zoom: 2
|
zoom: 2
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -1,56 +1,51 @@
|
|||||||
goog.require('ol.Map');
|
import Map from '../src/ol/Map.js';
|
||||||
goog.require('ol.View');
|
import View from '../src/ol/View.js';
|
||||||
goog.require('ol.control');
|
import {defaults as defaultControls} from '../src/ol/control.js';
|
||||||
goog.require('ol.format.GeoJSON');
|
import GeoJSON from '../src/ol/format/GeoJSON.js';
|
||||||
goog.require('ol.layer.Tile');
|
import {Tile as TileLayer, Vector as VectorLayer} from '../src/ol/layer.js';
|
||||||
goog.require('ol.layer.Vector');
|
import {OSM, Vector as VectorSource} from '../src/ol/source.js';
|
||||||
goog.require('ol.source.OSM');
|
import {Circle as CircleStyle, Fill, Stroke, Style} from '../src/ol/style.js';
|
||||||
goog.require('ol.source.Vector');
|
|
||||||
goog.require('ol.style.Circle');
|
|
||||||
goog.require('ol.style.Fill');
|
|
||||||
goog.require('ol.style.Stroke');
|
|
||||||
goog.require('ol.style.Style');
|
|
||||||
|
|
||||||
var source = new ol.source.Vector({
|
const source = new VectorSource({
|
||||||
url: 'data/geojson/switzerland.geojson',
|
url: 'data/geojson/switzerland.geojson',
|
||||||
format: new ol.format.GeoJSON()
|
format: new GeoJSON()
|
||||||
});
|
});
|
||||||
var style = new ol.style.Style({
|
const style = new Style({
|
||||||
fill: new ol.style.Fill({
|
fill: new Fill({
|
||||||
color: 'rgba(255, 255, 255, 0.6)'
|
color: 'rgba(255, 255, 255, 0.6)'
|
||||||
}),
|
}),
|
||||||
stroke: new ol.style.Stroke({
|
stroke: new Stroke({
|
||||||
color: '#319FD3',
|
color: '#319FD3',
|
||||||
width: 1
|
width: 1
|
||||||
}),
|
}),
|
||||||
image: new ol.style.Circle({
|
image: new CircleStyle({
|
||||||
radius: 5,
|
radius: 5,
|
||||||
fill: new ol.style.Fill({
|
fill: new Fill({
|
||||||
color: 'rgba(255, 255, 255, 0.6)'
|
color: 'rgba(255, 255, 255, 0.6)'
|
||||||
}),
|
}),
|
||||||
stroke: new ol.style.Stroke({
|
stroke: new Stroke({
|
||||||
color: '#319FD3',
|
color: '#319FD3',
|
||||||
width: 1
|
width: 1
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
});
|
});
|
||||||
var vectorLayer = new ol.layer.Vector({
|
const vectorLayer = new VectorLayer({
|
||||||
source: source,
|
source: source,
|
||||||
style: style
|
style: style
|
||||||
});
|
});
|
||||||
var view = new ol.View({
|
const view = new View({
|
||||||
center: [0, 0],
|
center: [0, 0],
|
||||||
zoom: 1
|
zoom: 1
|
||||||
});
|
});
|
||||||
var map = new ol.Map({
|
const map = new Map({
|
||||||
layers: [
|
layers: [
|
||||||
new ol.layer.Tile({
|
new TileLayer({
|
||||||
source: new ol.source.OSM()
|
source: new OSM()
|
||||||
}),
|
}),
|
||||||
vectorLayer
|
vectorLayer
|
||||||
],
|
],
|
||||||
target: 'map',
|
target: 'map',
|
||||||
controls: ol.control.defaults({
|
controls: defaultControls({
|
||||||
attributionOptions: {
|
attributionOptions: {
|
||||||
collapsible: false
|
collapsible: false
|
||||||
}
|
}
|
||||||
@@ -58,40 +53,40 @@ var map = new ol.Map({
|
|||||||
view: view
|
view: view
|
||||||
});
|
});
|
||||||
|
|
||||||
var zoomtoswitzerlandbest = document.getElementById('zoomtoswitzerlandbest');
|
const zoomtoswitzerlandbest = document.getElementById('zoomtoswitzerlandbest');
|
||||||
zoomtoswitzerlandbest.addEventListener('click', function() {
|
zoomtoswitzerlandbest.addEventListener('click', function() {
|
||||||
var feature = source.getFeatures()[0];
|
const feature = source.getFeatures()[0];
|
||||||
var polygon = /** @type {ol.geom.SimpleGeometry} */ (feature.getGeometry());
|
const polygon = /** @type {module:ol/geom/SimpleGeometry~SimpleGeometry} */ (feature.getGeometry());
|
||||||
view.fit(polygon, {padding: [170, 50, 30, 150], constrainResolution: false});
|
view.fit(polygon, {padding: [170, 50, 30, 150], constrainResolution: false});
|
||||||
}, false);
|
}, false);
|
||||||
|
|
||||||
var zoomtoswitzerlandconstrained =
|
const zoomtoswitzerlandconstrained =
|
||||||
document.getElementById('zoomtoswitzerlandconstrained');
|
document.getElementById('zoomtoswitzerlandconstrained');
|
||||||
zoomtoswitzerlandconstrained.addEventListener('click', function() {
|
zoomtoswitzerlandconstrained.addEventListener('click', function() {
|
||||||
var feature = source.getFeatures()[0];
|
const feature = source.getFeatures()[0];
|
||||||
var polygon = /** @type {ol.geom.SimpleGeometry} */ (feature.getGeometry());
|
const polygon = /** @type {module:ol/geom/SimpleGeometry~SimpleGeometry} */ (feature.getGeometry());
|
||||||
view.fit(polygon, {padding: [170, 50, 30, 150]});
|
view.fit(polygon, {padding: [170, 50, 30, 150]});
|
||||||
}, false);
|
}, false);
|
||||||
|
|
||||||
var zoomtoswitzerlandnearest =
|
const zoomtoswitzerlandnearest =
|
||||||
document.getElementById('zoomtoswitzerlandnearest');
|
document.getElementById('zoomtoswitzerlandnearest');
|
||||||
zoomtoswitzerlandnearest.addEventListener('click', function() {
|
zoomtoswitzerlandnearest.addEventListener('click', function() {
|
||||||
var feature = source.getFeatures()[0];
|
const feature = source.getFeatures()[0];
|
||||||
var polygon = /** @type {ol.geom.SimpleGeometry} */ (feature.getGeometry());
|
const polygon = /** @type {module:ol/geom/SimpleGeometry~SimpleGeometry} */ (feature.getGeometry());
|
||||||
view.fit(polygon, {padding: [170, 50, 30, 150], nearest: true});
|
view.fit(polygon, {padding: [170, 50, 30, 150], nearest: true});
|
||||||
}, false);
|
}, false);
|
||||||
|
|
||||||
var zoomtolausanne = document.getElementById('zoomtolausanne');
|
const zoomtolausanne = document.getElementById('zoomtolausanne');
|
||||||
zoomtolausanne.addEventListener('click', function() {
|
zoomtolausanne.addEventListener('click', function() {
|
||||||
var feature = source.getFeatures()[1];
|
const feature = source.getFeatures()[1];
|
||||||
var point = /** @type {ol.geom.SimpleGeometry} */ (feature.getGeometry());
|
const point = /** @type {module:ol/geom/SimpleGeometry~SimpleGeometry} */ (feature.getGeometry());
|
||||||
view.fit(point, {padding: [170, 50, 30, 150], minResolution: 50});
|
view.fit(point, {padding: [170, 50, 30, 150], minResolution: 50});
|
||||||
}, false);
|
}, false);
|
||||||
|
|
||||||
var centerlausanne = document.getElementById('centerlausanne');
|
const centerlausanne = document.getElementById('centerlausanne');
|
||||||
centerlausanne.addEventListener('click', function() {
|
centerlausanne.addEventListener('click', function() {
|
||||||
var feature = source.getFeatures()[1];
|
const feature = source.getFeatures()[1];
|
||||||
var point = /** @type {ol.geom.Point} */ (feature.getGeometry());
|
const point = /** @type {module:ol/geom/Point~Point} */ (feature.getGeometry());
|
||||||
var size = /** @type {ol.Size} */ (map.getSize());
|
const size = /** @type {module:ol/size~Size} */ (map.getSize());
|
||||||
view.centerOn(point.getCoordinates(), size, [570, 500]);
|
view.centerOn(point.getCoordinates(), size, [570, 500]);
|
||||||
}, false);
|
}, false);
|
||||||
|
|||||||
20
examples/chaikin.html
Normal file
20
examples/chaikin.html
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
---
|
||||||
|
layout: example.html
|
||||||
|
title: Smoothing lines using Chaikins algorithm
|
||||||
|
shortdesc: This uses Chaikins algorithm to smooth drawn lines.
|
||||||
|
docs: >
|
||||||
|
This example uses the npm package [`chaikin-smooth`](https://www.npmjs.com/package/chaikin-smooth) which
|
||||||
|
implements [Chaikins algorithm](http://graphics.cs.ucdavis.edu/education/CAGDNotes/Chaikins-Algorithm/Chaikins-Algorithm.html)
|
||||||
|
to smooth drawn lines.
|
||||||
|
|
||||||
|
Start by drawing on the map. Once you finish a drawing, the feature's geometry will be smoothed
|
||||||
|
as configured via the form elements.
|
||||||
|
tags: "smooth, smoothing, chaikin"
|
||||||
|
---
|
||||||
|
<div id="map" class="map"></div>
|
||||||
|
<form class="form-inline">
|
||||||
|
<label for="shall-smoothen">Smooth drawn geometry?</label>
|
||||||
|
<input id="shall-smoothen" type="checkbox" checked><br>
|
||||||
|
<label for="iterations">Number of smoothings</label>
|
||||||
|
<input style="width: 250px;" type="range" id="iterations" min="2" max="10" step="1" value="5">
|
||||||
|
</form>
|
||||||
54
examples/chaikin.js
Normal file
54
examples/chaikin.js
Normal file
@@ -0,0 +1,54 @@
|
|||||||
|
import Map from '../src/ol/Map.js';
|
||||||
|
import View from '../src/ol/View.js';
|
||||||
|
import {Tile as TileLayer, Vector as VectorLayer} from '../src/ol/layer.js';
|
||||||
|
import {OSM, Vector as VectorSource} from '../src/ol/source.js';
|
||||||
|
import Draw from '../src/ol/interaction/Draw.js';
|
||||||
|
|
||||||
|
import smooth from 'chaikin-smooth';
|
||||||
|
|
||||||
|
function makeSmooth(path, numIterations) {
|
||||||
|
numIterations = Math.min(Math.max(numIterations, 1), 10);
|
||||||
|
while (numIterations > 0) {
|
||||||
|
path = smooth(path);
|
||||||
|
numIterations--;
|
||||||
|
}
|
||||||
|
return path;
|
||||||
|
}
|
||||||
|
|
||||||
|
const vectorSource = new VectorSource({});
|
||||||
|
|
||||||
|
const map = new Map({
|
||||||
|
layers: [
|
||||||
|
new TileLayer({
|
||||||
|
source: new OSM(),
|
||||||
|
opacity: 0.5
|
||||||
|
}),
|
||||||
|
new VectorLayer({
|
||||||
|
source: vectorSource
|
||||||
|
})
|
||||||
|
],
|
||||||
|
target: 'map',
|
||||||
|
view: new View({
|
||||||
|
center: [1078373.5950, 6871994.5910],
|
||||||
|
zoom: 5
|
||||||
|
})
|
||||||
|
});
|
||||||
|
|
||||||
|
const shallSmoothen = document.getElementById('shall-smoothen');
|
||||||
|
const numIterations = document.getElementById('iterations');
|
||||||
|
|
||||||
|
const draw = new Draw({
|
||||||
|
source: vectorSource,
|
||||||
|
type: 'LineString'
|
||||||
|
});
|
||||||
|
map.addInteraction(draw);
|
||||||
|
draw.on('drawend', function(event) {
|
||||||
|
if (!shallSmoothen.checked) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
const feat = event.feature;
|
||||||
|
const geometry = feat.getGeometry();
|
||||||
|
const coords = geometry.getCoordinates();
|
||||||
|
const smoothened = makeSmooth(coords, parseInt(numIterations.value, 10) || 5);
|
||||||
|
geometry.setCoordinates(smoothened);
|
||||||
|
});
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
---
|
---
|
||||||
layout: example.html
|
layout: example.html
|
||||||
title: Clustered Features
|
title: Clustered Features
|
||||||
shortdesc: Example of using ol.source.Cluster.
|
shortdesc: Example of using ol/source/Cluster.
|
||||||
docs: >
|
docs: >
|
||||||
This example shows how to do clustering on point features.
|
This example shows how to do clustering on point features.
|
||||||
tags: "cluster, vector"
|
tags: "cluster, vector"
|
||||||
|
|||||||
@@ -1,58 +1,51 @@
|
|||||||
goog.require('ol.Feature');
|
import Feature from '../src/ol/Feature.js';
|
||||||
goog.require('ol.Map');
|
import Map from '../src/ol/Map.js';
|
||||||
goog.require('ol.View');
|
import View from '../src/ol/View.js';
|
||||||
goog.require('ol.geom.Point');
|
import Point from '../src/ol/geom/Point.js';
|
||||||
goog.require('ol.layer.Tile');
|
import {Tile as TileLayer, Vector as VectorLayer} from '../src/ol/layer.js';
|
||||||
goog.require('ol.layer.Vector');
|
import {Cluster, OSM, Vector as VectorSource} from '../src/ol/source.js';
|
||||||
goog.require('ol.source.Cluster');
|
import {Circle as CircleStyle, Fill, Stroke, Style, Text} from '../src/ol/style.js';
|
||||||
goog.require('ol.source.OSM');
|
|
||||||
goog.require('ol.source.Vector');
|
|
||||||
goog.require('ol.style.Circle');
|
|
||||||
goog.require('ol.style.Fill');
|
|
||||||
goog.require('ol.style.Stroke');
|
|
||||||
goog.require('ol.style.Style');
|
|
||||||
goog.require('ol.style.Text');
|
|
||||||
|
|
||||||
|
|
||||||
var distance = document.getElementById('distance');
|
const distance = document.getElementById('distance');
|
||||||
|
|
||||||
var count = 20000;
|
const count = 20000;
|
||||||
var features = new Array(count);
|
const features = new Array(count);
|
||||||
var e = 4500000;
|
const e = 4500000;
|
||||||
for (var i = 0; i < count; ++i) {
|
for (let i = 0; i < count; ++i) {
|
||||||
var coordinates = [2 * e * Math.random() - e, 2 * e * Math.random() - e];
|
const coordinates = [2 * e * Math.random() - e, 2 * e * Math.random() - e];
|
||||||
features[i] = new ol.Feature(new ol.geom.Point(coordinates));
|
features[i] = new Feature(new Point(coordinates));
|
||||||
}
|
}
|
||||||
|
|
||||||
var source = new ol.source.Vector({
|
const source = new VectorSource({
|
||||||
features: features
|
features: features
|
||||||
});
|
});
|
||||||
|
|
||||||
var clusterSource = new ol.source.Cluster({
|
const clusterSource = new Cluster({
|
||||||
distance: parseInt(distance.value, 10),
|
distance: parseInt(distance.value, 10),
|
||||||
source: source
|
source: source
|
||||||
});
|
});
|
||||||
|
|
||||||
var styleCache = {};
|
const styleCache = {};
|
||||||
var clusters = new ol.layer.Vector({
|
const clusters = new VectorLayer({
|
||||||
source: clusterSource,
|
source: clusterSource,
|
||||||
style: function(feature) {
|
style: function(feature) {
|
||||||
var size = feature.get('features').length;
|
const size = feature.get('features').length;
|
||||||
var style = styleCache[size];
|
let style = styleCache[size];
|
||||||
if (!style) {
|
if (!style) {
|
||||||
style = new ol.style.Style({
|
style = new Style({
|
||||||
image: new ol.style.Circle({
|
image: new CircleStyle({
|
||||||
radius: 10,
|
radius: 10,
|
||||||
stroke: new ol.style.Stroke({
|
stroke: new Stroke({
|
||||||
color: '#fff'
|
color: '#fff'
|
||||||
}),
|
}),
|
||||||
fill: new ol.style.Fill({
|
fill: new Fill({
|
||||||
color: '#3399CC'
|
color: '#3399CC'
|
||||||
})
|
})
|
||||||
}),
|
}),
|
||||||
text: new ol.style.Text({
|
text: new Text({
|
||||||
text: size.toString(),
|
text: size.toString(),
|
||||||
fill: new ol.style.Fill({
|
fill: new Fill({
|
||||||
color: '#fff'
|
color: '#fff'
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
@@ -63,14 +56,14 @@ var clusters = new ol.layer.Vector({
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
var raster = new ol.layer.Tile({
|
const raster = new TileLayer({
|
||||||
source: new ol.source.OSM()
|
source: new OSM()
|
||||||
});
|
});
|
||||||
|
|
||||||
var map = new ol.Map({
|
const map = new Map({
|
||||||
layers: [raster, clusters],
|
layers: [raster, clusters],
|
||||||
target: 'map',
|
target: 'map',
|
||||||
view: new ol.View({
|
view: new View({
|
||||||
center: [0, 0],
|
center: [0, 0],
|
||||||
zoom: 2
|
zoom: 2
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -1,23 +1,21 @@
|
|||||||
// NOCOMPILE
|
import Map from '../src/ol/Map.js';
|
||||||
goog.require('ol.Map');
|
import View from '../src/ol/View.js';
|
||||||
goog.require('ol.View');
|
import ImageLayer from '../src/ol/layer/Image.js';
|
||||||
goog.require('ol.layer.Image');
|
import {Raster as RasterSource, Stamen} from '../src/ol/source.js';
|
||||||
goog.require('ol.source.Raster');
|
|
||||||
goog.require('ol.source.Stamen');
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Color manipulation functions below are adapted from
|
* Color manipulation functions below are adapted from
|
||||||
* https://github.com/d3/d3-color.
|
* https://github.com/d3/d3-color.
|
||||||
*/
|
*/
|
||||||
var Xn = 0.950470;
|
const Xn = 0.950470;
|
||||||
var Yn = 1;
|
const Yn = 1;
|
||||||
var Zn = 1.088830;
|
const Zn = 1.088830;
|
||||||
var t0 = 4 / 29;
|
const t0 = 4 / 29;
|
||||||
var t1 = 6 / 29;
|
const t1 = 6 / 29;
|
||||||
var t2 = 3 * t1 * t1;
|
const t2 = 3 * t1 * t1;
|
||||||
var t3 = t1 * t1 * t1;
|
const t3 = t1 * t1 * t1;
|
||||||
var twoPi = 2 * Math.PI;
|
const twoPi = 2 * Math.PI;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -26,23 +24,23 @@ var twoPi = 2 * Math.PI;
|
|||||||
* @return {Array.<number>} A pixel in HCL space.
|
* @return {Array.<number>} A pixel in HCL space.
|
||||||
*/
|
*/
|
||||||
function rgb2hcl(pixel) {
|
function rgb2hcl(pixel) {
|
||||||
var red = rgb2xyz(pixel[0]);
|
const red = rgb2xyz(pixel[0]);
|
||||||
var green = rgb2xyz(pixel[1]);
|
const green = rgb2xyz(pixel[1]);
|
||||||
var blue = rgb2xyz(pixel[2]);
|
const blue = rgb2xyz(pixel[2]);
|
||||||
|
|
||||||
var x = xyz2lab(
|
const x = xyz2lab(
|
||||||
(0.4124564 * red + 0.3575761 * green + 0.1804375 * blue) / Xn);
|
(0.4124564 * red + 0.3575761 * green + 0.1804375 * blue) / Xn);
|
||||||
var y = xyz2lab(
|
const y = xyz2lab(
|
||||||
(0.2126729 * red + 0.7151522 * green + 0.0721750 * blue) / Yn);
|
(0.2126729 * red + 0.7151522 * green + 0.0721750 * blue) / Yn);
|
||||||
var z = xyz2lab(
|
const z = xyz2lab(
|
||||||
(0.0193339 * red + 0.1191920 * green + 0.9503041 * blue) / Zn);
|
(0.0193339 * red + 0.1191920 * green + 0.9503041 * blue) / Zn);
|
||||||
|
|
||||||
var l = 116 * y - 16;
|
const l = 116 * y - 16;
|
||||||
var a = 500 * (x - y);
|
const a = 500 * (x - y);
|
||||||
var b = 200 * (y - z);
|
const b = 200 * (y - z);
|
||||||
|
|
||||||
var c = Math.sqrt(a * a + b * b);
|
const c = Math.sqrt(a * a + b * b);
|
||||||
var h = Math.atan2(b, a);
|
let h = Math.atan2(b, a);
|
||||||
if (h < 0) {
|
if (h < 0) {
|
||||||
h += twoPi;
|
h += twoPi;
|
||||||
}
|
}
|
||||||
@@ -61,16 +59,16 @@ function rgb2hcl(pixel) {
|
|||||||
* @return {Array.<number>} A pixel in RGB space.
|
* @return {Array.<number>} A pixel in RGB space.
|
||||||
*/
|
*/
|
||||||
function hcl2rgb(pixel) {
|
function hcl2rgb(pixel) {
|
||||||
var h = pixel[0];
|
const h = pixel[0];
|
||||||
var c = pixel[1];
|
const c = pixel[1];
|
||||||
var l = pixel[2];
|
const l = pixel[2];
|
||||||
|
|
||||||
var a = Math.cos(h) * c;
|
const a = Math.cos(h) * c;
|
||||||
var b = Math.sin(h) * c;
|
const b = Math.sin(h) * c;
|
||||||
|
|
||||||
var y = (l + 16) / 116;
|
let y = (l + 16) / 116;
|
||||||
var x = isNaN(a) ? y : y + a / 500;
|
let x = isNaN(a) ? y : y + a / 500;
|
||||||
var z = isNaN(b) ? y : y - b / 200;
|
let z = isNaN(b) ? y : y - b / 200;
|
||||||
|
|
||||||
y = Yn * lab2xyz(y);
|
y = Yn * lab2xyz(y);
|
||||||
x = Xn * lab2xyz(x);
|
x = Xn * lab2xyz(x);
|
||||||
@@ -100,15 +98,15 @@ function xyz2rgb(x) {
|
|||||||
12.92 * x : 1.055 * Math.pow(x, 1 / 2.4) - 0.055);
|
12.92 * x : 1.055 * Math.pow(x, 1 / 2.4) - 0.055);
|
||||||
}
|
}
|
||||||
|
|
||||||
var raster = new ol.source.Raster({
|
const raster = new RasterSource({
|
||||||
sources: [new ol.source.Stamen({
|
sources: [new Stamen({
|
||||||
layer: 'watercolor',
|
layer: 'watercolor',
|
||||||
transition: 0
|
transition: 0
|
||||||
})],
|
})],
|
||||||
operation: function(pixels, data) {
|
operation: function(pixels, data) {
|
||||||
var hcl = rgb2hcl(pixels[0]);
|
const hcl = rgb2hcl(pixels[0]);
|
||||||
|
|
||||||
var h = hcl[0] + Math.PI * data.hue / 180;
|
let h = hcl[0] + Math.PI * data.hue / 180;
|
||||||
if (h < 0) {
|
if (h < 0) {
|
||||||
h += twoPi;
|
h += twoPi;
|
||||||
} else if (h > twoPi) {
|
} else if (h > twoPi) {
|
||||||
@@ -139,33 +137,33 @@ var raster = new ol.source.Raster({
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
var controls = {};
|
const controls = {};
|
||||||
|
|
||||||
raster.on('beforeoperations', function(event) {
|
raster.on('beforeoperations', function(event) {
|
||||||
var data = event.data;
|
const data = event.data;
|
||||||
for (var id in controls) {
|
for (const id in controls) {
|
||||||
data[id] = Number(controls[id].value);
|
data[id] = Number(controls[id].value);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
var map = new ol.Map({
|
const map = new Map({
|
||||||
layers: [
|
layers: [
|
||||||
new ol.layer.Image({
|
new ImageLayer({
|
||||||
source: raster
|
source: raster
|
||||||
})
|
})
|
||||||
],
|
],
|
||||||
target: 'map',
|
target: 'map',
|
||||||
view: new ol.View({
|
view: new View({
|
||||||
center: [0, 2500000],
|
center: [0, 2500000],
|
||||||
zoom: 2,
|
zoom: 2,
|
||||||
maxZoom: 18
|
maxZoom: 18
|
||||||
})
|
})
|
||||||
});
|
});
|
||||||
|
|
||||||
var controlIds = ['hue', 'chroma', 'lightness'];
|
const controlIds = ['hue', 'chroma', 'lightness'];
|
||||||
controlIds.forEach(function(id) {
|
controlIds.forEach(function(id) {
|
||||||
var control = document.getElementById(id);
|
const control = document.getElementById(id);
|
||||||
var output = document.getElementById(id + 'Out');
|
const output = document.getElementById(id + 'Out');
|
||||||
control.addEventListener('input', function() {
|
control.addEventListener('input', function() {
|
||||||
output.innerText = control.value;
|
output.innerText = control.value;
|
||||||
raster.changed();
|
raster.changed();
|
||||||
|
|||||||
@@ -1,17 +1,16 @@
|
|||||||
goog.require('ol');
|
import {inherits} from '../src/ol/index.js';
|
||||||
goog.require('ol.Map');
|
import Map from '../src/ol/Map.js';
|
||||||
goog.require('ol.View');
|
import View from '../src/ol/View.js';
|
||||||
goog.require('ol.control');
|
import {defaults as defaultControls, Control} from '../src/ol/control.js';
|
||||||
goog.require('ol.control.Control');
|
import TileLayer from '../src/ol/layer/Tile.js';
|
||||||
goog.require('ol.layer.Tile');
|
import OSM from '../src/ol/source/OSM.js';
|
||||||
goog.require('ol.source.OSM');
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Define a namespace for the application.
|
* Define a namespace for the application.
|
||||||
*/
|
*/
|
||||||
window.app = {};
|
window.app = {};
|
||||||
var app = window.app;
|
const app = window.app;
|
||||||
|
|
||||||
|
|
||||||
//
|
//
|
||||||
@@ -21,35 +20,35 @@ var app = window.app;
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* @constructor
|
* @constructor
|
||||||
* @extends {ol.control.Control}
|
* @extends {module:ol/control/Control~Control}
|
||||||
* @param {Object=} opt_options Control options.
|
* @param {Object=} opt_options Control options.
|
||||||
*/
|
*/
|
||||||
app.RotateNorthControl = function(opt_options) {
|
app.RotateNorthControl = function(opt_options) {
|
||||||
|
|
||||||
var options = opt_options || {};
|
const options = opt_options || {};
|
||||||
|
|
||||||
var button = document.createElement('button');
|
const button = document.createElement('button');
|
||||||
button.innerHTML = 'N';
|
button.innerHTML = 'N';
|
||||||
|
|
||||||
var this_ = this;
|
const this_ = this;
|
||||||
var handleRotateNorth = function() {
|
const handleRotateNorth = function() {
|
||||||
this_.getMap().getView().setRotation(0);
|
this_.getMap().getView().setRotation(0);
|
||||||
};
|
};
|
||||||
|
|
||||||
button.addEventListener('click', handleRotateNorth, false);
|
button.addEventListener('click', handleRotateNorth, false);
|
||||||
button.addEventListener('touchstart', handleRotateNorth, false);
|
button.addEventListener('touchstart', handleRotateNorth, false);
|
||||||
|
|
||||||
var element = document.createElement('div');
|
const element = document.createElement('div');
|
||||||
element.className = 'rotate-north ol-unselectable ol-control';
|
element.className = 'rotate-north ol-unselectable ol-control';
|
||||||
element.appendChild(button);
|
element.appendChild(button);
|
||||||
|
|
||||||
ol.control.Control.call(this, {
|
Control.call(this, {
|
||||||
element: element,
|
element: element,
|
||||||
target: options.target
|
target: options.target
|
||||||
});
|
});
|
||||||
|
|
||||||
};
|
};
|
||||||
ol.inherits(app.RotateNorthControl, ol.control.Control);
|
inherits(app.RotateNorthControl, Control);
|
||||||
|
|
||||||
|
|
||||||
//
|
//
|
||||||
@@ -57,8 +56,8 @@ ol.inherits(app.RotateNorthControl, ol.control.Control);
|
|||||||
//
|
//
|
||||||
|
|
||||||
|
|
||||||
var map = new ol.Map({
|
const map = new Map({
|
||||||
controls: ol.control.defaults({
|
controls: defaultControls({
|
||||||
attributionOptions: {
|
attributionOptions: {
|
||||||
collapsible: false
|
collapsible: false
|
||||||
}
|
}
|
||||||
@@ -66,12 +65,12 @@ var map = new ol.Map({
|
|||||||
new app.RotateNorthControl()
|
new app.RotateNorthControl()
|
||||||
]),
|
]),
|
||||||
layers: [
|
layers: [
|
||||||
new ol.layer.Tile({
|
new TileLayer({
|
||||||
source: new ol.source.OSM()
|
source: new OSM()
|
||||||
})
|
})
|
||||||
],
|
],
|
||||||
target: 'map',
|
target: 'map',
|
||||||
view: new ol.View({
|
view: new View({
|
||||||
center: [0, 0],
|
center: [0, 0],
|
||||||
zoom: 3,
|
zoom: 3,
|
||||||
rotation: 1
|
rotation: 1
|
||||||
|
|||||||
@@ -1,9 +0,0 @@
|
|||||||
---
|
|
||||||
layout: example.html
|
|
||||||
title: Custom Icon
|
|
||||||
shortdesc: Example using a custom attribution icon object
|
|
||||||
docs: >
|
|
||||||
This example creates a custom element for the attribution icon
|
|
||||||
tags: "icon, element"
|
|
||||||
---
|
|
||||||
<div id="map" class="map"><div id="popup"></div></div>
|
|
||||||
@@ -1,27 +0,0 @@
|
|||||||
goog.require('ol.Map');
|
|
||||||
goog.require('ol.View');
|
|
||||||
goog.require('ol.layer.Tile');
|
|
||||||
goog.require('ol.source.OSM');
|
|
||||||
|
|
||||||
var logoElement = document.createElement('a');
|
|
||||||
logoElement.href = 'https://www.osgeo.org/';
|
|
||||||
logoElement.target = '_blank';
|
|
||||||
|
|
||||||
var logoImage = document.createElement('img');
|
|
||||||
logoImage.src = 'https://www.osgeo.org/sites/all/themes/osgeo/logo.png';
|
|
||||||
|
|
||||||
logoElement.appendChild(logoImage);
|
|
||||||
|
|
||||||
var map = new ol.Map({
|
|
||||||
layers: [
|
|
||||||
new ol.layer.Tile({
|
|
||||||
source: new ol.source.OSM()
|
|
||||||
})
|
|
||||||
],
|
|
||||||
target: 'map',
|
|
||||||
view: new ol.View({
|
|
||||||
center: [0, 0],
|
|
||||||
zoom: 2
|
|
||||||
}),
|
|
||||||
logo: logoElement
|
|
||||||
});
|
|
||||||
@@ -3,8 +3,8 @@ layout: example.html
|
|||||||
title: Custom Interactions
|
title: Custom Interactions
|
||||||
shortdesc: Example of a custom interaction.
|
shortdesc: Example of a custom interaction.
|
||||||
docs: >
|
docs: >
|
||||||
This example demonstrates creating a custom interaction by subclassing `ol.interaction.Pointer`.
|
This example demonstrates creating a custom interaction by subclassing `ol/interaction/Pointer`.
|
||||||
Note that the built in interaction `ol.interaction.Translate` might be a better option for moving features.
|
Note that the built in interaction `ol/interaction/Translate` might be a better option for moving features.
|
||||||
tags: "drag, feature, vector, editing, custom, interaction"
|
tags: "drag, feature, vector, editing, custom, interaction"
|
||||||
---
|
---
|
||||||
<div id="map" class="map"></div>
|
<div id="map" class="map"></div>
|
||||||
|
|||||||
@@ -1,35 +1,27 @@
|
|||||||
goog.require('ol');
|
import {inherits} from '../src/ol/index.js';
|
||||||
goog.require('ol.Feature');
|
import Feature from '../src/ol/Feature.js';
|
||||||
goog.require('ol.Map');
|
import Map from '../src/ol/Map.js';
|
||||||
goog.require('ol.View');
|
import View from '../src/ol/View.js';
|
||||||
goog.require('ol.geom.LineString');
|
import {LineString, Point, Polygon} from '../src/ol/geom.js';
|
||||||
goog.require('ol.geom.Point');
|
import {defaults as defaultInteractions, Pointer as PointerInteraction} from '../src/ol/interaction.js';
|
||||||
goog.require('ol.geom.Polygon');
|
import {Tile as TileLayer, Vector as VectorLayer} from '../src/ol/layer.js';
|
||||||
goog.require('ol.interaction');
|
import {TileJSON, Vector as VectorSource} from '../src/ol/source.js';
|
||||||
goog.require('ol.interaction.Pointer');
|
import {Fill, Icon, Stroke, Style} from '../src/ol/style.js';
|
||||||
goog.require('ol.layer.Tile');
|
|
||||||
goog.require('ol.layer.Vector');
|
|
||||||
goog.require('ol.source.TileJSON');
|
|
||||||
goog.require('ol.source.Vector');
|
|
||||||
goog.require('ol.style.Fill');
|
|
||||||
goog.require('ol.style.Icon');
|
|
||||||
goog.require('ol.style.Stroke');
|
|
||||||
goog.require('ol.style.Style');
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Define a namespace for the application.
|
* Define a namespace for the application.
|
||||||
*/
|
*/
|
||||||
var app = {};
|
const app = {};
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @constructor
|
* @constructor
|
||||||
* @extends {ol.interaction.Pointer}
|
* @extends {module:ol/interaction/Pointer}
|
||||||
*/
|
*/
|
||||||
app.Drag = function() {
|
app.Drag = function() {
|
||||||
|
|
||||||
ol.interaction.Pointer.call(this, {
|
PointerInteraction.call(this, {
|
||||||
handleDownEvent: app.Drag.prototype.handleDownEvent,
|
handleDownEvent: app.Drag.prototype.handleDownEvent,
|
||||||
handleDragEvent: app.Drag.prototype.handleDragEvent,
|
handleDragEvent: app.Drag.prototype.handleDragEvent,
|
||||||
handleMoveEvent: app.Drag.prototype.handleMoveEvent,
|
handleMoveEvent: app.Drag.prototype.handleMoveEvent,
|
||||||
@@ -37,7 +29,7 @@ app.Drag = function() {
|
|||||||
});
|
});
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @type {ol.Pixel}
|
* @type {module:ol~Pixel}
|
||||||
* @private
|
* @private
|
||||||
*/
|
*/
|
||||||
this.coordinate_ = null;
|
this.coordinate_ = null;
|
||||||
@@ -49,7 +41,7 @@ app.Drag = function() {
|
|||||||
this.cursor_ = 'pointer';
|
this.cursor_ = 'pointer';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @type {ol.Feature}
|
* @type {module:ol/Feature~Feature}
|
||||||
* @private
|
* @private
|
||||||
*/
|
*/
|
||||||
this.feature_ = null;
|
this.feature_ = null;
|
||||||
@@ -61,20 +53,20 @@ app.Drag = function() {
|
|||||||
this.previousCursor_ = undefined;
|
this.previousCursor_ = undefined;
|
||||||
|
|
||||||
};
|
};
|
||||||
ol.inherits(app.Drag, ol.interaction.Pointer);
|
inherits(app.Drag, PointerInteraction);
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param {ol.MapBrowserEvent} evt Map browser event.
|
* @param {module:ol/MapBrowserEvent~MapBrowserEvent} evt Map browser event.
|
||||||
* @return {boolean} `true` to start the drag sequence.
|
* @return {boolean} `true` to start the drag sequence.
|
||||||
*/
|
*/
|
||||||
app.Drag.prototype.handleDownEvent = function(evt) {
|
app.Drag.prototype.handleDownEvent = function(evt) {
|
||||||
var map = evt.map;
|
const map = evt.map;
|
||||||
|
|
||||||
var feature = map.forEachFeatureAtPixel(evt.pixel,
|
const feature = map.forEachFeatureAtPixel(evt.pixel,
|
||||||
function(feature) {
|
function(feature) {
|
||||||
return feature;
|
return feature;
|
||||||
});
|
});
|
||||||
|
|
||||||
if (feature) {
|
if (feature) {
|
||||||
this.coordinate_ = evt.coordinate;
|
this.coordinate_ = evt.coordinate;
|
||||||
@@ -86,13 +78,13 @@ app.Drag.prototype.handleDownEvent = function(evt) {
|
|||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param {ol.MapBrowserEvent} evt Map browser event.
|
* @param {module:ol/MapBrowserEvent~MapBrowserEvent} evt Map browser event.
|
||||||
*/
|
*/
|
||||||
app.Drag.prototype.handleDragEvent = function(evt) {
|
app.Drag.prototype.handleDragEvent = function(evt) {
|
||||||
var deltaX = evt.coordinate[0] - this.coordinate_[0];
|
const deltaX = evt.coordinate[0] - this.coordinate_[0];
|
||||||
var deltaY = evt.coordinate[1] - this.coordinate_[1];
|
const deltaY = evt.coordinate[1] - this.coordinate_[1];
|
||||||
|
|
||||||
var geometry = this.feature_.getGeometry();
|
const geometry = this.feature_.getGeometry();
|
||||||
geometry.translate(deltaX, deltaY);
|
geometry.translate(deltaX, deltaY);
|
||||||
|
|
||||||
this.coordinate_[0] = evt.coordinate[0];
|
this.coordinate_[0] = evt.coordinate[0];
|
||||||
@@ -101,16 +93,16 @@ app.Drag.prototype.handleDragEvent = function(evt) {
|
|||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param {ol.MapBrowserEvent} evt Event.
|
* @param {module:ol/MapBrowserEvent~MapBrowserEvent} evt Event.
|
||||||
*/
|
*/
|
||||||
app.Drag.prototype.handleMoveEvent = function(evt) {
|
app.Drag.prototype.handleMoveEvent = function(evt) {
|
||||||
if (this.cursor_) {
|
if (this.cursor_) {
|
||||||
var map = evt.map;
|
const map = evt.map;
|
||||||
var feature = map.forEachFeatureAtPixel(evt.pixel,
|
const feature = map.forEachFeatureAtPixel(evt.pixel,
|
||||||
function(feature) {
|
function(feature) {
|
||||||
return feature;
|
return feature;
|
||||||
});
|
});
|
||||||
var element = evt.map.getTargetElement();
|
const element = evt.map.getTargetElement();
|
||||||
if (feature) {
|
if (feature) {
|
||||||
if (element.style.cursor != this.cursor_) {
|
if (element.style.cursor != this.cursor_) {
|
||||||
this.previousCursor_ = element.style.cursor;
|
this.previousCursor_ = element.style.cursor;
|
||||||
@@ -134,48 +126,48 @@ app.Drag.prototype.handleUpEvent = function() {
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
var pointFeature = new ol.Feature(new ol.geom.Point([0, 0]));
|
const pointFeature = new Feature(new Point([0, 0]));
|
||||||
|
|
||||||
var lineFeature = new ol.Feature(
|
const lineFeature = new Feature(
|
||||||
new ol.geom.LineString([[-1e7, 1e6], [-1e6, 3e6]]));
|
new LineString([[-1e7, 1e6], [-1e6, 3e6]]));
|
||||||
|
|
||||||
var polygonFeature = new ol.Feature(
|
const polygonFeature = new Feature(
|
||||||
new ol.geom.Polygon([[[-3e6, -1e6], [-3e6, 1e6],
|
new Polygon([[[-3e6, -1e6], [-3e6, 1e6],
|
||||||
[-1e6, 1e6], [-1e6, -1e6], [-3e6, -1e6]]]));
|
[-1e6, 1e6], [-1e6, -1e6], [-3e6, -1e6]]]));
|
||||||
|
|
||||||
|
|
||||||
var map = new ol.Map({
|
const map = new Map({
|
||||||
interactions: ol.interaction.defaults().extend([new app.Drag()]),
|
interactions: defaultInteractions().extend([new app.Drag()]),
|
||||||
layers: [
|
layers: [
|
||||||
new ol.layer.Tile({
|
new TileLayer({
|
||||||
source: new ol.source.TileJSON({
|
source: new TileJSON({
|
||||||
url: 'https://api.tiles.mapbox.com/v3/mapbox.geography-class.json?secure'
|
url: 'https://api.tiles.mapbox.com/v3/mapbox.geography-class.json?secure'
|
||||||
})
|
})
|
||||||
}),
|
}),
|
||||||
new ol.layer.Vector({
|
new VectorLayer({
|
||||||
source: new ol.source.Vector({
|
source: new VectorSource({
|
||||||
features: [pointFeature, lineFeature, polygonFeature]
|
features: [pointFeature, lineFeature, polygonFeature]
|
||||||
}),
|
}),
|
||||||
style: new ol.style.Style({
|
style: new Style({
|
||||||
image: new ol.style.Icon(/** @type {olx.style.IconOptions} */ ({
|
image: new Icon(/** @type {module:ol/style/Icon~Options} */ ({
|
||||||
anchor: [0.5, 46],
|
anchor: [0.5, 46],
|
||||||
anchorXUnits: 'fraction',
|
anchorXUnits: 'fraction',
|
||||||
anchorYUnits: 'pixels',
|
anchorYUnits: 'pixels',
|
||||||
opacity: 0.95,
|
opacity: 0.95,
|
||||||
src: 'data/icon.png'
|
src: 'data/icon.png'
|
||||||
})),
|
})),
|
||||||
stroke: new ol.style.Stroke({
|
stroke: new Stroke({
|
||||||
width: 3,
|
width: 3,
|
||||||
color: [255, 0, 0, 1]
|
color: [255, 0, 0, 1]
|
||||||
}),
|
}),
|
||||||
fill: new ol.style.Fill({
|
fill: new Fill({
|
||||||
color: [0, 0, 255, 0.6]
|
color: [0, 0, 255, 0.6]
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
],
|
],
|
||||||
target: 'map',
|
target: 'map',
|
||||||
view: new ol.View({
|
view: new View({
|
||||||
center: [0, 0],
|
center: [0, 0],
|
||||||
zoom: 2
|
zoom: 2
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ 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>
|
<p>The example loads TopoJSON geometries and uses d3 (<code>d3.geo.path</code>) to render these geometries to a canvas element that is then used as the image of an OpenLayers image layer.</p>
|
||||||
tags: "d3"
|
tags: "d3"
|
||||||
resources:
|
resources:
|
||||||
- https://d3js.org/d3.v3.min.js
|
- https://unpkg.com/d3@4.12.0/build/d3.js
|
||||||
- https://d3js.org/topojson.v1.min.js
|
- https://unpkg.com/topojson@3.0.2/dist/topojson.js
|
||||||
---
|
---
|
||||||
<div id="map" class="map"></div>
|
<div id="map" class="map"></div>
|
||||||
|
|||||||
89
examples/d3.js
vendored
89
examples/d3.js
vendored
@@ -1,91 +1,84 @@
|
|||||||
// NOCOMPILE
|
import Map from '../src/ol/Map.js';
|
||||||
goog.require('ol.Map');
|
import View from '../src/ol/View.js';
|
||||||
goog.require('ol.View');
|
import {getWidth, getCenter} from '../src/ol/extent.js';
|
||||||
goog.require('ol.extent');
|
import {Image as ImageLayer, Tile as TileLayer} from '../src/ol/layer.js';
|
||||||
goog.require('ol.layer.Image');
|
import {fromLonLat, toLonLat} from '../src/ol/proj.js';
|
||||||
goog.require('ol.layer.Tile');
|
import {ImageCanvas as ImageCanvasSource, Stamen} from '../src/ol/source.js';
|
||||||
goog.require('ol.proj');
|
|
||||||
goog.require('ol.source.ImageCanvas');
|
|
||||||
goog.require('ol.source.Stamen');
|
|
||||||
|
|
||||||
|
|
||||||
var map = new ol.Map({
|
const map = new Map({
|
||||||
layers: [
|
layers: [
|
||||||
new ol.layer.Tile({
|
new TileLayer({
|
||||||
source: new ol.source.Stamen({
|
source: new Stamen({
|
||||||
layer: 'watercolor'
|
layer: 'watercolor'
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
],
|
],
|
||||||
target: 'map',
|
target: 'map',
|
||||||
view: new ol.View({
|
view: new View({
|
||||||
center: ol.proj.fromLonLat([-97, 38]),
|
center: fromLonLat([-97, 38]),
|
||||||
zoom: 4
|
zoom: 4
|
||||||
})
|
})
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Load the topojson data and create an ol.layer.Image for that data.
|
* Load the topojson data and create an ol/layer/Image for that data.
|
||||||
*/
|
*/
|
||||||
d3.json('data/topojson/us.json', function(error, us) {
|
d3.json('data/topojson/us.json', function(error, us) {
|
||||||
var features = topojson.feature(us, us.objects.counties);
|
const features = topojson.feature(us, us.objects.counties);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This function uses d3 to render the topojson features to a canvas.
|
* This function uses d3 to render the topojson features to a canvas.
|
||||||
* @param {ol.Extent} extent Extent.
|
* @param {module:ol/extent~Extent} extent Extent.
|
||||||
* @param {number} resolution Resolution.
|
* @param {number} resolution Resolution.
|
||||||
* @param {number} pixelRatio Pixel ratio.
|
* @param {number} pixelRatio Pixel ratio.
|
||||||
* @param {ol.Size} size Size.
|
* @param {module:ol/size~Size} size Size.
|
||||||
* @param {ol.proj.Projection} projection Projection.
|
* @param {module:ol/proj/Projection~Projection} projection Projection.
|
||||||
* @return {HTMLCanvasElement} A canvas element.
|
* @return {HTMLCanvasElement} A canvas element.
|
||||||
*/
|
*/
|
||||||
var canvasFunction = function(extent, resolution, pixelRatio,
|
const canvasFunction = function(extent, resolution, pixelRatio, size, projection) {
|
||||||
size, projection) {
|
const canvasWidth = size[0];
|
||||||
var canvasWidth = size[0];
|
const canvasHeight = size[1];
|
||||||
var canvasHeight = size[1];
|
|
||||||
|
|
||||||
var canvas = d3.select(document.createElement('canvas'));
|
const canvas = d3.select(document.createElement('canvas'));
|
||||||
canvas.attr('width', canvasWidth).attr('height', canvasHeight);
|
canvas.attr('width', canvasWidth).attr('height', canvasHeight);
|
||||||
|
|
||||||
var context = canvas.node().getContext('2d');
|
const context = canvas.node().getContext('2d');
|
||||||
|
|
||||||
var d3Projection = d3.geo.mercator().scale(1).translate([0, 0]);
|
const d3Projection = d3.geoMercator().scale(1).translate([0, 0]);
|
||||||
var d3Path = d3.geo.path().projection(d3Projection);
|
let d3Path = d3.geoPath().projection(d3Projection);
|
||||||
|
|
||||||
var pixelBounds = d3Path.bounds(features);
|
const pixelBounds = d3Path.bounds(features);
|
||||||
var pixelBoundsWidth = pixelBounds[1][0] - pixelBounds[0][0];
|
const pixelBoundsWidth = pixelBounds[1][0] - pixelBounds[0][0];
|
||||||
var pixelBoundsHeight = pixelBounds[1][1] - pixelBounds[0][1];
|
const pixelBoundsHeight = pixelBounds[1][1] - pixelBounds[0][1];
|
||||||
|
|
||||||
var geoBounds = d3.geo.bounds(features);
|
const geoBounds = d3.geoBounds(features);
|
||||||
var geoBoundsLeftBottom = ol.proj.transform(
|
const geoBoundsLeftBottom = fromLonLat(geoBounds[0], projection);
|
||||||
geoBounds[0], 'EPSG:4326', projection);
|
const geoBoundsRightTop = fromLonLat(geoBounds[1], projection);
|
||||||
var geoBoundsRightTop = ol.proj.transform(
|
let geoBoundsWidth = geoBoundsRightTop[0] - geoBoundsLeftBottom[0];
|
||||||
geoBounds[1], 'EPSG:4326', projection);
|
|
||||||
var geoBoundsWidth = geoBoundsRightTop[0] - geoBoundsLeftBottom[0];
|
|
||||||
if (geoBoundsWidth < 0) {
|
if (geoBoundsWidth < 0) {
|
||||||
geoBoundsWidth += ol.extent.getWidth(projection.getExtent());
|
geoBoundsWidth += getWidth(projection.getExtent());
|
||||||
}
|
}
|
||||||
var geoBoundsHeight = geoBoundsRightTop[1] - geoBoundsLeftBottom[1];
|
const geoBoundsHeight = geoBoundsRightTop[1] - geoBoundsLeftBottom[1];
|
||||||
|
|
||||||
var widthResolution = geoBoundsWidth / pixelBoundsWidth;
|
const widthResolution = geoBoundsWidth / pixelBoundsWidth;
|
||||||
var heightResolution = geoBoundsHeight / pixelBoundsHeight;
|
const heightResolution = geoBoundsHeight / pixelBoundsHeight;
|
||||||
var r = Math.max(widthResolution, heightResolution);
|
const r = Math.max(widthResolution, heightResolution);
|
||||||
var scale = r / (resolution / pixelRatio);
|
const scale = r / (resolution / pixelRatio);
|
||||||
|
|
||||||
var center = ol.proj.transform(ol.extent.getCenter(extent),
|
const center = toLonLat(getCenter(extent), projection);
|
||||||
projection, 'EPSG:4326');
|
|
||||||
d3Projection.scale(scale).center(center)
|
d3Projection.scale(scale).center(center)
|
||||||
.translate([canvasWidth / 2, canvasHeight / 2]);
|
.translate([canvasWidth / 2, canvasHeight / 2]);
|
||||||
d3Path = d3Path.projection(d3Projection).context(context);
|
d3Path = d3Path.projection(d3Projection).context(context);
|
||||||
d3Path(features);
|
d3Path(features);
|
||||||
context.stroke();
|
context.stroke();
|
||||||
|
|
||||||
return canvas[0][0];
|
return canvas.node();
|
||||||
};
|
};
|
||||||
|
|
||||||
var layer = new ol.layer.Image({
|
const layer = new ImageLayer({
|
||||||
source: new ol.source.ImageCanvas({
|
source: new ImageCanvasSource({
|
||||||
canvasFunction: canvasFunction,
|
canvasFunction: canvasFunction,
|
||||||
projection: 'EPSG:3857'
|
projection: 'EPSG:3857'
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -1,27 +1,22 @@
|
|||||||
// NOCOMPILE
|
import Map from '../src/ol/Map.js';
|
||||||
goog.require('ol.Map');
|
import View from '../src/ol/View.js';
|
||||||
goog.require('ol.View');
|
import {defaults as defaultControls} from '../src/ol/control.js';
|
||||||
goog.require('ol.control');
|
import TileLayer from '../src/ol/layer/Tile.js';
|
||||||
goog.require('ol.layer.Tile');
|
import {toRadians} from '../src/ol/math.js';
|
||||||
goog.require('ol.math');
|
import OSM from '../src/ol/source/OSM.js';
|
||||||
goog.require('ol.proj');
|
|
||||||
goog.require('ol.source.OSM');
|
|
||||||
|
|
||||||
var projection = ol.proj.get('EPSG:3857');
|
const view = new View({
|
||||||
var view = new ol.View({
|
|
||||||
center: [0, 0],
|
center: [0, 0],
|
||||||
projection: projection,
|
|
||||||
extent: projection.getExtent(),
|
|
||||||
zoom: 2
|
zoom: 2
|
||||||
});
|
});
|
||||||
var map = new ol.Map({
|
const map = new Map({
|
||||||
layers: [
|
layers: [
|
||||||
new ol.layer.Tile({
|
new TileLayer({
|
||||||
source: new ol.source.OSM()
|
source: new OSM()
|
||||||
})
|
})
|
||||||
],
|
],
|
||||||
target: 'map',
|
target: 'map',
|
||||||
controls: ol.control.defaults({
|
controls: defaultControls({
|
||||||
attributionOptions: {
|
attributionOptions: {
|
||||||
collapsible: false
|
collapsible: false
|
||||||
}
|
}
|
||||||
@@ -34,15 +29,15 @@ function el(id) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
var gn = new GyroNorm();
|
const gn = new GyroNorm();
|
||||||
|
|
||||||
gn.init().then(function() {
|
gn.init().then(function() {
|
||||||
gn.start(function(event) {
|
gn.start(function(event) {
|
||||||
var center = view.getCenter();
|
const center = view.getCenter();
|
||||||
var resolution = view.getResolution();
|
const resolution = view.getResolution();
|
||||||
var alpha = ol.math.toRadians(event.do.beta);
|
const alpha = toRadians(event.do.beta);
|
||||||
var beta = ol.math.toRadians(event.do.beta);
|
const beta = toRadians(event.do.beta);
|
||||||
var gamma = ol.math.toRadians(event.do.gamma);
|
const gamma = toRadians(event.do.gamma);
|
||||||
|
|
||||||
el('alpha').innerText = alpha + ' [rad]';
|
el('alpha').innerText = alpha + ' [rad]';
|
||||||
el('beta').innerText = beta + ' [rad]';
|
el('beta').innerText = beta + ' [rad]';
|
||||||
|
|||||||
@@ -3,10 +3,11 @@ layout: example.html
|
|||||||
title: Drag-and-Drop Image Vector
|
title: Drag-and-Drop Image Vector
|
||||||
shortdesc: Example of using the drag-and-drop interaction with image vector rendering.
|
shortdesc: Example of using the drag-and-drop interaction with image vector rendering.
|
||||||
docs: >
|
docs: >
|
||||||
Example of using the drag-and-drop interaction with an `ol.layer.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/Vector` with `renderMode: 'image'``. Drag and drop GPX, GeoJSON, IGC, KML, or TopoJSON files on to the map. Each file is rendered to an image on the client.
|
||||||
tags: "drag-and-drop-image-vector, gpx, geojson, igc, kml, topojson, vector, image"
|
tags: "drag-and-drop-image-vector, gpx, geojson, igc, kml, topojson, vector, image"
|
||||||
cloak:
|
cloak:
|
||||||
As1HiMj1PvLPlqc_gtM7AqZfBL8ZL3VrjaS3zIb22Uvb9WKhuJObROC-qUpa81U5: Your Bing Maps Key from http://www.bingmapsportal.com/ here
|
- key: As1HiMj1PvLPlqc_gtM7AqZfBL8ZL3VrjaS3zIb22Uvb9WKhuJObROC-qUpa81U5
|
||||||
|
value: Your Bing Maps Key from http://www.bingmapsportal.com/ here
|
||||||
---
|
---
|
||||||
<div id="map" class="map"></div>
|
<div id="map" class="map"></div>
|
||||||
<div id="info"> </div>
|
<div id="info"> </div>
|
||||||
|
|||||||
@@ -1,81 +1,71 @@
|
|||||||
goog.require('ol.Map');
|
import Map from '../src/ol/Map.js';
|
||||||
goog.require('ol.View');
|
import View from '../src/ol/View.js';
|
||||||
goog.require('ol.format.GPX');
|
import {GPX, GeoJSON, IGC, KML, TopoJSON} from '../src/ol/format.js';
|
||||||
goog.require('ol.format.GeoJSON');
|
import {defaults as defaultInteractions, DragAndDrop} from '../src/ol/interaction.js';
|
||||||
goog.require('ol.format.IGC');
|
import {Vector as VectorLayer, Tile as TileLayer} from '../src/ol/layer.js';
|
||||||
goog.require('ol.format.KML');
|
import {BingMaps, Vector as VectorSource} from '../src/ol/source.js';
|
||||||
goog.require('ol.format.TopoJSON');
|
import {Circle as CircleStyle, Fill, Stroke, Style} from '../src/ol/style.js';
|
||||||
goog.require('ol.interaction');
|
|
||||||
goog.require('ol.interaction.DragAndDrop');
|
|
||||||
goog.require('ol.layer.Vector');
|
|
||||||
goog.require('ol.layer.Tile');
|
|
||||||
goog.require('ol.source.BingMaps');
|
|
||||||
goog.require('ol.source.Vector');
|
|
||||||
goog.require('ol.style.Circle');
|
|
||||||
goog.require('ol.style.Fill');
|
|
||||||
goog.require('ol.style.Stroke');
|
|
||||||
goog.require('ol.style.Style');
|
|
||||||
|
|
||||||
|
|
||||||
var defaultStyle = {
|
const defaultStyle = {
|
||||||
'Point': new ol.style.Style({
|
'Point': new Style({
|
||||||
image: new ol.style.Circle({
|
image: new CircleStyle({
|
||||||
fill: new ol.style.Fill({
|
fill: new Fill({
|
||||||
color: 'rgba(255,255,0,0.5)'
|
color: 'rgba(255,255,0,0.5)'
|
||||||
}),
|
}),
|
||||||
radius: 5,
|
radius: 5,
|
||||||
stroke: new ol.style.Stroke({
|
stroke: new Stroke({
|
||||||
color: '#ff0',
|
color: '#ff0',
|
||||||
width: 1
|
width: 1
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
}),
|
}),
|
||||||
'LineString': new ol.style.Style({
|
'LineString': new Style({
|
||||||
stroke: new ol.style.Stroke({
|
stroke: new Stroke({
|
||||||
color: '#f00',
|
color: '#f00',
|
||||||
width: 3
|
width: 3
|
||||||
})
|
})
|
||||||
}),
|
}),
|
||||||
'Polygon': new ol.style.Style({
|
'Polygon': new Style({
|
||||||
fill: new ol.style.Fill({
|
fill: new Fill({
|
||||||
color: 'rgba(0,255,255,0.5)'
|
color: 'rgba(0,255,255,0.5)'
|
||||||
}),
|
}),
|
||||||
stroke: new ol.style.Stroke({
|
stroke: new Stroke({
|
||||||
color: '#0ff',
|
color: '#0ff',
|
||||||
width: 1
|
width: 1
|
||||||
})
|
})
|
||||||
}),
|
}),
|
||||||
'MultiPoint': new ol.style.Style({
|
'MultiPoint': new Style({
|
||||||
image: new ol.style.Circle({
|
image: new CircleStyle({
|
||||||
fill: new ol.style.Fill({
|
fill: new Fill({
|
||||||
color: 'rgba(255,0,255,0.5)'
|
color: 'rgba(255,0,255,0.5)'
|
||||||
}),
|
}),
|
||||||
radius: 5,
|
radius: 5,
|
||||||
stroke: new ol.style.Stroke({
|
stroke: new Stroke({
|
||||||
color: '#f0f',
|
color: '#f0f',
|
||||||
width: 1
|
width: 1
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
}),
|
}),
|
||||||
'MultiLineString': new ol.style.Style({
|
'MultiLineString': new Style({
|
||||||
stroke: new ol.style.Stroke({
|
stroke: new Stroke({
|
||||||
color: '#0f0',
|
color: '#0f0',
|
||||||
width: 3
|
width: 3
|
||||||
})
|
})
|
||||||
}),
|
}),
|
||||||
'MultiPolygon': new ol.style.Style({
|
'MultiPolygon': new Style({
|
||||||
fill: new ol.style.Fill({
|
fill: new Fill({
|
||||||
color: 'rgba(0,0,255,0.5)'
|
color: 'rgba(0,0,255,0.5)'
|
||||||
}),
|
}),
|
||||||
stroke: new ol.style.Stroke({
|
stroke: new Stroke({
|
||||||
color: '#00f',
|
color: '#00f',
|
||||||
width: 1
|
width: 1
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
};
|
};
|
||||||
|
|
||||||
var styleFunction = function(feature, resolution) {
|
const styleFunction = function(feature, resolution) {
|
||||||
var featureStyleFunction = feature.getStyleFunction();
|
const featureStyleFunction = feature.getStyleFunction();
|
||||||
if (featureStyleFunction) {
|
if (featureStyleFunction) {
|
||||||
return featureStyleFunction.call(feature, resolution);
|
return featureStyleFunction.call(feature, resolution);
|
||||||
} else {
|
} else {
|
||||||
@@ -83,38 +73,38 @@ var styleFunction = function(feature, resolution) {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
var dragAndDropInteraction = new ol.interaction.DragAndDrop({
|
const dragAndDropInteraction = new DragAndDrop({
|
||||||
formatConstructors: [
|
formatConstructors: [
|
||||||
ol.format.GPX,
|
GPX,
|
||||||
ol.format.GeoJSON,
|
GeoJSON,
|
||||||
ol.format.IGC,
|
IGC,
|
||||||
ol.format.KML,
|
KML,
|
||||||
ol.format.TopoJSON
|
TopoJSON
|
||||||
]
|
]
|
||||||
});
|
});
|
||||||
|
|
||||||
var map = new ol.Map({
|
const map = new Map({
|
||||||
interactions: ol.interaction.defaults().extend([dragAndDropInteraction]),
|
interactions: defaultInteractions().extend([dragAndDropInteraction]),
|
||||||
layers: [
|
layers: [
|
||||||
new ol.layer.Tile({
|
new TileLayer({
|
||||||
source: new ol.source.BingMaps({
|
source: new BingMaps({
|
||||||
imagerySet: 'Aerial',
|
imagerySet: 'Aerial',
|
||||||
key: 'As1HiMj1PvLPlqc_gtM7AqZfBL8ZL3VrjaS3zIb22Uvb9WKhuJObROC-qUpa81U5'
|
key: 'As1HiMj1PvLPlqc_gtM7AqZfBL8ZL3VrjaS3zIb22Uvb9WKhuJObROC-qUpa81U5'
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
],
|
],
|
||||||
target: 'map',
|
target: 'map',
|
||||||
view: new ol.View({
|
view: new View({
|
||||||
center: [0, 0],
|
center: [0, 0],
|
||||||
zoom: 2
|
zoom: 2
|
||||||
})
|
})
|
||||||
});
|
});
|
||||||
|
|
||||||
dragAndDropInteraction.on('addfeatures', function(event) {
|
dragAndDropInteraction.on('addfeatures', function(event) {
|
||||||
var vectorSource = new ol.source.Vector({
|
const vectorSource = new VectorSource({
|
||||||
features: event.features
|
features: event.features
|
||||||
});
|
});
|
||||||
map.addLayer(new ol.layer.Vector({
|
map.addLayer(new VectorLayer({
|
||||||
renderMode: 'image',
|
renderMode: 'image',
|
||||||
source: vectorSource,
|
source: vectorSource,
|
||||||
style: styleFunction
|
style: styleFunction
|
||||||
@@ -122,14 +112,14 @@ dragAndDropInteraction.on('addfeatures', function(event) {
|
|||||||
map.getView().fit(vectorSource.getExtent());
|
map.getView().fit(vectorSource.getExtent());
|
||||||
});
|
});
|
||||||
|
|
||||||
var displayFeatureInfo = function(pixel) {
|
const displayFeatureInfo = function(pixel) {
|
||||||
var features = [];
|
const features = [];
|
||||||
map.forEachFeatureAtPixel(pixel, function(feature) {
|
map.forEachFeatureAtPixel(pixel, function(feature) {
|
||||||
features.push(feature);
|
features.push(feature);
|
||||||
});
|
});
|
||||||
if (features.length > 0) {
|
if (features.length > 0) {
|
||||||
var info = [];
|
const info = [];
|
||||||
var i, ii;
|
let i, ii;
|
||||||
for (i = 0, ii = features.length; i < ii; ++i) {
|
for (i = 0, ii = features.length; i < ii; ++i) {
|
||||||
info.push(features[i].get('name'));
|
info.push(features[i].get('name'));
|
||||||
}
|
}
|
||||||
@@ -143,7 +133,7 @@ map.on('pointermove', function(evt) {
|
|||||||
if (evt.dragging) {
|
if (evt.dragging) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
var pixel = map.getEventPixel(evt.originalEvent);
|
const pixel = map.getEventPixel(evt.originalEvent);
|
||||||
displayFeatureInfo(pixel);
|
displayFeatureInfo(pixel);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@@ -6,7 +6,8 @@ docs: >
|
|||||||
Example of using the drag-and-drop interaction. Drag and drop GPX, GeoJSON, IGC, KML, or TopoJSON files on to the map. There is no projection transform support, so this will only work with data in EPSG:4326 and EPSG:3857.
|
Example of using the drag-and-drop interaction. Drag and drop GPX, GeoJSON, IGC, KML, or TopoJSON files on to the map. There is no projection transform support, so this will only work with data in EPSG:4326 and EPSG:3857.
|
||||||
tags: "drag-and-drop, gpx, geojson, igc, kml, topojson"
|
tags: "drag-and-drop, gpx, geojson, igc, kml, topojson"
|
||||||
cloak:
|
cloak:
|
||||||
As1HiMj1PvLPlqc_gtM7AqZfBL8ZL3VrjaS3zIb22Uvb9WKhuJObROC-qUpa81U5: Your Bing Maps Key from http://www.bingmapsportal.com/ here
|
- key: As1HiMj1PvLPlqc_gtM7AqZfBL8ZL3VrjaS3zIb22Uvb9WKhuJObROC-qUpa81U5
|
||||||
|
value: Your Bing Maps Key from http://www.bingmapsportal.com/ here
|
||||||
---
|
---
|
||||||
<div id="map" class="map"></div>
|
<div id="map" class="map"></div>
|
||||||
<div id="info"> </div>
|
<div id="info"> </div>
|
||||||
|
|||||||
@@ -1,81 +1,71 @@
|
|||||||
goog.require('ol.Map');
|
import Map from '../src/ol/Map.js';
|
||||||
goog.require('ol.View');
|
import View from '../src/ol/View.js';
|
||||||
goog.require('ol.format.GPX');
|
import {GPX, GeoJSON, IGC, KML, TopoJSON} from '../src/ol/format.js';
|
||||||
goog.require('ol.format.GeoJSON');
|
import {defaults as defaultInteractions, DragAndDrop} from '../src/ol/interaction.js';
|
||||||
goog.require('ol.format.IGC');
|
import {Tile as TileLayer, Vector as VectorLayer} from '../src/ol/layer.js';
|
||||||
goog.require('ol.format.KML');
|
import {BingMaps, Vector as VectorSource} from '../src/ol/source.js';
|
||||||
goog.require('ol.format.TopoJSON');
|
import {Circle as CircleStyle, Fill, Stroke, Style} from '../src/ol/style.js';
|
||||||
goog.require('ol.interaction');
|
|
||||||
goog.require('ol.interaction.DragAndDrop');
|
|
||||||
goog.require('ol.layer.Tile');
|
|
||||||
goog.require('ol.layer.Vector');
|
|
||||||
goog.require('ol.source.BingMaps');
|
|
||||||
goog.require('ol.source.Vector');
|
|
||||||
goog.require('ol.style.Circle');
|
|
||||||
goog.require('ol.style.Fill');
|
|
||||||
goog.require('ol.style.Stroke');
|
|
||||||
goog.require('ol.style.Style');
|
|
||||||
|
|
||||||
|
|
||||||
var defaultStyle = {
|
const defaultStyle = {
|
||||||
'Point': new ol.style.Style({
|
'Point': new Style({
|
||||||
image: new ol.style.Circle({
|
image: new CircleStyle({
|
||||||
fill: new ol.style.Fill({
|
fill: new Fill({
|
||||||
color: 'rgba(255,255,0,0.5)'
|
color: 'rgba(255,255,0,0.5)'
|
||||||
}),
|
}),
|
||||||
radius: 5,
|
radius: 5,
|
||||||
stroke: new ol.style.Stroke({
|
stroke: new Stroke({
|
||||||
color: '#ff0',
|
color: '#ff0',
|
||||||
width: 1
|
width: 1
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
}),
|
}),
|
||||||
'LineString': new ol.style.Style({
|
'LineString': new Style({
|
||||||
stroke: new ol.style.Stroke({
|
stroke: new Stroke({
|
||||||
color: '#f00',
|
color: '#f00',
|
||||||
width: 3
|
width: 3
|
||||||
})
|
})
|
||||||
}),
|
}),
|
||||||
'Polygon': new ol.style.Style({
|
'Polygon': new Style({
|
||||||
fill: new ol.style.Fill({
|
fill: new Fill({
|
||||||
color: 'rgba(0,255,255,0.5)'
|
color: 'rgba(0,255,255,0.5)'
|
||||||
}),
|
}),
|
||||||
stroke: new ol.style.Stroke({
|
stroke: new Stroke({
|
||||||
color: '#0ff',
|
color: '#0ff',
|
||||||
width: 1
|
width: 1
|
||||||
})
|
})
|
||||||
}),
|
}),
|
||||||
'MultiPoint': new ol.style.Style({
|
'MultiPoint': new Style({
|
||||||
image: new ol.style.Circle({
|
image: new CircleStyle({
|
||||||
fill: new ol.style.Fill({
|
fill: new Fill({
|
||||||
color: 'rgba(255,0,255,0.5)'
|
color: 'rgba(255,0,255,0.5)'
|
||||||
}),
|
}),
|
||||||
radius: 5,
|
radius: 5,
|
||||||
stroke: new ol.style.Stroke({
|
stroke: new Stroke({
|
||||||
color: '#f0f',
|
color: '#f0f',
|
||||||
width: 1
|
width: 1
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
}),
|
}),
|
||||||
'MultiLineString': new ol.style.Style({
|
'MultiLineString': new Style({
|
||||||
stroke: new ol.style.Stroke({
|
stroke: new Stroke({
|
||||||
color: '#0f0',
|
color: '#0f0',
|
||||||
width: 3
|
width: 3
|
||||||
})
|
})
|
||||||
}),
|
}),
|
||||||
'MultiPolygon': new ol.style.Style({
|
'MultiPolygon': new Style({
|
||||||
fill: new ol.style.Fill({
|
fill: new Fill({
|
||||||
color: 'rgba(0,0,255,0.5)'
|
color: 'rgba(0,0,255,0.5)'
|
||||||
}),
|
}),
|
||||||
stroke: new ol.style.Stroke({
|
stroke: new Stroke({
|
||||||
color: '#00f',
|
color: '#00f',
|
||||||
width: 1
|
width: 1
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
};
|
};
|
||||||
|
|
||||||
var styleFunction = function(feature, resolution) {
|
const styleFunction = function(feature, resolution) {
|
||||||
var featureStyleFunction = feature.getStyleFunction();
|
const featureStyleFunction = feature.getStyleFunction();
|
||||||
if (featureStyleFunction) {
|
if (featureStyleFunction) {
|
||||||
return featureStyleFunction.call(feature, resolution);
|
return featureStyleFunction.call(feature, resolution);
|
||||||
} else {
|
} else {
|
||||||
@@ -83,52 +73,52 @@ var styleFunction = function(feature, resolution) {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
var dragAndDropInteraction = new ol.interaction.DragAndDrop({
|
const dragAndDropInteraction = new DragAndDrop({
|
||||||
formatConstructors: [
|
formatConstructors: [
|
||||||
ol.format.GPX,
|
GPX,
|
||||||
ol.format.GeoJSON,
|
GeoJSON,
|
||||||
ol.format.IGC,
|
IGC,
|
||||||
ol.format.KML,
|
KML,
|
||||||
ol.format.TopoJSON
|
TopoJSON
|
||||||
]
|
]
|
||||||
});
|
});
|
||||||
|
|
||||||
var map = new ol.Map({
|
const map = new Map({
|
||||||
interactions: ol.interaction.defaults().extend([dragAndDropInteraction]),
|
interactions: defaultInteractions().extend([dragAndDropInteraction]),
|
||||||
layers: [
|
layers: [
|
||||||
new ol.layer.Tile({
|
new TileLayer({
|
||||||
source: new ol.source.BingMaps({
|
source: new BingMaps({
|
||||||
imagerySet: 'Aerial',
|
imagerySet: 'Aerial',
|
||||||
key: 'As1HiMj1PvLPlqc_gtM7AqZfBL8ZL3VrjaS3zIb22Uvb9WKhuJObROC-qUpa81U5'
|
key: 'As1HiMj1PvLPlqc_gtM7AqZfBL8ZL3VrjaS3zIb22Uvb9WKhuJObROC-qUpa81U5'
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
],
|
],
|
||||||
target: 'map',
|
target: 'map',
|
||||||
view: new ol.View({
|
view: new View({
|
||||||
center: [0, 0],
|
center: [0, 0],
|
||||||
zoom: 2
|
zoom: 2
|
||||||
})
|
})
|
||||||
});
|
});
|
||||||
|
|
||||||
dragAndDropInteraction.on('addfeatures', function(event) {
|
dragAndDropInteraction.on('addfeatures', function(event) {
|
||||||
var vectorSource = new ol.source.Vector({
|
const vectorSource = new VectorSource({
|
||||||
features: event.features
|
features: event.features
|
||||||
});
|
});
|
||||||
map.addLayer(new ol.layer.Vector({
|
map.addLayer(new VectorLayer({
|
||||||
source: vectorSource,
|
source: vectorSource,
|
||||||
style: styleFunction
|
style: styleFunction
|
||||||
}));
|
}));
|
||||||
map.getView().fit(vectorSource.getExtent());
|
map.getView().fit(vectorSource.getExtent());
|
||||||
});
|
});
|
||||||
|
|
||||||
var displayFeatureInfo = function(pixel) {
|
const displayFeatureInfo = function(pixel) {
|
||||||
var features = [];
|
const features = [];
|
||||||
map.forEachFeatureAtPixel(pixel, function(feature) {
|
map.forEachFeatureAtPixel(pixel, function(feature) {
|
||||||
features.push(feature);
|
features.push(feature);
|
||||||
});
|
});
|
||||||
if (features.length > 0) {
|
if (features.length > 0) {
|
||||||
var info = [];
|
const info = [];
|
||||||
var i, ii;
|
let i, ii;
|
||||||
for (i = 0, ii = features.length; i < ii; ++i) {
|
for (i = 0, ii = features.length; i < ii; ++i) {
|
||||||
info.push(features[i].get('name'));
|
info.push(features[i].get('name'));
|
||||||
}
|
}
|
||||||
@@ -142,7 +132,7 @@ map.on('pointermove', function(evt) {
|
|||||||
if (evt.dragging) {
|
if (evt.dragging) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
var pixel = map.getEventPixel(evt.originalEvent);
|
const pixel = map.getEventPixel(evt.originalEvent);
|
||||||
displayFeatureInfo(pixel);
|
displayFeatureInfo(pixel);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@@ -1,22 +1,21 @@
|
|||||||
goog.require('ol.Map');
|
import Map from '../src/ol/Map.js';
|
||||||
goog.require('ol.View');
|
import View from '../src/ol/View.js';
|
||||||
goog.require('ol.interaction');
|
import {defaults as defaultInteractions, DragRotateAndZoom} from '../src/ol/interaction.js';
|
||||||
goog.require('ol.interaction.DragRotateAndZoom');
|
import TileLayer from '../src/ol/layer/Tile.js';
|
||||||
goog.require('ol.layer.Tile');
|
import OSM from '../src/ol/source/OSM.js';
|
||||||
goog.require('ol.source.OSM');
|
|
||||||
|
|
||||||
|
|
||||||
var map = new ol.Map({
|
const map = new Map({
|
||||||
interactions: ol.interaction.defaults().extend([
|
interactions: defaultInteractions().extend([
|
||||||
new ol.interaction.DragRotateAndZoom()
|
new DragRotateAndZoom()
|
||||||
]),
|
]),
|
||||||
layers: [
|
layers: [
|
||||||
new ol.layer.Tile({
|
new TileLayer({
|
||||||
source: new ol.source.OSM()
|
source: new OSM()
|
||||||
})
|
})
|
||||||
],
|
],
|
||||||
target: 'map',
|
target: 'map',
|
||||||
view: new ol.View({
|
view: new View({
|
||||||
center: [0, 0],
|
center: [0, 0],
|
||||||
zoom: 2
|
zoom: 2
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
---
|
---
|
||||||
layout: example.html
|
layout: example.html
|
||||||
title: Draw and Modify Features
|
title: Draw and Modify Features
|
||||||
shortdesc: Example of using the ol.interaction.Draw interaction together with the ol.interaction.Modify interaction.
|
shortdesc: Example of using the ol/interaction/Draw interaction together with the ol/interaction/Modify interaction.
|
||||||
docs: >
|
docs: >
|
||||||
Example of using the ol.interaction.Draw interaction together with the ol.interaction.Modify interaction.
|
Example of using the ol/interaction/Draw interaction together with the ol/interaction/Modify interaction.
|
||||||
tags: "draw, edit, modify, vector, featureoverlay"
|
tags: "draw, edit, modify, vector, featureoverlay"
|
||||||
---
|
---
|
||||||
<div id="map" class="map"></div>
|
<div id="map" class="map"></div>
|
||||||
|
|||||||
@@ -1,63 +1,56 @@
|
|||||||
goog.require('ol.Map');
|
import Map from '../src/ol/Map.js';
|
||||||
goog.require('ol.View');
|
import View from '../src/ol/View.js';
|
||||||
goog.require('ol.interaction.Draw');
|
import {Draw, Modify, Snap} from '../src/ol/interaction.js';
|
||||||
goog.require('ol.interaction.Modify');
|
import {Tile as TileLayer, Vector as VectorLayer} from '../src/ol/layer.js';
|
||||||
goog.require('ol.interaction.Snap');
|
import {OSM, Vector as VectorSource} from '../src/ol/source.js';
|
||||||
goog.require('ol.layer.Tile');
|
import {Circle as CircleStyle, Fill, Stroke, Style} from '../src/ol/style.js';
|
||||||
goog.require('ol.layer.Vector');
|
|
||||||
goog.require('ol.source.OSM');
|
|
||||||
goog.require('ol.source.Vector');
|
|
||||||
goog.require('ol.style.Circle');
|
|
||||||
goog.require('ol.style.Fill');
|
|
||||||
goog.require('ol.style.Stroke');
|
|
||||||
goog.require('ol.style.Style');
|
|
||||||
|
|
||||||
var raster = new ol.layer.Tile({
|
const raster = new TileLayer({
|
||||||
source: new ol.source.OSM()
|
source: new OSM()
|
||||||
});
|
});
|
||||||
|
|
||||||
var source = new ol.source.Vector();
|
const source = new VectorSource();
|
||||||
var vector = new ol.layer.Vector({
|
const vector = new VectorLayer({
|
||||||
source: source,
|
source: source,
|
||||||
style: new ol.style.Style({
|
style: new Style({
|
||||||
fill: new ol.style.Fill({
|
fill: new Fill({
|
||||||
color: 'rgba(255, 255, 255, 0.2)'
|
color: 'rgba(255, 255, 255, 0.2)'
|
||||||
}),
|
}),
|
||||||
stroke: new ol.style.Stroke({
|
stroke: new Stroke({
|
||||||
color: '#ffcc33',
|
color: '#ffcc33',
|
||||||
width: 2
|
width: 2
|
||||||
}),
|
}),
|
||||||
image: new ol.style.Circle({
|
image: new CircleStyle({
|
||||||
radius: 7,
|
radius: 7,
|
||||||
fill: new ol.style.Fill({
|
fill: new Fill({
|
||||||
color: '#ffcc33'
|
color: '#ffcc33'
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
});
|
});
|
||||||
|
|
||||||
var map = new ol.Map({
|
const map = new Map({
|
||||||
layers: [raster, vector],
|
layers: [raster, vector],
|
||||||
target: 'map',
|
target: 'map',
|
||||||
view: new ol.View({
|
view: new View({
|
||||||
center: [-11000000, 4600000],
|
center: [-11000000, 4600000],
|
||||||
zoom: 4
|
zoom: 4
|
||||||
})
|
})
|
||||||
});
|
});
|
||||||
|
|
||||||
var modify = new ol.interaction.Modify({source: source});
|
const modify = new Modify({source: source});
|
||||||
map.addInteraction(modify);
|
map.addInteraction(modify);
|
||||||
|
|
||||||
var draw, snap; // global so we can remove them later
|
let draw, snap; // global so we can remove them later
|
||||||
var typeSelect = document.getElementById('type');
|
const typeSelect = document.getElementById('type');
|
||||||
|
|
||||||
function addInteractions() {
|
function addInteractions() {
|
||||||
draw = new ol.interaction.Draw({
|
draw = new Draw({
|
||||||
source: source,
|
source: source,
|
||||||
type: typeSelect.value
|
type: typeSelect.value
|
||||||
});
|
});
|
||||||
map.addInteraction(draw);
|
map.addInteraction(draw);
|
||||||
snap = new ol.interaction.Snap({source: source});
|
snap = new Snap({source: source});
|
||||||
map.addInteraction(snap);
|
map.addInteraction(snap);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
---
|
---
|
||||||
layout: example.html
|
layout: example.html
|
||||||
title: Draw Features
|
title: Draw Features
|
||||||
shortdesc: Example of using the ol.interaction.Draw interaction.
|
shortdesc: Example of using the ol/interaction/Draw interaction.
|
||||||
docs: >
|
docs: >
|
||||||
Example of using the Draw interaction. Select a geometry type from the
|
Example of using the Draw interaction. Select a geometry type from the
|
||||||
dropdown above to start drawing. To finish drawing, click the last
|
dropdown above to start drawing. To finish drawing, click the last
|
||||||
|
|||||||
@@ -1,37 +1,35 @@
|
|||||||
goog.require('ol.Map');
|
import Map from '../src/ol/Map.js';
|
||||||
goog.require('ol.View');
|
import View from '../src/ol/View.js';
|
||||||
goog.require('ol.interaction.Draw');
|
import Draw from '../src/ol/interaction/Draw.js';
|
||||||
goog.require('ol.layer.Tile');
|
import {Tile as TileLayer, Vector as VectorLayer} from '../src/ol/layer.js';
|
||||||
goog.require('ol.layer.Vector');
|
import {OSM, Vector as VectorSource} from '../src/ol/source.js';
|
||||||
goog.require('ol.source.OSM');
|
|
||||||
goog.require('ol.source.Vector');
|
|
||||||
|
|
||||||
var raster = new ol.layer.Tile({
|
const raster = new TileLayer({
|
||||||
source: new ol.source.OSM()
|
source: new OSM()
|
||||||
});
|
});
|
||||||
|
|
||||||
var source = new ol.source.Vector({wrapX: false});
|
const source = new VectorSource({wrapX: false});
|
||||||
|
|
||||||
var vector = new ol.layer.Vector({
|
const vector = new VectorLayer({
|
||||||
source: source
|
source: source
|
||||||
});
|
});
|
||||||
|
|
||||||
var map = new ol.Map({
|
const map = new Map({
|
||||||
layers: [raster, vector],
|
layers: [raster, vector],
|
||||||
target: 'map',
|
target: 'map',
|
||||||
view: new ol.View({
|
view: new View({
|
||||||
center: [-11000000, 4600000],
|
center: [-11000000, 4600000],
|
||||||
zoom: 4
|
zoom: 4
|
||||||
})
|
})
|
||||||
});
|
});
|
||||||
|
|
||||||
var typeSelect = document.getElementById('type');
|
const typeSelect = document.getElementById('type');
|
||||||
|
|
||||||
var draw; // global so we can remove it later
|
let draw; // global so we can remove it later
|
||||||
function addInteraction() {
|
function addInteraction() {
|
||||||
var value = typeSelect.value;
|
const value = typeSelect.value;
|
||||||
if (value !== 'None') {
|
if (value !== 'None') {
|
||||||
draw = new ol.interaction.Draw({
|
draw = new Draw({
|
||||||
source: source,
|
source: source,
|
||||||
type: typeSelect.value
|
type: typeSelect.value
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -1,13 +1,13 @@
|
|||||||
---
|
---
|
||||||
layout: example.html
|
layout: example.html
|
||||||
title: Freehand Drawing
|
title: Freehand Drawing
|
||||||
shortdesc: Example using the ol.interaction.Draw interaction in freehand mode.
|
shortdesc: Example using the ol/interaction/Draw interaction in freehand mode.
|
||||||
docs: >
|
docs: >
|
||||||
This example demonstrates the `ol.interaction.Draw` in freehand mode. During
|
This example demonstrates the `ol/interaction/Draw` in freehand mode. During
|
||||||
freehand drawing, points are added while dragging. Set `freehand: true` to
|
freehand drawing, points are added while dragging. Set `freehand: true` to
|
||||||
enable freehand mode. Note that freehand mode can be conditionally enabled
|
enable freehand mode. Note that freehand mode can be conditionally enabled
|
||||||
by using the `freehandCondition` option. For example to toggle freehand mode
|
by using the `freehandCondition` option. For example to toggle freehand mode
|
||||||
with the `Shift` key, use `freehandCondition: ol.events.condition.shiftKeyOnly`.
|
with the `Shift` key, use `freehandCondition: shiftKeyOnly`.
|
||||||
tags: "draw, edit, freehand, vector"
|
tags: "draw, edit, freehand, vector"
|
||||||
---
|
---
|
||||||
<div id="map" class="map"></div>
|
<div id="map" class="map"></div>
|
||||||
|
|||||||
@@ -1,37 +1,35 @@
|
|||||||
goog.require('ol.Map');
|
import Map from '../src/ol/Map.js';
|
||||||
goog.require('ol.View');
|
import View from '../src/ol/View.js';
|
||||||
goog.require('ol.interaction.Draw');
|
import Draw from '../src/ol/interaction/Draw.js';
|
||||||
goog.require('ol.layer.Tile');
|
import {Tile as TileLayer, Vector as VectorLayer} from '../src/ol/layer.js';
|
||||||
goog.require('ol.layer.Vector');
|
import {OSM, Vector as VectorSource} from '../src/ol/source.js';
|
||||||
goog.require('ol.source.OSM');
|
|
||||||
goog.require('ol.source.Vector');
|
|
||||||
|
|
||||||
var raster = new ol.layer.Tile({
|
const raster = new TileLayer({
|
||||||
source: new ol.source.OSM()
|
source: new OSM()
|
||||||
});
|
});
|
||||||
|
|
||||||
var source = new ol.source.Vector({wrapX: false});
|
const source = new VectorSource({wrapX: false});
|
||||||
|
|
||||||
var vector = new ol.layer.Vector({
|
const vector = new VectorLayer({
|
||||||
source: source
|
source: source
|
||||||
});
|
});
|
||||||
|
|
||||||
var map = new ol.Map({
|
const map = new Map({
|
||||||
layers: [raster, vector],
|
layers: [raster, vector],
|
||||||
target: 'map',
|
target: 'map',
|
||||||
view: new ol.View({
|
view: new View({
|
||||||
center: [-11000000, 4600000],
|
center: [-11000000, 4600000],
|
||||||
zoom: 4
|
zoom: 4
|
||||||
})
|
})
|
||||||
});
|
});
|
||||||
|
|
||||||
var typeSelect = document.getElementById('type');
|
const typeSelect = document.getElementById('type');
|
||||||
|
|
||||||
var draw; // global so we can remove it later
|
let draw; // global so we can remove it later
|
||||||
function addInteraction() {
|
function addInteraction() {
|
||||||
var value = typeSelect.value;
|
const value = typeSelect.value;
|
||||||
if (value !== 'None') {
|
if (value !== 'None') {
|
||||||
draw = new ol.interaction.Draw({
|
draw = new Draw({
|
||||||
source: source,
|
source: source,
|
||||||
type: typeSelect.value,
|
type: typeSelect.value,
|
||||||
freehand: true
|
freehand: true
|
||||||
|
|||||||
@@ -1,10 +1,10 @@
|
|||||||
---
|
---
|
||||||
layout: example.html
|
layout: example.html
|
||||||
title: Draw Shapes
|
title: Draw Shapes
|
||||||
shortdesc: Using the ol.interaction.Draw to create regular shapes
|
shortdesc: Using the ol/interaction/Draw to create regular shapes
|
||||||
docs: >
|
docs: >
|
||||||
This demonstrates the use of the `geometryFunction` option for the
|
This demonstrates the use of the `geometryFunction` option for the
|
||||||
`ol.interaction.Draw`. Select a shape type from the dropdown above to start
|
`ol/interaction/Draw`. Select a shape type from the dropdown above to start
|
||||||
drawing. To activate freehand drawing, hold the `Shift` key. Square drawing is
|
drawing. To activate freehand drawing, hold the `Shift` key. Square drawing is
|
||||||
achieved by using `type: 'Circle'` type with a `geometryFunction` that creates
|
achieved by using `type: 'Circle'` type with a `geometryFunction` that creates
|
||||||
a 4-sided regular polygon instead of a circle. Box drawing uses `type: 'Circle'`
|
a 4-sided regular polygon instead of a circle. Box drawing uses `type: 'Circle'`
|
||||||
|
|||||||
@@ -1,63 +1,61 @@
|
|||||||
goog.require('ol.Map');
|
import Map from '../src/ol/Map.js';
|
||||||
goog.require('ol.View');
|
import View from '../src/ol/View.js';
|
||||||
goog.require('ol.geom.Polygon');
|
import Polygon from '../src/ol/geom/Polygon.js';
|
||||||
goog.require('ol.interaction.Draw');
|
import Draw, {createRegularPolygon, createBox} from '../src/ol/interaction/Draw.js';
|
||||||
goog.require('ol.layer.Tile');
|
import {Tile as TileLayer, Vector as VectorLayer} from '../src/ol/layer.js';
|
||||||
goog.require('ol.layer.Vector');
|
import {OSM, Vector as VectorSource} from '../src/ol/source.js';
|
||||||
goog.require('ol.source.OSM');
|
|
||||||
goog.require('ol.source.Vector');
|
|
||||||
|
|
||||||
var raster = new ol.layer.Tile({
|
const raster = new TileLayer({
|
||||||
source: new ol.source.OSM()
|
source: new OSM()
|
||||||
});
|
});
|
||||||
|
|
||||||
var source = new ol.source.Vector({wrapX: false});
|
const source = new VectorSource({wrapX: false});
|
||||||
|
|
||||||
var vector = new ol.layer.Vector({
|
const vector = new VectorLayer({
|
||||||
source: source
|
source: source
|
||||||
});
|
});
|
||||||
|
|
||||||
var map = new ol.Map({
|
const map = new Map({
|
||||||
layers: [raster, vector],
|
layers: [raster, vector],
|
||||||
target: 'map',
|
target: 'map',
|
||||||
view: new ol.View({
|
view: new View({
|
||||||
center: [-11000000, 4600000],
|
center: [-11000000, 4600000],
|
||||||
zoom: 4
|
zoom: 4
|
||||||
})
|
})
|
||||||
});
|
});
|
||||||
|
|
||||||
var typeSelect = document.getElementById('type');
|
const typeSelect = document.getElementById('type');
|
||||||
|
|
||||||
var draw; // global so we can remove it later
|
let draw; // global so we can remove it later
|
||||||
function addInteraction() {
|
function addInteraction() {
|
||||||
var value = typeSelect.value;
|
let value = typeSelect.value;
|
||||||
if (value !== 'None') {
|
if (value !== 'None') {
|
||||||
var geometryFunction;
|
let geometryFunction;
|
||||||
if (value === 'Square') {
|
if (value === 'Square') {
|
||||||
value = 'Circle';
|
value = 'Circle';
|
||||||
geometryFunction = ol.interaction.Draw.createRegularPolygon(4);
|
geometryFunction = createRegularPolygon(4);
|
||||||
} else if (value === 'Box') {
|
} else if (value === 'Box') {
|
||||||
value = 'Circle';
|
value = 'Circle';
|
||||||
geometryFunction = ol.interaction.Draw.createBox();
|
geometryFunction = createBox();
|
||||||
} else if (value === 'Star') {
|
} else if (value === 'Star') {
|
||||||
value = 'Circle';
|
value = 'Circle';
|
||||||
geometryFunction = function(coordinates, geometry) {
|
geometryFunction = function(coordinates, geometry) {
|
||||||
if (!geometry) {
|
if (!geometry) {
|
||||||
geometry = new ol.geom.Polygon(null);
|
geometry = new Polygon(null);
|
||||||
}
|
}
|
||||||
var center = coordinates[0];
|
const center = coordinates[0];
|
||||||
var last = coordinates[1];
|
const last = coordinates[1];
|
||||||
var dx = center[0] - last[0];
|
const dx = center[0] - last[0];
|
||||||
var dy = center[1] - last[1];
|
const dy = center[1] - last[1];
|
||||||
var radius = Math.sqrt(dx * dx + dy * dy);
|
const radius = Math.sqrt(dx * dx + dy * dy);
|
||||||
var rotation = Math.atan2(dy, dx);
|
const rotation = Math.atan2(dy, dx);
|
||||||
var newCoordinates = [];
|
const newCoordinates = [];
|
||||||
var numPoints = 12;
|
const numPoints = 12;
|
||||||
for (var i = 0; i < numPoints; ++i) {
|
for (let i = 0; i < numPoints; ++i) {
|
||||||
var angle = rotation + i * 2 * Math.PI / numPoints;
|
const angle = rotation + i * 2 * Math.PI / numPoints;
|
||||||
var fraction = i % 2 === 0 ? 1 : 0.5;
|
const fraction = i % 2 === 0 ? 1 : 0.5;
|
||||||
var offsetX = radius * fraction * Math.cos(angle);
|
const offsetX = radius * fraction * Math.cos(angle);
|
||||||
var offsetY = radius * fraction * Math.sin(angle);
|
const offsetY = radius * fraction * Math.sin(angle);
|
||||||
newCoordinates.push([center[0] + offsetX, center[1] + offsetY]);
|
newCoordinates.push([center[0] + offsetX, center[1] + offsetY]);
|
||||||
}
|
}
|
||||||
newCoordinates.push(newCoordinates[0].slice());
|
newCoordinates.push(newCoordinates[0].slice());
|
||||||
@@ -65,7 +63,7 @@ function addInteraction() {
|
|||||||
return geometry;
|
return geometry;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
draw = new ol.interaction.Draw({
|
draw = new Draw({
|
||||||
source: source,
|
source: source,
|
||||||
type: value,
|
type: value,
|
||||||
geometryFunction: geometryFunction
|
geometryFunction: geometryFunction
|
||||||
|
|||||||
@@ -1,74 +1,70 @@
|
|||||||
goog.require('ol.Map');
|
import Map from '../src/ol/Map.js';
|
||||||
goog.require('ol.View');
|
import View from '../src/ol/View.js';
|
||||||
goog.require('ol.geom.MultiPoint');
|
import {MultiPoint, Point} from '../src/ol/geom.js';
|
||||||
goog.require('ol.geom.Point');
|
import TileLayer from '../src/ol/layer/Tile.js';
|
||||||
goog.require('ol.layer.Tile');
|
import OSM from '../src/ol/source/OSM.js';
|
||||||
goog.require('ol.source.OSM');
|
import {Circle as CircleStyle, Fill, Stroke, Style} from '../src/ol/style.js';
|
||||||
goog.require('ol.style.Circle');
|
|
||||||
goog.require('ol.style.Fill');
|
|
||||||
goog.require('ol.style.Stroke');
|
|
||||||
goog.require('ol.style.Style');
|
|
||||||
|
|
||||||
|
|
||||||
var map = new ol.Map({
|
const map = new Map({
|
||||||
layers: [
|
layers: [
|
||||||
new ol.layer.Tile({
|
new TileLayer({
|
||||||
source: new ol.source.OSM()
|
source: new OSM()
|
||||||
})
|
})
|
||||||
],
|
],
|
||||||
target: 'map',
|
target: 'map',
|
||||||
view: new ol.View({
|
view: new View({
|
||||||
center: [0, 0],
|
center: [0, 0],
|
||||||
zoom: 2
|
zoom: 2
|
||||||
})
|
})
|
||||||
});
|
});
|
||||||
|
|
||||||
var imageStyle = new ol.style.Style({
|
const imageStyle = new Style({
|
||||||
image: new ol.style.Circle({
|
image: new CircleStyle({
|
||||||
radius: 5,
|
radius: 5,
|
||||||
snapToPixel: false,
|
snapToPixel: false,
|
||||||
fill: new ol.style.Fill({color: 'yellow'}),
|
fill: new Fill({color: 'yellow'}),
|
||||||
stroke: new ol.style.Stroke({color: 'red', width: 1})
|
stroke: new Stroke({color: 'red', width: 1})
|
||||||
})
|
})
|
||||||
});
|
});
|
||||||
|
|
||||||
var headInnerImageStyle = new ol.style.Style({
|
const headInnerImageStyle = new Style({
|
||||||
image: new ol.style.Circle({
|
image: new CircleStyle({
|
||||||
radius: 2,
|
radius: 2,
|
||||||
snapToPixel: false,
|
snapToPixel: false,
|
||||||
fill: new ol.style.Fill({color: 'blue'})
|
fill: new Fill({color: 'blue'})
|
||||||
})
|
})
|
||||||
});
|
});
|
||||||
|
|
||||||
var headOuterImageStyle = new ol.style.Style({
|
const headOuterImageStyle = new Style({
|
||||||
image: new ol.style.Circle({
|
image: new CircleStyle({
|
||||||
radius: 5,
|
radius: 5,
|
||||||
snapToPixel: false,
|
snapToPixel: false,
|
||||||
fill: new ol.style.Fill({color: 'black'})
|
fill: new Fill({color: 'black'})
|
||||||
})
|
})
|
||||||
});
|
});
|
||||||
|
|
||||||
var n = 200;
|
const n = 200;
|
||||||
var omegaTheta = 30000; // Rotation period in ms
|
const omegaTheta = 30000; // Rotation period in ms
|
||||||
var R = 7e6;
|
const R = 7e6;
|
||||||
var r = 2e6;
|
const r = 2e6;
|
||||||
var p = 2e6;
|
const p = 2e6;
|
||||||
map.on('postcompose', function(event) {
|
map.on('postcompose', function(event) {
|
||||||
var vectorContext = event.vectorContext;
|
const vectorContext = event.vectorContext;
|
||||||
var frameState = event.frameState;
|
const frameState = event.frameState;
|
||||||
var theta = 2 * Math.PI * frameState.time / omegaTheta;
|
const theta = 2 * Math.PI * frameState.time / omegaTheta;
|
||||||
var coordinates = [];
|
const coordinates = [];
|
||||||
var i;
|
let i;
|
||||||
for (i = 0; i < n; ++i) {
|
for (i = 0; i < n; ++i) {
|
||||||
var t = theta + 2 * Math.PI * i / n;
|
const t = theta + 2 * Math.PI * i / n;
|
||||||
var x = (R + r) * Math.cos(t) + p * Math.cos((R + r) * t / r);
|
const x = (R + r) * Math.cos(t) + p * Math.cos((R + r) * t / r);
|
||||||
var y = (R + r) * Math.sin(t) + p * Math.sin((R + r) * t / r);
|
const y = (R + r) * Math.sin(t) + p * Math.sin((R + r) * t / r);
|
||||||
coordinates.push([x, y]);
|
coordinates.push([x, y]);
|
||||||
}
|
}
|
||||||
vectorContext.setStyle(imageStyle);
|
vectorContext.setStyle(imageStyle);
|
||||||
vectorContext.drawGeometry(new ol.geom.MultiPoint(coordinates));
|
vectorContext.drawGeometry(new MultiPoint(coordinates));
|
||||||
|
|
||||||
var headPoint = new ol.geom.Point(coordinates[coordinates.length - 1]);
|
const headPoint = new Point(coordinates[coordinates.length - 1]);
|
||||||
|
|
||||||
vectorContext.setStyle(headOuterImageStyle);
|
vectorContext.setStyle(headOuterImageStyle);
|
||||||
vectorContext.drawGeometry(headPoint);
|
vectorContext.drawGeometry(headPoint);
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ docs: >
|
|||||||
<p>This example parses a KML file and renders the features as clusters on a vector layer. The styling in this example is quite involved. Single earthquake locations
|
<p>This example parses a KML file and renders the features as clusters on a vector layer. The styling in this example is quite involved. Single earthquake locations
|
||||||
(rendered as stars) have a size relative to their magnitude. Clusters have an opacity relative to the number of features in the cluster, and a size that represents
|
(rendered as stars) have a size relative to their magnitude. Clusters have an opacity relative to the number of features in the cluster, and a size that represents
|
||||||
the extent of the features that make up the cluster. When clicking or hovering on a cluster, the individual features that make up the cluster will be shown.</p>
|
the extent of the features that make up the cluster. When clicking or hovering on a cluster, the individual features that make up the cluster will be shown.</p>
|
||||||
<p>To achieve this, we make heavy use of style functions and <code>ol.style.Style#geometry</code>.</p>
|
<p>To achieve this, we make heavy use of style functions.</p>
|
||||||
tags: "KML, vector, style, geometry, cluster"
|
tags: "KML, vector, style, geometry, cluster"
|
||||||
---
|
---
|
||||||
<div id="map" class="map"></div>
|
<div id="map" class="map"></div>
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user