Merge master

This commit is contained in:
Pieter Vander Vennet 2024-09-30 01:22:44 +02:00
commit adaedcba25
27 changed files with 674 additions and 433 deletions

View file

@ -4,6 +4,8 @@ All notable changes to this project will be documented in this file. See [standa
### [0.47.2](https://github.com/pietervdvn/mapcomplete/compare/v0.47.1...v0.47.2) (2024-09-24) ### [0.47.2](https://github.com/pietervdvn/mapcomplete/compare/v0.47.1...v0.47.2) (2024-09-24)
@ -64,6 +66,25 @@ All notable changes to this project will be documented in this file. See [standa
* **waste:** add filter for 'recycling centre' ([5da63bf](https://github.com/pietervdvn/MapComplete/commit/5da63bf83aa7d8b230c8dbc082be3fba33344289)) * **waste:** add filter for 'recycling centre' ([5da63bf](https://github.com/pietervdvn/MapComplete/commit/5da63bf83aa7d8b230c8dbc082be3fba33344289))
### [0.46.12](https://github.com/USERNAME/REPOSITORY_NAME/compare/v0.46.11...v0.46.12) (2024-09-29)
### Features
* more integrations of panoramax: add panoramax to nearby images view, add to drawer, add icon, see [#1451](https://github.com/pietervdvn/MapComplete/issues/1451) ([5fd1d75](https://github.com/USERNAME/REPOSITORY_NAME/commits5fd1d75efb0fbd49cac3eb5f7a37104887f92f10))
### Bug Fixes
* add panoramax.xyz to CSP list ([89d31f5](https://github.com/USERNAME/REPOSITORY_NAME/commits89d31f54bcd9f7f2bf62a663d67aa5bf1308307a))
* load external panoramax images ([df9c44a](https://github.com/USERNAME/REPOSITORY_NAME/commitsdf9c44aaed7b2670134e8f9128343022e92c6e8d))
### Theme improvements
* **drinking water:** fix [#2184](https://github.com/pietervdvn/MapComplete/issues/2184) ([308d2ba](https://github.com/USERNAME/REPOSITORY_NAME/commits308d2ba4c62cc66d9c30cd1536549411c0abcb88))
### [0.46.11](https://github.com/USERNAME/REPOSITORY_NAME/compare/v0.46.10...v0.46.11) (2024-09-28) ### [0.46.11](https://github.com/USERNAME/REPOSITORY_NAME/compare/v0.46.10...v0.46.11) (2024-09-28)

View file

@ -177,9 +177,13 @@
}, },
"mappings": [ "mappings": [
{ {
"if": "operational_status=", "if": {
"and": [
"operational_status=",
"disused:amenity="
]
},
"addExtraTags": [ "addExtraTags": [
"disused:amenity=",
"amenity=drinking_water" "amenity=drinking_water"
], ],
"then": { "then": {
@ -221,6 +225,15 @@
"ca": "Aquesta font d'aigua potable està tancada", "ca": "Aquesta font d'aigua potable està tancada",
"cs": "Tato pitná voda je uzavřena" "cs": "Tato pitná voda je uzavřena"
} }
},
{
"if": "disused:amenity=drinking_water",
"addExtraTags": [
"amenity="
],
"then": {
"en": "This drinking water is permanently closed"
}
} }
], ],
"id": "Still in use?" "id": "Still in use?"

View file

@ -887,6 +887,26 @@
"https://www.OpenStreetMap.org" "https://www.OpenStreetMap.org"
] ]
}, },
{
"path": "panoramax.svg",
"license": "LOGO",
"authors": [
"Panoramax"
],
"sources": [
"https://commons.wikimedia.org/wiki/File:Panoramax.svg"
]
},
{
"path": "panoramax_bw.svg",
"license": "LOGO",
"authors": [
"Panoramax"
],
"sources": [
"https://commons.wikimedia.org/wiki/File:Panoramax.svg"
]
},
{ {
"path": "party.svg", "path": "party.svg",
"license": "CC-BY-4.0", "license": "CC-BY-4.0",

187
assets/svg/panoramax.svg Normal file
View file

@ -0,0 +1,187 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Generator: Adobe Illustrator 24.0.2, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg
version="1.1"
id="Calque_1"
x="0px"
y="0px"
width="343.25757mm"
height="343.25757mm"
viewBox="0 0 1297.3515 1297.3513"
xml:space="preserve"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:dc="http://purl.org/dc/elements/1.1/"><metadata
id="metadata118"><rdf:RDF><cc:Work
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /></cc:Work></rdf:RDF></metadata><defs
id="defs72"><rect
x="1150.3843"
y="2292.8162"
width="2107.8879"
height="701.88715"
id="rect141823" /><rect
x="411.88269"
y="1261.6108"
width="815.34668"
height="181.92911"
id="rect66775" /><rect
x="253.02008"
y="1213.0352"
width="2209.7197"
height="583.65765"
id="rect60279" /><rect
x="1150.3843"
y="2292.8162"
width="2551.0081"
height="701.39136"
id="rect141823-1" /><linearGradient
y2="62.288601"
x2="248.6918"
y1="231.7114"
x1="346.50821"
gradientUnits="userSpaceOnUse"
id="SVGID_1_"
gradientTransform="matrix(6.6326761,0,0,6.6326761,-1221.4079,-713.64667)">&#10; <stop
id="stop4"
style="stop-color:#8F2A85"
offset="0" />&#10; <stop
id="stop6"
style="stop-color:#2570B6"
offset="1" />&#10; </linearGradient></defs>&#10;<style
type="text/css"
id="style2">&#10; .st0{fill:url(#SVGID_1_);}&#10; .st1{fill:#FFFFFF;}&#10; .st2{display:none;fill:none;stroke:#E62054;stroke-width:7.5;stroke-miterlimit:10;}&#10;</style>&#10;&#10;<text
y="-2248.8188"
style="font-style:normal;font-weight:normal;font-size:40px;line-height:125%;font-family:Sans;letter-spacing:0px;word-spacing:0px;white-space:pre;shape-inside:url(#rect60279);display:inline;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
id="text60277"
xml:space="preserve"
transform="matrix(0.99999889,0,0,0.99999889,-164.71991,-165.18467)" /><text
y="-4324.1934"
x="304.06815"
style="font-style:normal;font-weight:normal;font-size:89.8058px;line-height:200%;font-family:Sans;letter-spacing:0px;word-spacing:0px;white-space:pre;shape-inside:url(#rect66775);display:inline;fill:#000000;fill-opacity:1;stroke:none;stroke-width:2.24515px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
id="text66773"
xml:space="preserve"
transform="matrix(0.99999889,0,0,0.99999889,-164.71991,-165.18467)" /><text
y="-2248.5173"
x="-121.66869"
style="font-style:normal;font-weight:normal;font-size:40px;line-height:0;font-family:Sans;letter-spacing:0px;word-spacing:0px;white-space:pre;shape-inside:url(#rect141823);display:inline;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
id="text141821"
xml:space="preserve"
transform="matrix(0.99999889,0,0,0.99999889,-164.71991,-165.18467)" /><text
y="-3181.1731"
x="-158.83984"
style="font-style:normal;font-weight:normal;font-size:40px;line-height:0;font-family:Sans;letter-spacing:0px;word-spacing:0px;white-space:pre;shape-inside:url(#rect141823-1);display:inline;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
id="text141821-0"
xml:space="preserve"
transform="matrix(0.99999889,0,0,0.99999889,-164.71991,-165.18467)" /><path
style="display:none;fill:none;stroke:#e62054;stroke-width:49.7451;stroke-miterlimit:10"
id="path49"
d="m 1065.871,503.42011 c -19.2347,0 -35.1531,-15.91842 -35.1531,-35.15318 V 334.28687 H 870.87032 c -19.23476,0 -35.15319,-15.91842 -35.15319,-35.15318 0,-19.23476 15.91843,-35.15319 35.15319,-35.15319 H 1065.871 c 19.2348,0 35.1532,15.91843 35.1532,35.15319 v 169.13324 c 0.6633,19.23476 -15.2551,35.15318 -35.1532,35.15318 z"
class="st2" /><path
style="display:none;fill:none;stroke:#e62054;stroke-width:49.7451;stroke-miterlimit:10"
id="path53"
d="M 426.48102,1032.7077 H 231.48034 c -19.23476,0 -35.15318,-15.9185 -35.15318,-35.15322 V 828.42124 c 0,-19.23476 15.91842,-35.15318 35.15318,-35.15318 19.23476,0 35.15318,15.91842 35.15318,35.15318 v 133.31679 h 159.8475 c 19.23476,0 35.15318,15.91842 35.15318,35.15318 0,19.23479 -15.25515,35.81649 -35.15318,35.81649 z"
class="st2" /><path
style="display:none;fill:none;stroke:#e62054;stroke-width:49.7451;stroke-miterlimit:10"
id="path57"
d="m 231.48034,503.42011 c -19.23476,0 -35.15318,-15.91842 -35.15318,-35.15318 V 299.13369 c 0,-19.23476 15.91842,-35.15319 35.15318,-35.15319 h 195.00068 c 19.23476,0 35.15318,15.91843 35.15318,35.15319 0,19.23476 -15.91842,35.15318 -35.15318,35.15318 h -159.8475 v 133.31679 c 0.66327,19.89803 -15.25515,35.81645 -35.15318,35.81645 z"
class="st2" /><path
style="display:none;fill:none;stroke:#e62054;stroke-width:49.7451;stroke-miterlimit:10"
id="path61"
d="M 1065.871,1032.7077 H 870.87032 c -19.23476,0 -35.15319,-15.9185 -35.15319,-35.15322 0,-19.23476 15.91843,-35.15318 35.15319,-35.15318 H 1030.7179 V 829.08451 c 0,-19.23476 15.9184,-35.15319 35.1531,-35.15319 19.2348,0 35.1532,15.91843 35.1532,35.15319 v 169.13324 c 0.6633,18.57145 -15.2551,34.48995 -35.1532,34.48995 z"
class="st2" /><g
id="g1"
transform="translate(-103.80084,387.319)"><circle
style="fill:url(#SVGID_1_);stroke-width:6.63268"
id="circle9"
r="648.67572"
cy="261.35672"
cx="752.47656"
class="st0" /><path
style="fill:#ffffff;stroke-width:6.63268"
id="path11"
d="m 465.28163,199.67283 c -0.66327,0 -1.32653,0 -1.9898,0 l -36.47972,-10.61228 c -2.65307,-0.66327 -4.64287,-3.31634 -4.64287,-6.63268 v -49.0818 c 0,-1.9898 1.32653,-3.97961 2.65307,-5.30614 1.9898,-1.32654 3.9796,-1.32654 5.96941,-0.66327 l 36.47972,13.26535 c 2.65307,0.66327 4.64287,3.31634 4.64287,5.96941 v 46.42873 c 0,1.98981 -0.66327,3.97961 -2.65307,5.30614 -1.32654,0.66327 -2.65307,1.32654 -3.97961,1.32654 z m -29.84704,-22.5511 23.21437,6.63268 v -33.16338 l -23.21437,-8.62248 z"
class="st1" /><path
style="fill:#ffffff;stroke-width:6.63268"
id="path13"
d="m 465.28163,292.53029 c -0.66327,0 -0.66327,0 -1.32653,0 l -36.47972,-7.95921 c -3.31634,-0.66326 -5.30614,-3.31633 -5.30614,-6.63267 V 228.8566 c 0,-1.9898 0.66327,-3.9796 2.65307,-5.30614 1.32653,-1.32653 3.9796,-1.9898 5.96941,-1.32653 l 36.47972,9.28574 c 2.65307,0.66327 5.30614,3.31634 5.30614,6.63268 v 47.75527 c 0,1.9898 -0.66327,3.9796 -2.65307,5.30614 -1.98981,0.66327 -3.31634,1.32653 -4.64288,1.32653 z m -29.84704,-19.89802 23.21437,5.30614 v -34.48992 l -23.21437,-5.96941 z"
class="st1" /><path
style="fill:#ffffff;stroke-width:6.63268"
id="path15"
d="m 525.63898,306.45891 c -0.66326,0 -1.32653,0 -1.32653,0 l -36.47972,-8.62247 c -3.31634,-0.66327 -5.30614,-3.31634 -5.30614,-6.63268 v -48.41854 c 0,-1.9898 0.66327,-3.9796 2.65307,-5.30614 1.9898,-1.32653 3.97961,-1.9898 5.96941,-1.32653 l 36.47972,9.28574 c 2.65307,0.66327 5.30614,3.31634 5.30614,6.63268 v 47.75527 c 0,1.9898 -0.66327,3.9796 -2.65307,5.30614 -1.9898,0.66327 -3.31634,1.32653 -4.64288,1.32653 z m -29.84704,-20.56129 23.21437,5.30614 v -34.48992 l -23.21437,-5.96941 z"
class="st1" /><path
style="fill:#ffffff;stroke-width:6.63268"
id="path17"
d="m 609.87397,285.23435 c -0.66327,0 -1.32653,0 -1.9898,0 l -43.1124,-14.59189 c -2.65307,-0.66326 -3.9796,-3.31633 -3.9796,-5.30614 v -30.51031 c 0,-1.9898 0.66327,-3.9796 2.65307,-4.64287 1.32653,-1.32654 3.31634,-1.32654 5.30614,-0.66327 l 43.11239,15.91842 c 1.98981,0.66327 3.97961,3.31634 3.97961,5.30614 v 29.18378 c 0,1.9898 -0.66327,3.31634 -2.65307,4.64287 -0.66327,0 -1.9898,0.66327 -3.31634,0.66327 z m -37.14298,-24.5409 31.83684,10.61228 v -17.24496 l -31.83684,-11.93881 z"
class="st1" /><path
style="fill:#ffffff;stroke-width:6.63268"
id="path19"
d="m 638.39448,350.23458 c -0.66327,0 -0.66327,0 -1.32654,0 l -41.78586,-9.94902 c -2.65307,-0.66327 -4.64287,-2.65307 -4.64287,-5.30614 v -31.17358 c 0,-1.9898 0.66327,-3.31633 1.9898,-4.64287 1.32654,-1.32653 3.31634,-1.32653 5.30614,-0.66327 l 41.78586,11.27555 c 2.65307,0.66327 3.97961,2.65307 3.97961,5.30614 v 29.84705 c 0,1.9898 -0.66327,3.31633 -1.9898,4.64287 -0.66327,0 -1.98981,0.66327 -3.31634,0.66327 z m -35.81645,-20.5613 30.51031,7.29594 V 319.061 l -30.51031,-7.95921 z"
class="st1" /><path
style="fill:#ffffff;stroke-width:6.63268"
id="path21"
d="m 525.63898,218.24432 c -0.66326,0 -1.32653,0 -1.9898,0 l -37.14298,-9.94901 c -2.65307,-0.66327 -4.64288,-3.31634 -4.64288,-6.63268 v -49.0818 c 0,-1.9898 1.32654,-3.97961 2.65307,-5.30614 1.98981,-1.32654 3.97961,-1.32654 5.96941,-0.66327 l 37.14299,13.26535 c 2.65307,0.66327 4.64287,3.31634 4.64287,5.96941 v 45.76547 c 0,1.9898 -0.66327,3.9796 -2.65307,5.30614 -1.32653,0.66326 -2.65307,1.32653 -3.97961,1.32653 z m -30.51031,-21.88783 23.87764,6.63268 v -32.50012 l -23.87764,-8.62247 z"
class="st1" /><path
style="fill:#ffffff;stroke-width:6.63268"
id="path23"
d="m 690.79262,356.86725 c -8.62248,0 -15.25516,-7.95921 -15.25516,-17.24496 0,-9.28574 6.63268,-17.24495 15.25516,-17.24495 8.62248,0 15.25515,7.95921 15.25515,17.24495 0,9.28575 -6.63267,17.24496 -15.25515,17.24496 z m 0,-25.20417 c -3.31634,0 -5.96941,3.31634 -5.96941,7.95921 0,4.64288 2.65307,7.95922 5.96941,7.95922 3.31634,0 5.96941,-3.31634 5.96941,-7.95922 0,-4.64287 -2.65307,-7.95921 -5.96941,-7.95921 z"
class="st1" /><path
style="fill:#ffffff;stroke-width:6.63268"
id="path25"
d="m 1041.6612,199.67283 c -1.3265,0 -2.6531,-0.66327 -3.9796,-1.32654 -1.9898,-1.32653 -2.6531,-3.31633 -2.6531,-5.30614 v -46.42873 c 0,-2.65307 1.9898,-5.30614 4.6429,-5.96941 l 36.4797,-13.26535 c 1.9898,-0.66327 3.9796,-0.66327 5.9694,0.66327 1.9898,1.32653 2.6531,3.31634 2.6531,5.30614 v 49.0818 c 0,2.65307 -1.9898,5.30614 -4.6429,6.63268 l -36.4797,10.61228 c -0.6633,0 -1.3265,0 -1.9898,0 z m 6.6327,-48.41854 v 33.16338 l 23.2143,-6.63267 v -34.48992 z"
class="st1" /><path
style="fill:#ffffff;stroke-width:6.63268"
id="path27"
d="m 1041.6612,292.53029 c -1.3265,0 -2.6531,-0.66326 -3.9796,-1.32653 -1.3266,-1.32654 -2.6531,-3.31634 -2.6531,-5.30614 v -47.75527 c 0,-3.31634 1.9898,-5.96941 5.3062,-6.63268 l 36.4797,-9.28574 c 1.9898,-0.66327 3.9796,0 5.9694,1.32653 1.3265,1.32654 2.653,3.31634 2.653,5.30614 v 49.08181 c 0,3.31634 -1.9898,5.96941 -5.3061,6.63267 l -36.4797,7.95921 c -1.3265,0 -1.3265,0 -1.9898,0 z m 6.6327,-49.0818 v 34.48992 l 23.2143,-5.30614 v -35.15319 z"
class="st1" /><path
style="fill:#ffffff;stroke-width:6.63268"
id="path29"
d="m 981.9671,306.45891 c -1.32653,0 -2.65307,-0.66326 -3.97961,-1.32653 -1.32653,-1.32654 -2.65307,-3.31634 -2.65307,-5.30614 v -47.75527 c 0,-3.31634 1.98981,-5.96941 5.30615,-6.63268 l 36.47973,-9.28574 c 1.9898,-0.66327 3.9796,0 5.9694,1.32653 1.3265,1.32654 2.6531,3.31634 2.6531,5.30614 v 48.41854 c 0,3.31634 -1.9898,5.96941 -5.3062,6.63268 l -36.4797,8.62247 c -0.66326,0 -1.32653,0 -1.9898,0 z m 6.63268,-49.0818 v 34.48992 l 23.21432,-5.30614 v -34.48992 z"
class="st1" /><path
style="fill:#ffffff;stroke-width:6.63268"
id="path31"
d="m 897.06885,285.23435 c -1.32654,0 -2.65307,-0.66327 -3.31634,-1.32653 -1.32654,-1.32654 -2.65307,-2.65307 -2.65307,-4.64288 v -29.18377 c 0,-2.65307 1.32653,-4.64288 3.9796,-5.30614 l 43.77567,-15.91843 c 1.9898,-0.66326 3.9796,-0.66326 5.30614,0.66327 1.32653,1.32654 2.65307,2.65307 2.65307,4.64287 v 30.51031 c 0,2.65308 -1.32654,4.64288 -3.97961,5.30615 l -43.77566,14.59188 c -0.66327,0.66327 -1.32654,0.66327 -1.9898,0.66327 z m 5.9694,-31.17358 v 17.24496 l 32.50012,-10.61228 v -17.90823 z"
class="st1" /><path
style="fill:#ffffff;stroke-width:6.63268"
id="path33"
d="m 865.89527,349.57131 c -1.32654,-1.32654 -1.9898,-2.65307 -1.9898,-4.64287 v -29.84705 c 0,-2.65307 1.9898,-4.64287 3.9796,-5.30614 l 41.78586,-11.27555 c 1.9898,-0.66326 3.31634,0 5.30614,0.66327 1.32654,1.32654 1.9898,2.65307 1.9898,4.64287 v 31.17358 c 0,2.65307 -1.9898,5.30614 -4.64287,5.30614 l -41.78586,9.94902 c -0.66327,0.66326 -3.9796,0 -4.64287,-0.66327 z m 9.28575,-29.84704 v 17.90822 l 30.51031,-7.29594 v -19.23476 z"
class="st1" /><path
style="fill:#ffffff;stroke-width:6.63268"
id="path35"
d="m 981.9671,218.24432 c -1.32653,0 -2.65307,-0.66327 -3.97961,-1.32653 -1.32653,-1.32654 -2.65307,-3.31634 -2.65307,-5.30614 v -45.76547 c 0,-2.65307 1.98981,-5.30614 4.64288,-5.96941 l 36.4797,-13.26535 c 1.9898,-0.66327 3.9796,-0.66327 5.9694,0.66327 1.9898,1.32653 2.6531,3.31634 2.6531,5.30614 v 49.0818 c 0,3.31634 -1.9898,5.30614 -4.6429,6.63268 l -36.4797,9.94901 c -0.66326,0 -1.32653,0 -1.9898,0 z m 6.63268,-47.75527 v 32.50012 l 23.21432,-6.63268 v -34.48991 z"
class="st1" /><path
style="fill:#ffffff;stroke-width:6.63268"
id="path37"
d="m 816.81347,356.86725 c -8.62248,0 -15.25516,-7.95921 -15.25516,-17.24496 0,-9.28574 6.63268,-17.24495 15.25516,-17.24495 8.62247,0 15.25515,7.95921 15.25515,17.24495 0,9.28575 -6.63268,17.24496 -15.25515,17.24496 z m 0,-25.20417 c -3.31634,0 -5.96941,3.31634 -5.96941,7.95921 0,4.64288 2.65307,7.95922 5.96941,7.95922 3.31633,0 5.9694,-3.31634 5.9694,-7.95922 0,-4.64287 -2.65307,-7.95921 -5.9694,-7.95921 z"
class="st1" /><path
style="fill:#ffffff;stroke-width:6.63268"
id="path39"
d="m 1275.7947,-13.236074 c 0,-1.326535 0,-1.989803 0,-3.316338 -1.3266,-3.316338 -5.3062,-5.306141 -8.6225,-3.979606 l -37.143,13.9286203 V 7.3252221 13.957898 l 32.5001,-15.2551549 V 529.31683 h -32.5001 v 13.26535 h 39.1328 c 3.9796,0 6.6327,-2.65307 7.2959,-6.63267 V -11.909539 c 0,0 0,-0.663267 -0.6632,-1.326535 z"
class="st1" /><path
style="fill:#ffffff;stroke-width:6.63268"
id="path41"
d="m 1108.6512,53.090687 v -13.92862 l -33.1634,12.602085 c -0.6632,0 -0.6632,0.663268 -1.3265,0.663268 0,0 -113.41876,69.6431 -115.40857,70.96963 -1.9898,1.32654 -3.9796,3.31634 -3.9796,5.96941 v 37.80626 l -109.43916,65.00022 c -1.9898,0.66327 -3.31634,3.31634 -3.31634,5.30614 l -0.66326,31.83685 -59.69409,35.15318 c -3.31634,1.9898 -1.9898,6.63268 -1.9898,9.94902 0,3.31633 0,72.29616 0,72.29616 l -25.20417,-9.28574 c -1.32654,-0.66327 -3.31634,-0.66327 -4.64287,0 l -22.5511,9.28574 c 0,0 0,-71.6329 0,-72.29616 0,-3.97961 0.66327,-7.29595 -2.65307,-9.28575 l -59.69409,-35.15318 -0.66326,-31.83685 c 0,-1.9898 -1.32654,-3.97961 -3.31634,-5.30614 L 552.16969,168.49925 v -39.13279 c 0,-2.65307 -1.32654,-4.64287 -3.97961,-5.96941 l -8.62248,-3.9796 -130.66371,-78.928847 c -0.66327,0 -0.66327,-0.663268 -1.32654,-0.663268 l -9.28575,-3.979606 v 14.591888 l 3.97961,1.989803 31.17358,19.898028 -25.20417,-11.27555 c -0.66327,0 -0.66327,0 -0.66327,0 l -9.28575,-5.30614 v 15.918422 458.98119 13.26535 h 5.96941 c 1.9898,0 3.31634,-0.66327 5.30614,-1.9898 1.98981,-1.32654 342.90936,-150.56175 342.90936,-150.56175 0,0 346.88899,151.88828 348.87879,152.55155 1.9898,0.66327 7.2959,0 7.2959,0 V 530.64337 71.66218 57.73356 l -60.3573,26.530705 31.8368,-19.898028 z M 502.42462,485.54117 451.35301,508.09227 V 343.6019 l 51.07161,9.28575 z m 35.81645,-290.51121 v 273.92952 l -22.5511,9.94901 V 347.58151 c 0,-3.31634 -1.9898,-5.96941 -5.30614,-6.63268 l -64.33696,-11.27555 c -1.9898,-0.66327 -3.9796,0 -5.30614,1.32654 -1.9898,1.32653 -2.65307,3.31633 -2.65307,5.30614 v 177.09245 l -26.5307,11.93882 V 76.968321 l 119.38817,53.061409 7.29594,3.97961 z m 13.92862,-11.27555 47.092,27.85724 -47.092,-20.5613 z m 35.81645,183.72512 27.85724,3.97961 0.66327,63.01042 -27.85724,11.93882 z m 61.68389,-76.93904 c 0,0.66327 0,1.9898 0,2.65307 v 126.68412 l -22.5511,9.94901 -0.66327,-63.01042 c 0,-3.31634 -1.9898,-5.30614 -4.64287,-5.96941 L 582.68,354.87745 c -1.9898,0 -3.31634,0 -4.64287,1.32653 -1.32654,1.32654 -1.98981,2.65308 -1.98981,4.64288 l 0.66327,90.86766 -24.5409,10.61228 V 204.97897 l 97.50034,43.11239 z m 13.26535,-5.96941 11.93882,7.29595 -11.93882,-3.97961 z m 33.16338,115.40857 -11.27555,5.30614 v -31.17358 l 11.27555,1.32654 z m 17.90823,-7.95921 -8.62248,3.31633 V 370.1326 c 0,-2.65307 -1.98981,-4.64287 -4.64288,-4.64287 l -20.56129,-1.32653 c -1.32654,0 -2.65307,0.66326 -3.31634,1.32653 -0.66327,0.66327 -1.32654,1.9898 -1.32654,3.31634 v 40.45932 l -12.60208,5.30614 V 302.47931 l 51.07161,17.24496 z m 108.11262,11.93881 -11.27555,-5.30614 v -24.5409 l 11.27555,-0.66327 z m 21.88783,9.94902 -13.26535,-5.96941 v -39.13279 c 0,-1.32654 -0.66327,-2.65307 -1.32654,-3.31634 -0.66327,-0.66327 -1.9898,-1.32653 -3.31634,-1.32653 l -20.56129,1.32653 c -2.65307,0 -4.64288,1.9898 -4.64288,4.64287 v 24.54091 l -7.95921,-3.31634 v -72.95944 l 51.07161,-16.58169 z m 0,-125.35758 -22.5511,7.29594 22.5511,-13.26535 z m 72.29617,157.19442 -27.85724,-12.60208 0.66327,-63.67369 27.85723,-3.97961 z m 38.46952,17.24496 -27.19397,-11.93882 0.66326,-91.53093 c 0,-1.9898 -0.66326,-3.31634 -1.9898,-4.64287 -1.32653,-1.32654 -2.65307,-1.32654 -4.64287,-1.32654 l -39.13279,5.96941 c -2.65307,0.66327 -4.64287,3.31634 -4.64287,5.96941 l -0.66327,63.01042 -19.89803,-8.62247 v -126.68412 -45.1022 l 97.50034,-43.11239 z m 0,-271.93972 -57.04102,25.20417 57.04102,-33.82665 z M 1001.8651,484.8779 V 350.89784 l 51.0716,-8.62247 V 506.76573 Z M 1094.7226,77.631589 V 526.00049 l -28.5205,-12.60208 V 334.97942 c 0,-1.9898 -1.3265,-3.9796 -2.6531,-5.30614 -1.3265,-1.32653 -3.3163,-1.9898 -5.3061,-1.32653 l -64.33698,11.27554 c -3.31634,0.66327 -5.30614,3.31634 -5.30614,6.63268 v 132.65352 l -19.89803,-8.62248 -0.66327,-335.61341 z"
class="st1" /><path
style="fill:#ffffff;stroke-width:6.63268"
id="path43"
d="M 243.08698,-0.63398925 274.92383,13.957898 V 9.9782925 -3.9503273 l -28.52051,-9.9490137 -7.29594,-3.316338 c -2.65307,-0.663268 -4.64288,-0.663268 -6.63268,0.663267 -1.9898,0.663268 -3.31634,3.316338 -3.31634,5.306141 V 536.61277 c 0,3.97961 2.65307,6.63268 6.63268,6.63268 h 39.13279 V 529.9801 h -31.83685 z"
class="st1" /><path
style="fill:#ffffff;stroke-width:6.63268"
id="path51"
d="m 1169.6718,118.09091 c -20.5613,0 -37.143,-16.58169 -37.143,-37.142983 V -51.042328 H 974.67116 c -20.5613,0 -37.14299,-16.58169 -37.14299,-37.142986 0,-20.561296 16.58169,-37.142986 37.14299,-37.142986 h 195.00064 c 20.5613,0 37.143,16.58169 37.143,37.142986 V 80.947927 c 0,20.561293 -16.5817,37.142983 -37.143,37.142983 z"
class="st1" /><path
style="fill:#ffffff;stroke-width:6.63268"
id="path55"
d="M 530.28186,647.37847 H 335.28118 c -20.5613,0 -37.14299,-16.58169 -37.14299,-37.14299 V 441.10224 c 0,-20.5613 16.58169,-37.14299 37.14299,-37.14299 20.5613,0 37.14299,16.58169 37.14299,37.14299 v 131.99025 h 157.85769 c 20.56129,0 37.14298,16.58169 37.14298,37.14299 0,20.5613 -16.58169,37.14299 -37.14298,37.14299 z"
class="st1" /><path
style="fill:#ffffff;stroke-width:6.63268"
id="path59"
d="m 335.28118,118.09091 c -20.5613,0 -37.14299,-16.58169 -37.14299,-37.142983 V -88.185314 c 0,-20.561296 16.58169,-37.142986 37.14299,-37.142986 h 195.00068 c 20.56129,0 37.14298,16.58169 37.14298,37.142986 0,20.561296 -16.58169,37.142986 -37.14298,37.142986 H 372.42417 V 80.947927 c 0,20.561293 -16.58169,37.142983 -37.14299,37.142983 z"
class="st1" /><path
style="fill:#ffffff;stroke-width:6.63268"
id="path63"
d="M 1169.6718,647.37847 H 974.67116 c -20.5613,0 -37.14299,-16.58169 -37.14299,-37.14299 0,-20.5613 16.58169,-37.14299 37.14299,-37.14299 H 1132.5288 V 441.10224 c 0,-20.5613 16.5817,-37.14299 37.143,-37.14299 20.5613,0 37.143,16.58169 37.143,37.14299 v 169.13324 c 0,20.5613 -16.5817,37.14299 -37.143,37.14299 z"
class="st1" /></g></svg>

After

Width:  |  Height:  |  Size: 20 KiB

View file

@ -0,0 +1,2 @@
SPDX-FileCopyrightText: Panoramax
SPDX-License-Identifier: LicenseRef-LOGO

217
assets/svg/panoramax_bw.svg Normal file
View file

@ -0,0 +1,217 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Generator: Adobe Illustrator 24.0.2, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg
version="1.1"
id="Calque_1"
x="0px"
y="0px"
width="343.25757mm"
height="343.25757mm"
viewBox="0 0 1297.3515 1297.3513"
xml:space="preserve"
sodipodi:docname="panoramax_bw.svg"
inkscape:version="1.3.2 (1:1.3.2+202311252150+091e20ef0f)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:dc="http://purl.org/dc/elements/1.1/"><sodipodi:namedview
id="namedview1"
pagecolor="#ffffff"
bordercolor="#999999"
borderopacity="1"
inkscape:showpageshadow="2"
inkscape:pageopacity="0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:document-units="mm"
inkscape:zoom="0.45168948"
inkscape:cx="618.78793"
inkscape:cy="809.18422"
inkscape:window-width="1920"
inkscape:window-height="995"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="Calque_1" /><metadata
id="metadata118"><rdf:RDF><cc:Work
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /></cc:Work></rdf:RDF></metadata><defs
id="defs72"><rect
x="1150.3843"
y="2292.8162"
width="2107.8879"
height="701.88715"
id="rect141823" /><rect
x="411.88269"
y="1261.6108"
width="815.34668"
height="181.92911"
id="rect66775" /><rect
x="253.02008"
y="1213.0352"
width="2209.7197"
height="583.65765"
id="rect60279" /><rect
x="1150.3843"
y="2292.8162"
width="2551.0081"
height="701.39136"
id="rect141823-1" /><linearGradient
y2="62.288601"
x2="248.6918"
y1="231.7114"
x1="346.50821"
gradientUnits="userSpaceOnUse"
id="SVGID_1_"
gradientTransform="matrix(6.6326761,0,0,6.6326761,-1325.2087,-326.32767)">
<stop
id="stop4"
style="stop-color:#8F2A85"
offset="0" />
<stop
id="stop6"
style="stop-color:#2570B6"
offset="1" />
</linearGradient></defs>
<style
type="text/css"
id="style2">
.st0{fill:url(#SVGID_1_);}
.st1{fill:#FFFFFF;}
.st2{display:none;fill:none;stroke:#E62054;stroke-width:7.5;stroke-miterlimit:10;}
</style>
<text
y="-2248.8188"
style="font-style:normal;font-weight:normal;font-size:40px;line-height:125%;font-family:Sans;letter-spacing:0px;word-spacing:0px;white-space:pre;shape-inside:url(#rect60279);display:inline;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
id="text60277"
xml:space="preserve"
transform="matrix(0.99999889,0,0,0.99999889,-164.71991,-165.18467)" /><text
y="-4324.1934"
x="304.06815"
style="font-style:normal;font-weight:normal;font-size:89.8058px;line-height:200%;font-family:Sans;letter-spacing:0px;word-spacing:0px;white-space:pre;shape-inside:url(#rect66775);display:inline;fill:#000000;fill-opacity:1;stroke:none;stroke-width:2.24515px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
id="text66773"
xml:space="preserve"
transform="matrix(0.99999889,0,0,0.99999889,-164.71991,-165.18467)" /><text
y="-2248.5173"
x="-121.66869"
style="font-style:normal;font-weight:normal;font-size:40px;line-height:0;font-family:Sans;letter-spacing:0px;word-spacing:0px;white-space:pre;shape-inside:url(#rect141823);display:inline;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
id="text141821"
xml:space="preserve"
transform="matrix(0.99999889,0,0,0.99999889,-164.71991,-165.18467)" /><text
y="-3181.1731"
x="-158.83984"
style="font-style:normal;font-weight:normal;font-size:40px;line-height:0;font-family:Sans;letter-spacing:0px;word-spacing:0px;white-space:pre;shape-inside:url(#rect141823-1);display:inline;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
id="text141821-0"
xml:space="preserve"
transform="matrix(0.99999889,0,0,0.99999889,-164.71991,-165.18467)" /><path
style="display:none;fill:none;stroke:#e62054;stroke-width:49.7451;stroke-miterlimit:10"
id="path49"
d="m 1065.871,503.42011 c -19.2347,0 -35.1531,-15.91842 -35.1531,-35.15318 V 334.28687 H 870.87032 c -19.23476,0 -35.15319,-15.91842 -35.15319,-35.15318 0,-19.23476 15.91843,-35.15319 35.15319,-35.15319 H 1065.871 c 19.2348,0 35.1532,15.91843 35.1532,35.15319 v 169.13324 c 0.6633,19.23476 -15.2551,35.15318 -35.1532,35.15318 z"
class="st2" /><path
style="display:none;fill:none;stroke:#e62054;stroke-width:49.7451;stroke-miterlimit:10"
id="path53"
d="M 426.48102,1032.7077 H 231.48034 c -19.23476,0 -35.15318,-15.9185 -35.15318,-35.15322 V 828.42124 c 0,-19.23476 15.91842,-35.15318 35.15318,-35.15318 19.23476,0 35.15318,15.91842 35.15318,35.15318 v 133.31679 h 159.8475 c 19.23476,0 35.15318,15.91842 35.15318,35.15318 0,19.23479 -15.25515,35.81649 -35.15318,35.81649 z"
class="st2" /><path
style="display:none;fill:none;stroke:#e62054;stroke-width:49.7451;stroke-miterlimit:10"
id="path57"
d="m 231.48034,503.42011 c -19.23476,0 -35.15318,-15.91842 -35.15318,-35.15318 V 299.13369 c 0,-19.23476 15.91842,-35.15319 35.15318,-35.15319 h 195.00068 c 19.23476,0 35.15318,15.91843 35.15318,35.15319 0,19.23476 -15.91842,35.15318 -35.15318,35.15318 h -159.8475 v 133.31679 c 0.66327,19.89803 -15.25515,35.81645 -35.15318,35.81645 z"
class="st2" /><path
style="display:none;fill:none;stroke:#e62054;stroke-width:49.7451;stroke-miterlimit:10"
id="path61"
d="M 1065.871,1032.7077 H 870.87032 c -19.23476,0 -35.15319,-15.9185 -35.15319,-35.15322 0,-19.23476 15.91843,-35.15318 35.15319,-35.15318 H 1030.7179 V 829.08451 c 0,-19.23476 15.9184,-35.15319 35.1531,-35.15319 19.2348,0 35.1532,15.91843 35.1532,35.15319 v 169.13324 c 0.6633,18.57145 -15.2551,34.48995 -35.1532,34.48995 z"
class="st2" /><circle
style="fill:#ffffff;stroke-width:6.63268;fill-opacity:1"
id="circle9"
r="648.67572"
cy="648.67572"
cx="648.67572"
class="st0" /><path
style="fill:#000000;stroke-width:6.63268;fill-opacity:1"
id="path11"
d="m 361.48079,586.99183 c -0.66327,0 -1.32653,0 -1.9898,0 l -36.47972,-10.61228 c -2.65307,-0.66327 -4.64287,-3.31634 -4.64287,-6.63268 v -49.0818 c 0,-1.9898 1.32653,-3.97961 2.65307,-5.30614 1.9898,-1.32654 3.9796,-1.32654 5.96941,-0.66327 l 36.47972,13.26535 c 2.65307,0.66327 4.64287,3.31634 4.64287,5.96941 v 46.42873 c 0,1.98981 -0.66327,3.97961 -2.65307,5.30614 -1.32654,0.66327 -2.65307,1.32654 -3.97961,1.32654 z m -29.84704,-22.5511 23.21437,6.63268 v -33.16338 l -23.21437,-8.62248 z"
class="st1" /><path
style="fill:#000000;stroke-width:6.63268;fill-opacity:1"
id="path13"
d="m 361.48079,679.84929 c -0.66327,0 -0.66327,0 -1.32653,0 l -36.47972,-7.95921 c -3.31634,-0.66326 -5.30614,-3.31633 -5.30614,-6.63267 V 616.1756 c 0,-1.9898 0.66327,-3.9796 2.65307,-5.30614 1.32653,-1.32653 3.9796,-1.9898 5.96941,-1.32653 l 36.47972,9.28574 c 2.65307,0.66327 5.30614,3.31634 5.30614,6.63268 v 47.75527 c 0,1.9898 -0.66327,3.9796 -2.65307,5.30614 -1.98981,0.66327 -3.31634,1.32653 -4.64288,1.32653 z m -29.84704,-19.89802 23.21437,5.30614 v -34.48992 l -23.21437,-5.96941 z"
class="st1" /><path
style="fill:#000000;stroke-width:6.63268;fill-opacity:1"
id="path15"
d="m 421.83814,693.77791 c -0.66326,0 -1.32653,0 -1.32653,0 l -36.47972,-8.62247 c -3.31634,-0.66327 -5.30614,-3.31634 -5.30614,-6.63268 v -48.41854 c 0,-1.9898 0.66327,-3.9796 2.65307,-5.30614 1.9898,-1.32653 3.97961,-1.9898 5.96941,-1.32653 l 36.47972,9.28574 c 2.65307,0.66327 5.30614,3.31634 5.30614,6.63268 v 47.75527 c 0,1.9898 -0.66327,3.9796 -2.65307,5.30614 -1.9898,0.66327 -3.31634,1.32653 -4.64288,1.32653 z m -29.84704,-20.56129 23.21437,5.30614 v -34.48992 l -23.21437,-5.96941 z"
class="st1" /><path
style="fill:#000000;stroke-width:6.63268;fill-opacity:1"
id="path17"
d="m 506.07313,672.55335 c -0.66327,0 -1.32653,0 -1.9898,0 l -43.1124,-14.59189 c -2.65307,-0.66326 -3.9796,-3.31633 -3.9796,-5.30614 v -30.51031 c 0,-1.9898 0.66327,-3.9796 2.65307,-4.64287 1.32653,-1.32654 3.31634,-1.32654 5.30614,-0.66327 l 43.11239,15.91842 c 1.98981,0.66327 3.97961,3.31634 3.97961,5.30614 v 29.18378 c 0,1.9898 -0.66327,3.31634 -2.65307,4.64287 -0.66327,0 -1.9898,0.66327 -3.31634,0.66327 z m -37.14298,-24.5409 31.83684,10.61228 v -17.24496 l -31.83684,-11.93881 z"
class="st1" /><path
style="fill:#000000;stroke-width:6.63268;fill-opacity:1"
id="path19"
d="m 534.59364,737.55358 c -0.66327,0 -0.66327,0 -1.32654,0 l -41.78586,-9.94902 c -2.65307,-0.66327 -4.64287,-2.65307 -4.64287,-5.30614 v -31.17358 c 0,-1.9898 0.66327,-3.31633 1.9898,-4.64287 1.32654,-1.32653 3.31634,-1.32653 5.30614,-0.66327 l 41.78586,11.27555 c 2.65307,0.66327 3.97961,2.65307 3.97961,5.30614 v 29.84705 c 0,1.9898 -0.66327,3.31633 -1.9898,4.64287 -0.66327,0 -1.98981,0.66327 -3.31634,0.66327 z m -35.81645,-20.5613 30.51031,7.29594 V 706.38 l -30.51031,-7.95921 z"
class="st1" /><path
style="fill:#000000;stroke-width:6.63268;fill-opacity:1"
id="path21"
d="m 421.83814,605.56332 c -0.66326,0 -1.32653,0 -1.9898,0 l -37.14298,-9.94901 c -2.65307,-0.66327 -4.64288,-3.31634 -4.64288,-6.63268 v -49.0818 c 0,-1.9898 1.32654,-3.97961 2.65307,-5.30614 1.98981,-1.32654 3.97961,-1.32654 5.96941,-0.66327 l 37.14299,13.26535 c 2.65307,0.66327 4.64287,3.31634 4.64287,5.96941 v 45.76547 c 0,1.9898 -0.66327,3.9796 -2.65307,5.30614 -1.32653,0.66326 -2.65307,1.32653 -3.97961,1.32653 z m -30.51031,-21.88783 23.87764,6.63268 v -32.50012 l -23.87764,-8.62247 z"
class="st1" /><path
style="fill:#000000;stroke-width:6.63268;fill-opacity:1"
id="path23"
d="m 586.99178,744.18625 c -8.62248,0 -15.25516,-7.95921 -15.25516,-17.24496 0,-9.28574 6.63268,-17.24495 15.25516,-17.24495 8.62248,0 15.25515,7.95921 15.25515,17.24495 0,9.28575 -6.63267,17.24496 -15.25515,17.24496 z m 0,-25.20417 c -3.31634,0 -5.96941,3.31634 -5.96941,7.95921 0,4.64288 2.65307,7.95922 5.96941,7.95922 3.31634,0 5.96941,-3.31634 5.96941,-7.95922 0,-4.64287 -2.65307,-7.95921 -5.96941,-7.95921 z"
class="st1" /><path
style="fill:#000000;stroke-width:6.63268;fill-opacity:1"
id="path25"
d="m 937.86036,586.99183 c -1.3265,0 -2.6531,-0.66327 -3.9796,-1.32654 -1.9898,-1.32653 -2.6531,-3.31633 -2.6531,-5.30614 v -46.42873 c 0,-2.65307 1.9898,-5.30614 4.6429,-5.96941 l 36.4797,-13.26535 c 1.9898,-0.66327 3.9796,-0.66327 5.9694,0.66327 1.9898,1.32653 2.6531,3.31634 2.6531,5.30614 v 49.0818 c 0,2.65307 -1.9898,5.30614 -4.6429,6.63268 l -36.4797,10.61228 c -0.6633,0 -1.3265,0 -1.9898,0 z m 6.6327,-48.41854 v 33.16338 l 23.2143,-6.63267 v -34.48992 z"
class="st1" /><path
style="fill:#000000;stroke-width:6.63268;fill-opacity:1"
id="path27"
d="m 937.86036,679.84929 c -1.3265,0 -2.6531,-0.66326 -3.9796,-1.32653 -1.3266,-1.32654 -2.6531,-3.31634 -2.6531,-5.30614 v -47.75527 c 0,-3.31634 1.9898,-5.96941 5.3062,-6.63268 l 36.4797,-9.28574 c 1.9898,-0.66327 3.9796,0 5.9694,1.32653 1.3265,1.32654 2.653,3.31634 2.653,5.30614 v 49.08181 c 0,3.31634 -1.9898,5.96941 -5.3061,6.63267 l -36.4797,7.95921 c -1.3265,0 -1.3265,0 -1.9898,0 z m 6.6327,-49.0818 v 34.48992 l 23.2143,-5.30614 v -35.15319 z"
class="st1" /><path
style="fill:#000000;stroke-width:6.63268;fill-opacity:1"
id="path29"
d="m 878.16626,693.77791 c -1.32653,0 -2.65307,-0.66326 -3.97961,-1.32653 -1.32653,-1.32654 -2.65307,-3.31634 -2.65307,-5.30614 v -47.75527 c 0,-3.31634 1.98981,-5.96941 5.30615,-6.63268 l 36.47973,-9.28574 c 1.9898,-0.66327 3.9796,0 5.9694,1.32653 1.3265,1.32654 2.6531,3.31634 2.6531,5.30614 v 48.41854 c 0,3.31634 -1.9898,5.96941 -5.3062,6.63268 l -36.4797,8.62247 c -0.66326,0 -1.32653,0 -1.9898,0 z m 6.63268,-49.0818 v 34.48992 l 23.21432,-5.30614 v -34.48992 z"
class="st1" /><path
style="fill:#000000;stroke-width:6.63268;fill-opacity:1"
id="path31"
d="m 793.26801,672.55335 c -1.32654,0 -2.65307,-0.66327 -3.31634,-1.32653 -1.32654,-1.32654 -2.65307,-2.65307 -2.65307,-4.64288 v -29.18377 c 0,-2.65307 1.32653,-4.64288 3.9796,-5.30614 l 43.77567,-15.91843 c 1.9898,-0.66326 3.9796,-0.66326 5.30614,0.66327 1.32653,1.32654 2.65307,2.65307 2.65307,4.64287 v 30.51031 c 0,2.65308 -1.32654,4.64288 -3.97961,5.30615 l -43.77566,14.59188 c -0.66327,0.66327 -1.32654,0.66327 -1.9898,0.66327 z m 5.9694,-31.17358 v 17.24496 l 32.50012,-10.61228 v -17.90823 z"
class="st1" /><path
style="fill:#000000;stroke-width:6.63268;fill-opacity:1"
id="path33"
d="m 762.09443,736.89031 c -1.32654,-1.32654 -1.9898,-2.65307 -1.9898,-4.64287 v -29.84705 c 0,-2.65307 1.9898,-4.64287 3.9796,-5.30614 l 41.78586,-11.27555 c 1.9898,-0.66326 3.31634,0 5.30614,0.66327 1.32654,1.32654 1.9898,2.65307 1.9898,4.64287 v 31.17358 c 0,2.65307 -1.9898,5.30614 -4.64287,5.30614 l -41.78586,9.94902 c -0.66327,0.66326 -3.9796,0 -4.64287,-0.66327 z m 9.28575,-29.84704 v 17.90822 l 30.51031,-7.29594 v -19.23476 z"
class="st1" /><path
style="fill:#000000;stroke-width:6.63268;fill-opacity:1"
id="path35"
d="m 878.16626,605.56332 c -1.32653,0 -2.65307,-0.66327 -3.97961,-1.32653 -1.32653,-1.32654 -2.65307,-3.31634 -2.65307,-5.30614 v -45.76547 c 0,-2.65307 1.98981,-5.30614 4.64288,-5.96941 l 36.4797,-13.26535 c 1.9898,-0.66327 3.9796,-0.66327 5.9694,0.66327 1.9898,1.32653 2.6531,3.31634 2.6531,5.30614 v 49.0818 c 0,3.31634 -1.9898,5.30614 -4.6429,6.63268 l -36.4797,9.94901 c -0.66326,0 -1.32653,0 -1.9898,0 z m 6.63268,-47.75527 v 32.50012 l 23.21432,-6.63268 v -34.48991 z"
class="st1" /><path
style="fill:#000000;stroke-width:6.63268;fill-opacity:1"
id="path37"
d="m 713.01263,744.18625 c -8.62248,0 -15.25516,-7.95921 -15.25516,-17.24496 0,-9.28574 6.63268,-17.24495 15.25516,-17.24495 8.62247,0 15.25515,7.95921 15.25515,17.24495 0,9.28575 -6.63268,17.24496 -15.25515,17.24496 z m 0,-25.20417 c -3.31634,0 -5.96941,3.31634 -5.96941,7.95921 0,4.64288 2.65307,7.95922 5.96941,7.95922 3.31633,0 5.9694,-3.31634 5.9694,-7.95922 0,-4.64287 -2.65307,-7.95921 -5.9694,-7.95921 z"
class="st1" /><path
style="fill:#000000;stroke-width:6.63268;fill-opacity:1"
id="path39"
d="m 1171.9939,374.08293 c 0,-1.32654 0,-1.98981 0,-3.31634 -1.3266,-3.31634 -5.3062,-5.30614 -8.6225,-3.97961 l -37.143,13.92862 v 13.92862 6.63268 l 32.5001,-15.25516 v 530.61409 h -32.5001 v 13.26535 h 39.1328 c 3.9796,0 6.6327,-2.65307 7.2959,-6.63267 V 375.40946 c 0,0 0,-0.66327 -0.6632,-1.32653 z"
class="st1" /><path
style="fill:#000000;stroke-width:6.63268;fill-opacity:1"
id="path41"
d="m 1004.8504,440.40969 v -13.92862 l -33.16344,12.60208 c -0.6632,0 -0.6632,0.66327 -1.3265,0.66327 0,0 -113.41876,69.6431 -115.40857,70.96963 -1.9898,1.32654 -3.9796,3.31634 -3.9796,5.96941 v 37.80626 l -109.43916,65.00022 c -1.9898,0.66327 -3.31634,3.31634 -3.31634,5.30614 l -0.66326,31.83685 -59.69409,35.15318 c -3.31634,1.9898 -1.9898,6.63268 -1.9898,9.94902 0,3.31633 0,72.29616 0,72.29616 l -25.20417,-9.28574 c -1.32654,-0.66327 -3.31634,-0.66327 -4.64287,0 l -22.5511,9.28574 c 0,0 0,-71.6329 0,-72.29616 0,-3.97961 0.66327,-7.29595 -2.65307,-9.28575 l -59.69409,-35.15318 -0.66326,-31.83685 c 0,-1.9898 -1.32654,-3.97961 -3.31634,-5.30614 L 448.36885,555.81825 v -39.13279 c 0,-2.65307 -1.32654,-4.64287 -3.97961,-5.96941 l -8.62248,-3.9796 -130.66371,-78.92885 c -0.66327,0 -0.66327,-0.66327 -1.32654,-0.66327 l -9.28575,-3.9796 v 14.59189 l 3.97961,1.9898 31.17358,19.89803 -25.20417,-11.27555 c -0.66327,0 -0.66327,0 -0.66327,0 l -9.28575,-5.30614 v 15.91842 458.98119 13.26535 h 5.96941 c 1.9898,0 3.31634,-0.66327 5.30614,-1.9898 1.98981,-1.32654 342.90936,-150.56175 342.90936,-150.56175 0,0 346.88899,151.88828 348.87879,152.55155 1.9898,0.66327 7.29594,0 7.29594,0 V 917.96237 458.98118 445.05256 l -60.35734,26.5307 31.8368,-19.89802 z m -606.22662,432.45048 -51.07161,22.5511 V 730.9209 l 51.07161,9.28575 z m 35.81645,-290.51121 v 273.92952 l -22.5511,9.94901 V 734.90051 c 0,-3.31634 -1.9898,-5.96941 -5.30614,-6.63268 l -64.33696,-11.27555 c -1.9898,-0.66327 -3.9796,0 -5.30614,1.32654 -1.9898,1.32653 -2.65307,3.31633 -2.65307,5.30614 v 177.09245 l -26.5307,11.93882 V 464.28732 l 119.38817,53.06141 7.29594,3.97961 z m 13.92862,-11.27555 47.092,27.85724 -47.092,-20.5613 z m 35.81645,183.72512 27.85724,3.97961 0.66327,63.01042 -27.85724,11.93882 z m 61.68389,-76.93904 c 0,0.66327 0,1.9898 0,2.65307 v 126.68412 l -22.5511,9.94901 -0.66327,-63.01042 c 0,-3.31634 -1.9898,-5.30614 -4.64287,-5.96941 l -39.13279,-5.96941 c -1.9898,0 -3.31634,0 -4.64287,1.32653 -1.32654,1.32654 -1.98981,2.65308 -1.98981,4.64288 l 0.66327,90.86766 -24.5409,10.61228 V 592.29797 l 97.50034,43.11239 z m 13.26535,-5.96941 11.93882,7.29595 -11.93882,-3.97961 z m 33.16338,115.40857 -11.27555,5.30614 v -31.17358 l 11.27555,1.32654 z m 17.90823,-7.95921 -8.62248,3.31633 V 757.4516 c 0,-2.65307 -1.98981,-4.64287 -4.64288,-4.64287 L 576.3795,751.4822 c -1.32654,0 -2.65307,0.66326 -3.31634,1.32653 -0.66327,0.66327 -1.32654,1.9898 -1.32654,3.31634 v 40.45932 l -12.60208,5.30614 V 689.79831 l 51.07161,17.24496 z m 108.11262,11.93881 -11.27555,-5.30614 v -24.5409 l 11.27555,-0.66327 z m 21.88783,9.94902 -13.26535,-5.96941 v -39.13279 c 0,-1.32654 -0.66327,-2.65307 -1.32654,-3.31634 -0.66327,-0.66327 -1.9898,-1.32653 -3.31634,-1.32653 l -20.56129,1.32653 c -2.65307,0 -4.64288,1.9898 -4.64288,4.64287 v 24.54091 l -7.95921,-3.31634 v -72.95944 l 51.07161,-16.58169 z m 0,-125.35758 -22.5511,7.29594 22.5511,-13.26535 z m 72.29617,157.19442 -27.85724,-12.60208 0.66327,-63.67369 27.85723,-3.97961 z m 38.46952,17.24496 -27.19397,-11.93882 0.66326,-91.53093 c 0,-1.9898 -0.66326,-3.31634 -1.9898,-4.64287 -1.32653,-1.32654 -2.65307,-1.32654 -4.64287,-1.32654 l -39.13279,5.96941 c -2.65307,0.66327 -4.64287,3.31634 -4.64287,5.96941 l -0.66327,63.01042 -19.89803,-8.62247 v -126.68412 -45.1022 l 97.50034,-43.11239 z m 0,-271.93972 -57.04102,25.20417 57.04102,-33.82665 z M 898.06426,872.1969 V 738.21684 l 51.0716,-8.62247 v 164.49036 z m 92.8575,-407.24631 v 448.3689 l -28.5205,-12.60208 V 722.29842 c 0,-1.9898 -1.3265,-3.9796 -2.6531,-5.30614 -1.3265,-1.32653 -3.3163,-1.9898 -5.3061,-1.32653 l -64.33698,11.27554 c -3.31634,0.66327 -5.30614,3.31634 -5.30614,6.63268 v 132.65352 l -19.89803,-8.62248 -0.66327,-335.61341 z"
class="st1" /><path
style="fill:#000000;stroke-width:6.63268;fill-opacity:1"
id="path43"
d="m 139.28614,386.68501 31.83685,14.59189 v -3.97961 -13.92862 l -28.52051,-9.94901 -7.29594,-3.31634 c -2.65307,-0.66327 -4.64288,-0.66327 -6.63268,0.66327 -1.9898,0.66327 -3.31634,3.31634 -3.31634,5.30614 v 547.85904 c 0,3.97961 2.65307,6.63268 6.63268,6.63268 h 39.13279 V 917.2991 h -31.83685 z"
class="st1" /><path
style="fill:#000000;stroke-width:6.63268;fill-opacity:1"
id="path51"
d="m 1065.871,505.40991 c -20.5613,0 -37.143,-16.58169 -37.143,-37.14298 V 336.27667 H 870.87032 c -20.5613,0 -37.14299,-16.58169 -37.14299,-37.14298 0,-20.5613 16.58169,-37.14299 37.14299,-37.14299 H 1065.871 c 20.5613,0 37.143,16.58169 37.143,37.14299 v 169.13324 c 0,20.56129 -16.5817,37.14298 -37.143,37.14298 z"
class="st1" /><path
style="fill:#000000;stroke-width:6.63268;fill-opacity:1"
id="path55"
d="M 426.48102,1034.6975 H 231.48034 c -20.5613,0 -37.14299,-16.5817 -37.14299,-37.14302 V 828.42124 c 0,-20.5613 16.58169,-37.14299 37.14299,-37.14299 20.5613,0 37.14299,16.58169 37.14299,37.14299 v 131.99025 h 157.85769 c 20.56129,0 37.14298,16.58169 37.14298,37.14299 0,20.56132 -16.58169,37.14302 -37.14298,37.14302 z"
class="st1" /><path
style="fill:#000000;stroke-width:6.63268;fill-opacity:1"
id="path59"
d="m 231.48034,505.40991 c -20.5613,0 -37.14299,-16.58169 -37.14299,-37.14298 V 299.13369 c 0,-20.5613 16.58169,-37.14299 37.14299,-37.14299 h 195.00068 c 20.56129,0 37.14298,16.58169 37.14298,37.14299 0,20.56129 -16.58169,37.14298 -37.14298,37.14298 H 268.62333 v 131.99026 c 0,20.56129 -16.58169,37.14298 -37.14299,37.14298 z"
class="st1" /><path
style="fill:#000000;stroke-width:6.63268;fill-opacity:1"
id="path63"
d="M 1065.871,1034.6975 H 870.87032 c -20.5613,0 -37.14299,-16.5817 -37.14299,-37.14302 0,-20.5613 16.58169,-37.14299 37.14299,-37.14299 H 1028.728 V 828.42124 c 0,-20.5613 16.5817,-37.14299 37.143,-37.14299 20.5613,0 37.143,16.58169 37.143,37.14299 v 169.13324 c 0,20.56132 -16.5817,37.14302 -37.143,37.14302 z"
class="st1" /></svg>

After

Width:  |  Height:  |  Size: 20 KiB

View file

@ -0,0 +1,2 @@
SPDX-FileCopyrightText: Panoramax
SPDX-License-Identifier: LicenseRef-LOGO

View file

@ -203,7 +203,9 @@
"openMapillary": "Open Mapillary here", "openMapillary": "Open Mapillary here",
"openOsmcha": "See latest edits made with {theme}", "openOsmcha": "See latest edits made with {theme}",
"openOsmchaLastWeek": "See edits from the last 7 days", "openOsmchaLastWeek": "See edits from the last 7 days",
"openPanoramax": "Open Panoramax here",
"openThemeDocumentation": "Open the documentation for thematic map {name}", "openThemeDocumentation": "Open the documentation for thematic map {name}",
"panoramaxHelp": "<b>Panoramax</b> is an online service which gathers street-level pictures and offers them under a free license. Contributors are allowed to use these pictures to improve OpenStreetMap",
"seeOnMapillary": "See this image on Mapillary", "seeOnMapillary": "See this image on Mapillary",
"themeBy": "Theme maintained by {author}", "themeBy": "Theme maintained by {author}",
"title": "Copyright and attribution", "title": "Copyright and attribution",

View file

@ -4214,6 +4214,9 @@
}, },
"2": { "2": {
"then": "This drinking water is closed" "then": "This drinking water is closed"
},
"3": {
"then": "This drinking water is permanently closed"
} }
}, },
"question": "Is this drinking water spot still operational?", "question": "Is this drinking water spot still operational?",

34
package-lock.json generated
View file

@ -58,15 +58,15 @@
"maplibre-gl": "^4.1.1", "maplibre-gl": "^4.1.1",
"marked": "^12.0.2", "marked": "^12.0.2",
"monaco-editor": "^0.46.0", "monaco-editor": "^0.46.0",
"mvt-to-geojson": "^0.0.5",
"name-suggestion-index": "^6.0.20240422", "name-suggestion-index": "^6.0.20240422",
"npm": "^10.7.0", "npm": "^10.7.0",
"opening_hours": "^3.6.0", "opening_hours": "^3.6.0",
"osm-auth": "^2.5.0", "osm-auth": "^2.5.0",
"osmtogeojson": "^3.0.0-beta.5", "osmtogeojson": "^3.0.0-beta.5",
"panoramax-js": "^0.1.4", "panoramax-js": "^0.3.6",
"panzoom": "^9.4.3", "panzoom": "^9.4.3",
"papaparse": "^5.3.1", "papaparse": "^5.3.1",
"pbf": "^3.2.1",
"pg": "^8.11.3", "pg": "^8.11.3",
"pic4carto": "^2.1.15", "pic4carto": "^2.1.15",
"pmtiles": "^3.0.5", "pmtiles": "^3.0.5",
@ -13144,6 +13144,15 @@
"version": "1.0.0", "version": "1.0.0",
"license": "MIT" "license": "MIT"
}, },
"node_modules/mvt-to-geojson": {
"version": "0.0.5",
"resolved": "https://registry.npmjs.org/mvt-to-geojson/-/mvt-to-geojson-0.0.5.tgz",
"integrity": "sha512-IG4bJJP9nxY/9LenWBY0yi5SEv9a1G06trP5b4Tg01LCrzB32US/FO9bygJr7c+ZVbt175AzBwJiiawaxfLTbA==",
"dependencies": {
"@types/geojson": "^7946.0.14",
"pbf": "^3.2.1"
}
},
"node_modules/n3": { "node_modules/n3": {
"version": "1.17.3", "version": "1.17.3",
"license": "MIT", "license": "MIT",
@ -15993,9 +16002,9 @@
"license": "MIT" "license": "MIT"
}, },
"node_modules/panoramax-js": { "node_modules/panoramax-js": {
"version": "0.1.4", "version": "0.3.6",
"resolved": "https://registry.npmjs.org/panoramax-js/-/panoramax-js-0.1.4.tgz", "resolved": "https://registry.npmjs.org/panoramax-js/-/panoramax-js-0.3.6.tgz",
"integrity": "sha512-X7plFMH1ndxiiyVFEluDloNiEBH0nEkurCPJ7zAInxbgv21pp/EGFwu3ynmF5ETyyXB9zu0n309juyjTdJ5pnQ==", "integrity": "sha512-CRdXwh91H6chd1PYptG070ukx+S6IkVaUeQVG91ySevoJoCYOuBT65qkMhRo49X2um1nGcs9UqolW90R57875g==",
"dependencies": { "dependencies": {
"@ogcapi-js/features": "^1.1.1", "@ogcapi-js/features": "^1.1.1",
"@ogcapi-js/shared": "^1.1.1", "@ogcapi-js/shared": "^1.1.1",
@ -30244,6 +30253,15 @@
"murmurhash-js": { "murmurhash-js": {
"version": "1.0.0" "version": "1.0.0"
}, },
"mvt-to-geojson": {
"version": "0.0.5",
"resolved": "https://registry.npmjs.org/mvt-to-geojson/-/mvt-to-geojson-0.0.5.tgz",
"integrity": "sha512-IG4bJJP9nxY/9LenWBY0yi5SEv9a1G06trP5b4Tg01LCrzB32US/FO9bygJr7c+ZVbt175AzBwJiiawaxfLTbA==",
"requires": {
"@types/geojson": "^7946.0.14",
"pbf": "^3.2.1"
}
},
"n3": { "n3": {
"version": "1.17.3", "version": "1.17.3",
"requires": { "requires": {
@ -32069,9 +32087,9 @@
"version": "1.0.0" "version": "1.0.0"
}, },
"panoramax-js": { "panoramax-js": {
"version": "0.1.4", "version": "0.3.6",
"resolved": "https://registry.npmjs.org/panoramax-js/-/panoramax-js-0.1.4.tgz", "resolved": "https://registry.npmjs.org/panoramax-js/-/panoramax-js-0.3.6.tgz",
"integrity": "sha512-X7plFMH1ndxiiyVFEluDloNiEBH0nEkurCPJ7zAInxbgv21pp/EGFwu3ynmF5ETyyXB9zu0n309juyjTdJ5pnQ==", "integrity": "sha512-CRdXwh91H6chd1PYptG070ukx+S6IkVaUeQVG91ySevoJoCYOuBT65qkMhRo49X2um1nGcs9UqolW90R57875g==",
"requires": { "requires": {
"@ogcapi-js/features": "^1.1.1", "@ogcapi-js/features": "^1.1.1",
"@ogcapi-js/shared": "^1.1.1", "@ogcapi-js/shared": "^1.1.1",

View file

@ -203,15 +203,15 @@
"maplibre-gl": "^4.1.1", "maplibre-gl": "^4.1.1",
"marked": "^12.0.2", "marked": "^12.0.2",
"monaco-editor": "^0.46.0", "monaco-editor": "^0.46.0",
"mvt-to-geojson": "^0.0.5",
"name-suggestion-index": "^6.0.20240422", "name-suggestion-index": "^6.0.20240422",
"npm": "^10.7.0", "npm": "^10.7.0",
"opening_hours": "^3.6.0", "opening_hours": "^3.6.0",
"osm-auth": "^2.5.0", "osm-auth": "^2.5.0",
"osmtogeojson": "^3.0.0-beta.5", "osmtogeojson": "^3.0.0-beta.5",
"panoramax-js": "^0.1.4", "panoramax-js": "^0.3.6",
"panzoom": "^9.4.3", "panzoom": "^9.4.3",
"papaparse": "^5.3.1", "papaparse": "^5.3.1",
"pbf": "^3.2.1",
"pg": "^8.11.3", "pg": "^8.11.3",
"pic4carto": "^2.1.15", "pic4carto": "^2.1.15",
"pmtiles": "^3.0.5", "pmtiles": "^3.0.5",

View file

@ -330,6 +330,8 @@ class GenerateLayouts extends Script {
"https://www.openstreetmap.org", "https://www.openstreetmap.org",
"https://api.openstreetmap.org", "https://api.openstreetmap.org",
"https://pietervdvn.goatcounter.com", "https://pietervdvn.goatcounter.com",
"https://api.panoramax.xyz",
"https://panoramax.mapcomplete.org"
].concat(...(await this.eliUrls())) ].concat(...(await this.eliUrls()))
SpecialVisualizations.specialVisualizations.forEach((sv) => { SpecialVisualizations.specialVisualizations.forEach((sv) => {

View file

@ -249,6 +249,13 @@ export class BBox {
] ]
} }
toLngLatFlat(): [number, number, number, number] {
return [
this.minLon, this.minLat,
this.maxLon, this.maxLat,
]
}
public asGeojsonCached() { public asGeojsonCached() {
if (this["geojsonCache"] === undefined) { if (this["geojsonCache"] === undefined) {
this["geojsonCache"] = this.asGeoJson({}) this["geojsonCache"] = this.asGeoJson({})

View file

@ -2,332 +2,8 @@ import { Feature as GeojsonFeature, Geometry } from "geojson"
import { Store, UIEventSource } from "../../UIEventSource" import { Store, UIEventSource } from "../../UIEventSource"
import { FeatureSourceForTile, UpdatableFeatureSource } from "../FeatureSource" import { FeatureSourceForTile, UpdatableFeatureSource } from "../FeatureSource"
import Pbf from "pbf" import { MvtToGeojson } from "mvt-to-geojson"
type Coords = [number, number][]
class MvtFeatureBuilder {
private static readonly geom_types = ["Unknown", "Point", "LineString", "Polygon"] as const
private readonly _size: number
private readonly _x0: number
private readonly _y0: number
constructor(extent: number, x: number, y: number, z: number) {
this._size = extent * Math.pow(2, z)
this._x0 = extent * x
this._y0 = extent * y
}
private static signedArea(ring: Coords): number {
let sum = 0
const len = ring.length
// J is basically (i - 1) % len
let j = len - 1
let p1
let p2
for (let i = 0; i < len; i++) {
p1 = ring[i]
p2 = ring[j]
sum += (p2.x - p1.x) * (p1.y + p2.y)
j = i
}
return sum
}
/**
*
* const rings = [ [ [ 3.208361864089966, 51.186908820014736 ], [ 3.2084155082702637, 51.18689537073311 ], [ 3.208436965942383, 51.186888646090836 ], [ 3.2084155082702637, 51.18686174751187 ], [ 3.2084155082702637, 51.18685502286465 ], [ 3.2083725929260254, 51.18686847215807 ], [ 3.2083404064178467, 51.18687519680333 ], [ 3.208361864089966, 51.186908820014736 ] ] ]
* MvtFeatureBuilder.classifyRings(rings) // => [rings]
*/
private static classifyRings(rings: Coords[]): Coords[][] {
if (rings.length <= 0) {
throw "Now rings in polygon found"
}
if (rings.length == 1) {
return [rings]
}
const polygons: Coords[][] = []
let currentPolygon: Coords[]
for (let i = 0; i < rings.length; i++) {
let ring = rings[i]
const area = this.signedArea(ring)
if (area === 0) {
// Weird, degenerate ring
continue
}
const ccw = area < 0
if (ccw === area < 0) {
if (currentPolygon) {
polygons.push(currentPolygon)
}
currentPolygon = [ring]
} else {
currentPolygon.push(ring)
}
}
if (currentPolygon) {
polygons.push(currentPolygon)
}
return polygons
}
public toGeoJson(geometry: number[], typeIndex: 1 | 2 | 3, properties: any): GeojsonFeature {
let coords: Coords[] = this.encodeGeometry(geometry)
let classified = undefined
switch (typeIndex) {
case 1:
const points = []
for (let i = 0; i < coords.length; i++) {
points[i] = coords[i][0]
}
coords = points
this.project(<any>coords)
break
case 2:
for (let i = 0; i < coords.length; i++) {
this.project(coords[i])
}
break
case 3:
classified = MvtFeatureBuilder.classifyRings(coords)
for (let i = 0; i < classified.length; i++) {
for (let j = 0; j < classified[i].length; j++) {
this.project(classified[i][j])
}
}
break
}
let type: string = MvtFeatureBuilder.geom_types[typeIndex]
let polygonCoords: Coords | Coords[] | Coords[][]
if (coords.length === 1) {
polygonCoords = (classified ?? coords)[0]
} else {
polygonCoords = classified ?? coords
type = "Multi" + type
}
return {
type: "Feature",
geometry: {
type: <any>type,
coordinates: <any>polygonCoords,
},
properties,
}
}
/**
*
* const geometry = [9,233,8704,130,438,1455,270,653,248,423,368,493,362,381,330,267,408,301,406,221,402,157,1078,429,1002,449,1036,577,800,545,1586,1165,164,79,40]
* const builder = new MvtFeatureBuilder(4096, 66705, 43755, 17)
* const expected = [[3.2106759399175644,51.213658395282124],[3.2108227908611298,51.21396418776169],[3.2109133154153824,51.21410154168976],[3.210996463894844,51.214190590500664],[3.211119845509529,51.214294340548975],[3.211241215467453,51.2143745681588],[3.2113518565893173,51.21443085341426],[3.211488649249077,51.21449427925393],[3.2116247713565826,51.214540903490956],[3.211759552359581,51.21457408647774],[3.2121209800243378,51.214664394485254],[3.212456926703453,51.21475890267553],[3.2128042727708817,51.214880292910834],[3.213072493672371,51.214994962285544],[3.2136042416095734,51.21523984134939],[3.2136592268943787,51.21525664260963],[3.213672637939453,51.21525664260963]]
* builder.project(builder.encodeGeometry(geometry)[0]) // => expected
* @param geometry
* @private
*/
private encodeGeometry(geometry: number[]): Coords[] {
let cX = 0
let cY = 0
const coordss: Coords[] = []
let currentRing: Coords = []
for (let i = 0; i < geometry.length; i++) {
const commandInteger = geometry[i]
const commandId = commandInteger & 0x7
const commandCount = commandInteger >> 3
/*
Command Id Parameters Parameter Count
MoveTo 1 dX, dY 2
LineTo 2 dX, dY 2
ClosePath 7 No parameters 0
*/
if (commandId === 1) {
// MoveTo means: we start a new ring
if (currentRing.length !== 0) {
coordss.push(currentRing)
currentRing = []
}
}
if (commandId === 1 || commandId === 2) {
for (let j = 0; j < commandCount; j++) {
const dx = geometry[i + j * 2 + 1]
cX += (dx >> 1) ^ -(dx & 1)
const dy = geometry[i + j * 2 + 2]
cY += (dy >> 1) ^ -(dy & 1)
currentRing.push([cX, cY])
}
i += commandCount * 2
}
if (commandId === 7) {
if (currentRing.length === 0) {
console.error(
"Invalid MVT file: got a 'closePath', but the currentRing is empty. Full command:",
commandInteger
)
} else {
currentRing.push([...currentRing[0]])
}
i++
}
}
if (currentRing.length > 0) {
coordss.push(currentRing)
}
return coordss
}
/**
* Inline replacement of the location by projecting
* @param line the line which will be rewritten inline
* @return line
*/
private project(line: Coords) {
const y0 = this._y0
const x0 = this._x0
const size = this._size
for (let i = 0; i < line.length; i++) {
let p = line[i]
let y2 = 180 - ((p[1] + y0) * 360) / size
line[i] = [
((p[0] + x0) * 360) / size - 180,
(360 / Math.PI) * Math.atan(Math.exp((y2 * Math.PI) / 180)) - 90,
]
}
return line
}
}
class Layer {
public static read(pbf, end) {
return pbf.readFields(
Layer._readField,
{ version: 0, name: "", features: [], keys: [], values: [], extent: 0 },
end
)
}
static _readField(tag, obj, pbf) {
if (tag === 15) obj.version = pbf.readVarint()
else if (tag === 1) obj.name = pbf.readString()
else if (tag === 2) obj.features.push(Feature.read(pbf, pbf.readVarint() + pbf.pos))
else if (tag === 3) obj.keys.push(pbf.readString())
else if (tag === 4) obj.values.push(Value.read(pbf, pbf.readVarint() + pbf.pos))
else if (tag === 5) obj.extent = pbf.readVarint()
}
public static write(obj, pbf) {
if (obj.version) pbf.writeVarintField(15, obj.version)
if (obj.name) pbf.writeStringField(1, obj.name)
if (obj.features)
for (var i = 0; i < obj.features.length; i++)
pbf.writeMessage(2, Feature.write, obj.features[i])
if (obj.keys) for (i = 0; i < obj.keys.length; i++) pbf.writeStringField(3, obj.keys[i])
if (obj.values)
for (i = 0; i < obj.values.length; i++) pbf.writeMessage(4, Value.write, obj.values[i])
if (obj.extent) pbf.writeVarintField(5, obj.extent)
}
}
class Feature {
static read(pbf, end) {
return pbf.readFields(Feature._readField, { id: 0, tags: [], type: 0, geometry: [] }, end)
}
static _readField(tag, obj, pbf) {
if (tag === 1) obj.id = pbf.readVarint()
else if (tag === 2) pbf.readPackedVarint(obj.tags)
else if (tag === 3) obj.type = pbf.readVarint()
else if (tag === 4) pbf.readPackedVarint(obj.geometry)
}
public static write(obj, pbf) {
if (obj.id) pbf.writeVarintField(1, obj.id)
if (obj.tags) pbf.writePackedVarint(2, obj.tags)
if (obj.type) pbf.writeVarintField(3, obj.type)
if (obj.geometry) pbf.writePackedVarint(4, obj.geometry)
}
}
class Value {
public static read(pbf, end) {
return pbf.readFields(
Value._readField,
{
string_value: "",
float_value: 0,
double_value: 0,
int_value: 0,
uint_value: 0,
sint_value: 0,
bool_value: false,
},
end
)
}
static _readField = function (tag, obj, pbf) {
if (tag === 1) obj.string_value = pbf.readString()
else if (tag === 2) obj.float_value = pbf.readFloat()
else if (tag === 3) obj.double_value = pbf.readDouble()
else if (tag === 4) obj.int_value = pbf.readVarint(true)
else if (tag === 5) obj.uint_value = pbf.readVarint()
else if (tag === 6) obj.sint_value = pbf.readSVarint()
else if (tag === 7) obj.bool_value = pbf.readBoolean()
}
public static write(obj, pbf) {
if (obj.string_value) pbf.writeStringField(1, obj.string_value)
if (obj.float_value) pbf.writeFloatField(2, obj.float_value)
if (obj.double_value) pbf.writeDoubleField(3, obj.double_value)
if (obj.int_value) pbf.writeVarintField(4, obj.int_value)
if (obj.uint_value) pbf.writeVarintField(5, obj.uint_value)
if (obj.sint_value) pbf.writeSVarintField(6, obj.sint_value)
if (obj.bool_value) pbf.writeBooleanField(7, obj.bool_value)
}
}
class Tile {
// code generated by pbf v3.2.1
static GeomType = {
UNKNOWN: {
value: 0,
options: {},
},
POINT: {
value: 1,
options: {},
},
LINESTRING: {
value: 2,
options: {},
},
POLYGON: {
value: 3,
options: {},
},
}
public static read(pbf, end) {
return pbf.readFields(Tile._readField, { layers: [] }, end)
}
static _readField(tag, obj, pbf) {
if (tag === 3) obj.layers.push(Layer.read(pbf, pbf.readVarint() + pbf.pos))
}
static write(obj, pbf) {
if (obj.layers)
for (var i = 0; i < obj.layers.length; i++)
pbf.writeMessage(3, Layer.write, obj.layers[i])
}
}
export default class MvtSource implements FeatureSourceForTile, UpdatableFeatureSource { export default class MvtSource implements FeatureSourceForTile, UpdatableFeatureSource {
public readonly features: Store<GeojsonFeature<Geometry, { [name: string]: any }>[]> public readonly features: Store<GeojsonFeature<Geometry, { [name: string]: any }>[]>
@ -352,7 +28,7 @@ export default class MvtSource implements FeatureSourceForTile, UpdatableFeature
y: number, y: number,
z: number, z: number,
layerName?: string, layerName?: string,
isActive?: Store<boolean> isActive?: Store<boolean>,
) { ) {
this._url = url this._url = url
this._layerName = layerName this._layerName = layerName
@ -367,7 +43,7 @@ export default class MvtSource implements FeatureSourceForTile, UpdatableFeature
} }
return fs return fs
}, },
[isActive] [isActive],
) )
} }
@ -378,39 +54,6 @@ export default class MvtSource implements FeatureSourceForTile, UpdatableFeature
await this.currentlyRunning await this.currentlyRunning
} }
private getValue(v: {
// Exactly one of these values must be present in a valid message
string_value?: string
float_value?: number
double_value?: number
int_value?: number
uint_value?: number
sint_value?: number
bool_value?: boolean
}): string | number | undefined | boolean {
if (v.string_value !== "") {
return v.string_value
}
if (v.double_value !== 0) {
return v.double_value
}
if (v.float_value !== 0) {
return v.float_value
}
if (v.int_value !== 0) {
return v.int_value
}
if (v.uint_value !== 0) {
return v.uint_value
}
if (v.sint_value !== 0) {
return v.sint_value
}
if (v.bool_value !== false) {
return v.bool_value
}
return undefined
}
private async download(): Promise<void> { private async download(): Promise<void> {
try { try {
@ -420,24 +63,27 @@ export default class MvtSource implements FeatureSourceForTile, UpdatableFeature
return return
} }
const buffer = await result.arrayBuffer() const buffer = await result.arrayBuffer()
const data = Tile.read(new Pbf(buffer), undefined) const features = MvtToGeojson.fromBuffer(buffer, this.x, this.y, this.z)
const layers = data.layers for (const feature of features) {
let layer = data.layers[0] const properties = feature.properties
if (layers.length > 1) { if(!properties["osm_type"]){
if (!this._layerName) { continue
throw "Multiple layers in the downloaded tile, but no layername is given to choose from"
} }
layer = layers.find((l) => l.name === this._layerName) let type: string = "node"
} switch (properties["osm_type"]) {
if (!layer) { case "N":
return type = "node"
} break
const builder = new MvtFeatureBuilder(layer.extent, this.x, this.y, this.z) case "W":
const features: GeojsonFeature[] = [] type = "way"
break
for (const feature of layer.features) { case "R":
const properties = this.inflateProperties(feature.tags, layer.keys, layer.values) type = "relation"
features.push(builder.toGeoJson(feature.geometry, feature.type, properties)) break
}
properties["id"] = type + "/" + properties["osm_id"]
delete properties["osm_id"]
delete properties["osm_type"]
} }
this._features.setData(features) this._features.setData(features)
} catch (e) { } catch (e) {
@ -445,27 +91,5 @@ export default class MvtSource implements FeatureSourceForTile, UpdatableFeature
} }
} }
private inflateProperties(tags: number[], keys: string[], values: { string_value: string }[]) {
const properties = {}
for (let i = 0; i < tags.length; i += 2) {
properties[keys[tags[i]]] = this.getValue(values[tags[i + 1]])
}
let type: string
switch (properties["osm_type"]) {
case "N":
type = "node"
break
case "W":
type = "way"
break
case "R":
type = "relation"
break
}
properties["id"] = type + "/" + properties["osm_id"]
delete properties["osm_id"]
delete properties["osm_type"]
return properties
}
} }

View file

@ -92,6 +92,13 @@ export class GeoOperations {
return turf.distance(lonlat0, lonlat1, { units: "meters" }) return turf.distance(lonlat0, lonlat1, { units: "meters" })
} }
/**
* Starting on `from`, travels `distance` meters in the direction of the `bearing` (default: 90)
*/
static destination(from: Coord | [number,number],distance: number, bearing: number = 90): [number,number]{
return <[number,number]> turf.destination(from, distance, bearing, {units: "meters"}).geometry.coordinates
}
static convexHull(featureCollection, options: { concavity?: number }) { static convexHull(featureCollection, options: { concavity?: number }) {
return turf.convex(featureCollection, options) return turf.convex(featureCollection, options)
} }

View file

@ -17,7 +17,8 @@ export interface ProvidedImage {
*/ */
rotation?: number rotation?: number
lat?: number, lat?: number,
lon?: number lon?: number,
host?: string
} }
export default abstract class ImageProvider { export default abstract class ImageProvider {
@ -25,7 +26,7 @@ export default abstract class ImageProvider {
public abstract readonly name: string public abstract readonly name: string
public abstract SourceIcon(id?: string, location?: { lon: number; lat: number }): BaseUIElement public abstract SourceIcon(img?: {id: string, url: string, host?: string}, location?: { lon: number; lat: number }): BaseUIElement
/** /**

View file

@ -118,13 +118,14 @@ export class Mapillary extends ImageProvider {
} }
SourceIcon( SourceIcon(
id: string, img: {id: string, url: string},
location?: { location?: {
lon: number lon: number
lat: number lat: number
} }
): BaseUIElement { ): BaseUIElement {
let url: string = undefined let url: string = undefined
const id = img.id
if (id) { if (id) {
url = Mapillary.createLink(location, 16, "" + id) url = Mapillary.createLink(location, 16, "" + id)
} }

View file

@ -1,13 +1,15 @@
import { ImageUploader } from "./ImageUploader" import { ImageUploader } from "./ImageUploader"
import { AuthorizedPanoramax, PanoramaxXYZ, ImageData } from "panoramax-js/dist" import { AuthorizedPanoramax, ImageData, Panoramax, PanoramaxXYZ } from "panoramax-js/dist"
import ExifReader from "exifreader" import ExifReader from "exifreader"
import ImageProvider, { ProvidedImage } from "./ImageProvider" import ImageProvider, { ProvidedImage } from "./ImageProvider"
import BaseUIElement from "../../UI/BaseUIElement" import BaseUIElement from "../../UI/BaseUIElement"
import { LicenseInfo } from "./LicenseInfo" import { LicenseInfo } from "./LicenseInfo"
import { Utils } from "../../Utils"
import { GeoOperations } from "../GeoOperations" import { GeoOperations } from "../GeoOperations"
import Constants from "../../Models/Constants" import Constants from "../../Models/Constants"
import { Store, Stores, UIEventSource } from "../UIEventSource" import { Store, Stores, UIEventSource } from "../UIEventSource"
import SvelteUIElement from "../../UI/Base/SvelteUIElement"
import Panoramax_bw from "../../assets/svg/Panoramax_bw.svelte"
import Link from "../../UI/Base/Link"
export default class PanoramaxImageProvider extends ImageProvider { export default class PanoramaxImageProvider extends ImageProvider {
@ -15,13 +17,18 @@ export default class PanoramaxImageProvider extends ImageProvider {
public static readonly singleton = new PanoramaxImageProvider() public static readonly singleton = new PanoramaxImageProvider()
private static readonly xyz = new PanoramaxXYZ() private static readonly xyz = new PanoramaxXYZ()
private static defaultPanoramax = new AuthorizedPanoramax(Constants.panoramax.url, Constants.panoramax.token) private static defaultPanoramax = new AuthorizedPanoramax(Constants.panoramax.url, Constants.panoramax.token)
public defaultKeyPrefixes: string[] = ["panoramax"] public defaultKeyPrefixes: string[] = ["panoramax"]
public readonly name: string = "panoramax" public readonly name: string = "panoramax"
private static knownMeta: Record<string, { data: ImageData, time: Date }> = {} private static knownMeta: Record<string, { data: ImageData, time: Date }> = {}
public SourceIcon(id?: string, location?: { lon: number; lat: number; }): BaseUIElement { public SourceIcon(img?: { id: string, url: string, host?: string }, location?: { lon: number; lat: number; }): BaseUIElement {
return undefined const p = new Panoramax(img.host)
return new Link(new SvelteUIElement(Panoramax_bw), p.createViewLink({
imageId: img?.id,
location
}), true)
} }
public addKnownMeta(meta: ImageData) { public addKnownMeta(meta: ImageData) {
@ -36,7 +43,7 @@ export default class PanoramaxImageProvider extends ImageProvider {
private async getInfoFromMapComplete(id: string): Promise<{ data: ImageData, url: string }> { private async getInfoFromMapComplete(id: string): Promise<{ data: ImageData, url: string }> {
const sequence = "6e702976-580b-419c-8fb3-cf7bd364e6f8" // We always reuse this sequence const sequence = "6e702976-580b-419c-8fb3-cf7bd364e6f8" // We always reuse this sequence
const url = `https://panoramax.mapcomplete.org/` const url = `https://panoramax.mapcomplete.org/`
const data = await PanoramaxImageProvider.defaultPanoramax.imageInfo(sequence, id) const data = await PanoramaxImageProvider.defaultPanoramax.imageInfo(id, sequence)
return { url, data } return { url, data }
} }
@ -68,10 +75,14 @@ export default class PanoramaxImageProvider extends ImageProvider {
} }
const [lon, lat] = GeoOperations.centerpointCoordinates(meta) const [lon, lat] = GeoOperations.centerpointCoordinates(meta)
const hd = meta.properties
console.log(">>>",meta)
// const hdUrl = new URL(hd)
return <ProvidedImage>{ return <ProvidedImage>{
id: meta.id, id: meta.id,
url: makeAbsolute(meta.assets.sd.href), url: makeAbsolute(meta.assets.sd.href),
url_hd: makeAbsolute(meta.assets.hd.href), url_hd: makeAbsolute(meta.assets.hd.href),
host: meta["links"].find(l => l.rel === "root")?.href,
lon, lat, lon, lat,
key: "panoramax", key: "panoramax",
provider: this, provider: this,
@ -87,9 +98,9 @@ export default class PanoramaxImageProvider extends ImageProvider {
} }
const cached = PanoramaxImageProvider.knownMeta[id] const cached = PanoramaxImageProvider.knownMeta[id]
if (cached) { if (cached) {
if(new Date().getTime() - cached.time.getTime() < 1000){ if (new Date().getTime() - cached.time.getTime() < 1000) {
return { data: cached.data, url: undefined } return { data: cached.data, url: undefined }
} }
} }
try { try {
@ -100,13 +111,15 @@ export default class PanoramaxImageProvider extends ImageProvider {
try { try {
return await this.getInfoFromXYZ(id) return await this.getInfoFromXYZ(id)
} catch (e) { } catch (e) {
console.debug(e) console.debug(e)
} }
return undefined return undefined
} }
public async ExtractUrls(key: string, value: string): Promise<ProvidedImage[]> { public async ExtractUrls(key: string, value: string): Promise<ProvidedImage[]> {
if (!Panoramax.isId(value)) {
return undefined
}
return [await this.getInfoFor(value).then(r => this.featureToImage(<any>r))] return [await this.getInfoFor(value).then(r => this.featureToImage(<any>r))]
} }
@ -115,7 +128,7 @@ export default class PanoramaxImageProvider extends ImageProvider {
const source = UIEventSource.FromPromise(super.getRelevantUrlsFor(tags, prefixes)) const source = UIEventSource.FromPromise(super.getRelevantUrlsFor(tags, prefixes))
function hasLoading(data: ProvidedImage[]) { function hasLoading(data: ProvidedImage[]) {
if(data === undefined){ if (data === undefined) {
return true return true
} }
return data?.some(img => img?.status !== undefined && img?.status !== "ready" && img?.status !== "broken") return data?.some(img => img?.status !== undefined && img?.status !== "ready" && img?.status !== "broken")

View file

@ -10,6 +10,7 @@ import { Point } from "geojson"
import MvtSource from "../FeatureSource/Sources/MvtSource" import MvtSource from "../FeatureSource/Sources/MvtSource"
import AllImageProviders from "../ImageProviders/AllImageProviders" import AllImageProviders from "../ImageProviders/AllImageProviders"
import { Imgur } from "../ImageProviders/Imgur" import { Imgur } from "../ImageProviders/Imgur"
import { Panoramax, PanoramaxXYZ } from "panoramax-js/dist"
interface ImageFetcher { interface ImageFetcher {
/** /**
@ -102,7 +103,7 @@ class P4CImageFetcher implements ImageFetcher {
{ {
mindate: new Date().getTime() - maxAgeSeconds, mindate: new Date().getTime() - maxAgeSeconds,
towardscenter: false, towardscenter: false,
} },
) )
} catch (e) { } catch (e) {
console.log("P4C image fetcher failed with", e) console.log("P4C image fetcher failed with", e)
@ -163,6 +164,55 @@ class ImagesInLoadedDataFetcher implements ImageFetcher {
} }
} }
class ImagesFromPanoramaxFetcher implements ImageFetcher {
private readonly _radius: number
private readonly _panoramax: Panoramax
name: string = "panoramax"
constructor(url?: string, radius: number = 100) {
this._radius = radius
if (url) {
this._panoramax = new Panoramax(url)
} else {
this._panoramax = new PanoramaxXYZ()
}
}
public async fetchImages(lat: number, lon: number): Promise<P4CPicture[]> {
const bboxObj = new BBox([
GeoOperations.destination([lon, lat], this._radius * Math.sqrt(2), -45),
GeoOperations.destination([lon, lat], this._radius * Math.sqrt(2), 135),
])
const bbox: [number, number, number, number] = bboxObj.toLngLatFlat()
const images = await this._panoramax.search({ bbox, limit: 1000 })
return images.map(i => {
const [lng, lat] = i.geometry.coordinates
return ({
pictureUrl: i.assets.sd.href,
coordinates: { lng, lat },
provider: "panoramax",
direction: i.properties["view:azimuth"],
osmTags: {
"panoramax": i.id,
},
thumbUrl: i.assets.thumb.href,
date: new Date(i.properties.datetime).getTime(),
license: i.properties["geovisio:license"],
author: i.providers.at(-1).name,
detailsUrl: i.id,
details: {
isSpherical: i.properties["exif"]["Xmp.GPano.ProjectionType"] === "equirectangular",
},
})
})
}
}
class ImagesFromCacheServerFetcher implements ImageFetcher { class ImagesFromCacheServerFetcher implements ImageFetcher {
private readonly _searchRadius: number private readonly _searchRadius: number
public readonly name = "fromCacheServer" public readonly name = "fromCacheServer"
@ -186,7 +236,7 @@ class ImagesFromCacheServerFetcher implements ImageFetcher {
async fetchImagesForType( async fetchImagesForType(
targetlat: number, targetlat: number,
targetlon: number, targetlon: number,
type: "lines" | "pois" | "polygons" type: "lines" | "pois" | "polygons",
): Promise<P4CPicture[]> { ): Promise<P4CPicture[]> {
const { x, y, z } = Tiles.embedded_tile(targetlat, targetlon, 14) const { x, y, z } = Tiles.embedded_tile(targetlat, targetlon, 14)
@ -203,7 +253,7 @@ class ImagesFromCacheServerFetcher implements ImageFetcher {
}), }),
x, x,
y, y,
z z,
) )
await src.updateAsync() await src.updateAsync()
return src.features.data return src.features.data
@ -360,6 +410,8 @@ export class CombinedFetcher {
this.sources = [ this.sources = [
new ImagesInLoadedDataFetcher(indexedFeatures, radius), new ImagesInLoadedDataFetcher(indexedFeatures, radius),
new ImagesFromCacheServerFetcher(radius), new ImagesFromCacheServerFetcher(radius),
new ImagesFromPanoramaxFetcher(),
new ImagesFromPanoramaxFetcher(Constants.panoramax.url),
new MapillaryFetcher({ new MapillaryFetcher({
panoramas: "no", panoramas: "no",
max_images: 25, max_images: 25,
@ -375,7 +427,7 @@ export class CombinedFetcher {
lat: number, lat: number,
lon: number, lon: number,
state: UIEventSource<Record<string, "loading" | "done" | "error">>, state: UIEventSource<Record<string, "loading" | "done" | "error">>,
sink: UIEventSource<P4CPicture[]> sink: UIEventSource<P4CPicture[]>,
): Promise<void> { ): Promise<void> {
try { try {
const pics = await source.fetchImages(lat, lon) const pics = await source.fetchImages(lat, lon)
@ -408,7 +460,7 @@ export class CombinedFetcher {
public getImagesAround( public getImagesAround(
lon: number, lon: number,
lat: number lat: number,
): { ): {
images: Store<P4CPicture[]> images: Store<P4CPicture[]>
state: Store<Record<string, "loading" | "done" | "error">> state: Store<Record<string, "loading" | "done" | "error">>

View file

@ -49,6 +49,7 @@
import SidebarUnit from "../Base/SidebarUnit.svelte" import SidebarUnit from "../Base/SidebarUnit.svelte"
import Squares2x2 from "@babeard/svelte-heroicons/mini/Squares2x2" import Squares2x2 from "@babeard/svelte-heroicons/mini/Squares2x2"
import EnvelopeOpen from "@babeard/svelte-heroicons/mini/EnvelopeOpen" import EnvelopeOpen from "@babeard/svelte-heroicons/mini/EnvelopeOpen"
import PanoramaxLink from "./PanoramaxLink.svelte"
export let state: ThemeViewState export let state: ThemeViewState
let userdetails = state.osmConnection.userDetails let userdetails = state.osmConnection.userDetails
@ -232,6 +233,7 @@
<If condition={featureSwitches.featureSwitchEnableLogin}> <If condition={featureSwitches.featureSwitchEnableLogin}>
<OpenIdEditor mapProperties={state.mapProperties} /> <OpenIdEditor mapProperties={state.mapProperties} />
<OpenJosm {state} /> <OpenJosm {state} />
<PanoramaxLink large={false} mapProperties={state.mapProperties} />
<MapillaryLink large={false} mapProperties={state.mapProperties} /> <MapillaryLink large={false} mapProperties={state.mapProperties} />
</If> </If>

View file

@ -0,0 +1,40 @@
<script lang="ts">
import Translations from "../i18n/Translations"
import { Store } from "../../Logic/UIEventSource"
import Tr from "../Base/Tr.svelte"
import Mapillary_black from "../../assets/svg/Mapillary_black.svelte"
import { twMerge } from "tailwind-merge"
import { PanoramaxXYZ, Panoramax } from "panoramax-js/dist"
import Panoramax_bw from "../../assets/svg/Panoramax_bw.svelte"
import {default as Panoramax_svg} from "../../assets/svg/Panoramax.svelte"
/*
A subtleButton which opens panoramax in a new tab at the current location
*/
export let host: Panoramax = new PanoramaxXYZ()
export let mapProperties: {
readonly zoom: Store<number>
readonly location: Store<{ lon: number; lat: number }>
}
let location = mapProperties.location
let zoom = mapProperties.zoom
let href = location.mapD(location =>
host.createViewLink({
location,
zoom: zoom.data,
}), [zoom])
export let large: boolean = true
</script>
<a class="flex items-center" href={$href} target="_blank">
<Panoramax_svg class={twMerge("shrink-0", large ? "m-2 mr-4 h-12 w-12" : "h-5 w-5 pr-1")} />
{#if large}
<div class="flex flex-col">
<Tr t={Translations.t.general.attribution.openPanoramax} />
<Tr cls="subtle" t={Translations.t.general.attribution.panoramaxHelp} />
</div>
{:else}
<Tr t={Translations.t.general.attribution.openPanoramax} />
{/if}
</a>

View file

@ -16,7 +16,7 @@
let license: Store<LicenseInfo> = UIEventSource.FromPromise( let license: Store<LicenseInfo> = UIEventSource.FromPromise(
image.provider?.DownloadAttribution(image) image.provider?.DownloadAttribution(image)
) )
let icon = image.provider?.SourceIcon(image.id) let icon = image.provider?.SourceIcon(image)
</script> </script>
{#if $license !== undefined} {#if $license !== undefined}

View file

@ -130,7 +130,7 @@
for (const f of features) { for (const f of features) {
bbox = bbox.unionWith(BBox.get(f)) bbox = bbox.unionWith(BBox.get(f))
} }
mapProperties.maxbounds.set(bbox.pad(1.1)) mapProperties.maxbounds.set(bbox.pad(4))
}) })
) )

View file

@ -1511,7 +1511,6 @@ In the case that MapComplete is pointed to the testing grounds, the edit will be
if (!element) { if (!element) {
return return
} }
console.log("Scrolling into view:", element)
// Is the element completely in the view? // Is the element completely in the view?
const parentRect = Utils.findParentWithScrolling(element)?.getBoundingClientRect() const parentRect = Utils.findParentWithScrolling(element)?.getBoundingClientRect()
if (!parentRect) { if (!parentRect) {

View file

@ -1,4 +1,4 @@
<script> <script>
export let color = "#000000" export let color = "#000000"
</script> </script>
<svg {...$$restProps} on:click on:mouseover on:mouseenter on:mouseleave on:keydown on:focus width="375px" height="375px" viewBox="0 0 375 375" version="1.1" id="svg1" sodipodi:docname="circle.svg" inkscape:version="1.3.2 (1:1.3.2+202311252150+091e20ef0f)" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns="http://www.w3.org/2000/svg" xmlns:svg="http://www.w3.org/2000/svg"> <defs id="defs1" /> <sodipodi:namedview id="namedview1" pagecolor="#505050" bordercolor="#eeeeee" borderopacity="1" inkscape:showpageshadow="0" inkscape:pageopacity="0" inkscape:pagecheckerboard="0" inkscape:deskcolor="#d1d1d1" inkscape:zoom="2.056" inkscape:cx="187.5" inkscape:cy="187.5" inkscape:window-width="1920" inkscape:window-height="995" inkscape:window-x="0" inkscape:window-y="0" inkscape:window-maximized="1" inkscape:current-layer="svg1" /> <path style="fill:{color}" class="selectable" d="M 375,187.5 C 375,291.05469 291.05469,375 187.5,375 83.945312,375 0,291.05469 0,187.5 0,83.945312 83.945312,0 187.5,0 291.05469,0 375,83.945312 375,187.5 Z m 0,0" id="path1" /> </svg> <svg {...$$restProps} on:click on:mouseover on:mouseenter on:mouseleave on:keydown on:focus width="375px" height="375px" viewBox="0 0 375 375" version="1.1" id="svg1" sodipodi:docname="circle.svg" inkscape:version="1.3.2 (1:1.3.2+202311252150+091e20ef0f)" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns="http://www.w3.org/2000/svg" xmlns:svg="http://www.w3.org/2000/svg"> <defs id="defs1" /> <sodipodi:namedview id="namedview1" pagecolor="#505050" bordercolor="#eeeeee" borderopacity="1" inkscape:showpageshadow="0" inkscape:pageopacity="0" inkscape:pagecheckerboard="0" inkscape:deskcolor="#d1d1d1" inkscape:zoom="2.056" inkscape:cx="187.5" inkscape:cy="187.5" inkscape:window-width="1920" inkscape:window-height="995" inkscape:window-x="0" inkscape:window-y="0" inkscape:window-maximized="1" inkscape:current-layer="svg1" /> <path style="fill:{color};" class="selectable" d="M 375,187.5 C 375,291.05469 291.05469,375 187.5,375 83.945312,375 0,291.05469 0,187.5 0,83.945312 83.945312,0 187.5,0 291.05469,0 375,83.945312 375,187.5 Z m 0,0" id="path1" /> </svg>

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long