From 3c6fadcf7012ba1a052179e88b4b838b4e3339a0 Mon Sep 17 00:00:00 2001 From: Thomas Steen Rasmussen Date: Sat, 28 Mar 2020 11:45:54 +0100 Subject: [PATCH] kortforsyningen maps (#484) * add maps app, add proxy view for kortforsyningen services, add static_src/js/kfmap.js to create leaflet maps with tiles from kortforsyningen, adjust facility views to use the new map, add marker field to FacilityType model to specify marker colour, add js and marker pngs for coloured markers * remove debug print Co-authored-by: Thomas Steen Rasmussen --- src/bornhack/environment_settings.py.dist | 2 +- src/bornhack/settings.py | 1 + src/bornhack/urls.py | 1 + src/facilities/admin.py | 4 +- .../migrations/0004_facilitytype_marker.py | 33 +++ src/facilities/models.py | 8 + src/facilities/templates/facility_detail.html | 29 +- src/facilities/templates/facility_list.html | 35 ++- .../templates/facility_type_list.html | 39 ++- src/maps/__init__.py | 0 src/maps/apps.py | 5 + src/maps/migrations/__init__.py | 0 src/maps/urls.py | 9 + src/maps/utils.py | 19 ++ src/maps/views.py | 54 ++++ .../img/leaflet/marker-icon-2x-black.png | Bin 0 -> 3183 bytes .../img/leaflet/marker-icon-2x-blue.png | Bin 0 -> 4033 bytes .../img/leaflet/marker-icon-2x-gold.png | Bin 0 -> 4274 bytes .../img/leaflet/marker-icon-2x-green.png | Bin 0 -> 4203 bytes .../img/leaflet/marker-icon-2x-grey.png | Bin 0 -> 3534 bytes .../img/leaflet/marker-icon-2x-orange.png | Bin 0 -> 4167 bytes .../img/leaflet/marker-icon-2x-red.png | Bin 0 -> 4230 bytes .../img/leaflet/marker-icon-2x-violet.png | Bin 0 -> 4190 bytes .../img/leaflet/marker-icon-2x-yellow.png | Bin 0 -> 4159 bytes .../img/leaflet/marker-icon-black.png | Bin 0 -> 1523 bytes .../img/leaflet/marker-icon-blue.png | Bin 0 -> 1747 bytes .../img/leaflet/marker-icon-gold.png | Bin 0 -> 1862 bytes .../img/leaflet/marker-icon-green.png | Bin 0 -> 1822 bytes .../img/leaflet/marker-icon-grey.png | Bin 0 -> 1691 bytes .../img/leaflet/marker-icon-orange.png | Bin 0 -> 1862 bytes .../img/leaflet/marker-icon-red.png | Bin 0 -> 1870 bytes .../img/leaflet/marker-icon-violet.png | Bin 0 -> 1859 bytes .../img/leaflet/marker-icon-yellow.png | Bin 0 -> 1862 bytes src/static_src/img/leaflet/marker-shadow.png | Bin 0 -> 608 bytes src/static_src/js/kfmap.js | 101 +++++++ src/static_src/js/leaflet-1.6.0.js | 5 + src/static_src/js/leaflet-color-markers.js | 82 ++++++ src/static_src/js/proj4.js | 1 + src/static_src/js/proj4leaflet.js | 272 ++++++++++++++++++ .../management/commands/bootstrap-devsite.py | 22 +- 40 files changed, 686 insertions(+), 36 deletions(-) create mode 100644 src/facilities/migrations/0004_facilitytype_marker.py create mode 100644 src/maps/__init__.py create mode 100644 src/maps/apps.py create mode 100644 src/maps/migrations/__init__.py create mode 100644 src/maps/urls.py create mode 100644 src/maps/utils.py create mode 100644 src/maps/views.py create mode 100644 src/static_src/img/leaflet/marker-icon-2x-black.png create mode 100644 src/static_src/img/leaflet/marker-icon-2x-blue.png create mode 100644 src/static_src/img/leaflet/marker-icon-2x-gold.png create mode 100644 src/static_src/img/leaflet/marker-icon-2x-green.png create mode 100644 src/static_src/img/leaflet/marker-icon-2x-grey.png create mode 100644 src/static_src/img/leaflet/marker-icon-2x-orange.png create mode 100644 src/static_src/img/leaflet/marker-icon-2x-red.png create mode 100644 src/static_src/img/leaflet/marker-icon-2x-violet.png create mode 100644 src/static_src/img/leaflet/marker-icon-2x-yellow.png create mode 100644 src/static_src/img/leaflet/marker-icon-black.png create mode 100644 src/static_src/img/leaflet/marker-icon-blue.png create mode 100644 src/static_src/img/leaflet/marker-icon-gold.png create mode 100644 src/static_src/img/leaflet/marker-icon-green.png create mode 100644 src/static_src/img/leaflet/marker-icon-grey.png create mode 100644 src/static_src/img/leaflet/marker-icon-orange.png create mode 100644 src/static_src/img/leaflet/marker-icon-red.png create mode 100644 src/static_src/img/leaflet/marker-icon-violet.png create mode 100644 src/static_src/img/leaflet/marker-icon-yellow.png create mode 100644 src/static_src/img/leaflet/marker-shadow.png create mode 100644 src/static_src/js/kfmap.js create mode 100644 src/static_src/js/leaflet-1.6.0.js create mode 100644 src/static_src/js/leaflet-color-markers.js create mode 100644 src/static_src/js/proj4.js create mode 100644 src/static_src/js/proj4leaflet.js diff --git a/src/bornhack/environment_settings.py.dist b/src/bornhack/environment_settings.py.dist index bb49880b..4187f833 100644 --- a/src/bornhack/environment_settings.py.dist +++ b/src/bornhack/environment_settings.py.dist @@ -95,4 +95,4 @@ ECONOMYTEAM_EMAIL = "{{ django_economyteam_email }}" ECONOMYTEAM_NAME = "Economy" BORNHACK_2019_OLD_TOKEN_TOKEN = "{{ bornhack_2019_old_token_token }}" - +KORTFORSYNINGEN_TOKEN = "{{ kortforsyningen_token }}" diff --git a/src/bornhack/settings.py b/src/bornhack/settings.py index 40c5de96..9c253f5d 100644 --- a/src/bornhack/settings.py +++ b/src/bornhack/settings.py @@ -54,6 +54,7 @@ INSTALLED_APPS = [ "wishlist", "facilities", "phonebook", + "maps", "allauth", "allauth.account", "allauth_2fa", diff --git a/src/bornhack/urls.py b/src/bornhack/urls.py index 97e01eb3..d5c65b6c 100644 --- a/src/bornhack/urls.py +++ b/src/bornhack/urls.py @@ -53,6 +53,7 @@ urlpatterns = [ path("api/", csrf_exempt(GraphQLView.as_view(graphiql=True))), path("camps/", CampListView.as_view(), name="camp_list"), path("token/", include("tokens.urls", namespace="tokens")), + path("maps/", include("maps.urls", namespace="maps")), # camp redirect views here path( "", diff --git a/src/facilities/admin.py b/src/facilities/admin.py index d00e4f0a..ec00cff3 100644 --- a/src/facilities/admin.py +++ b/src/facilities/admin.py @@ -12,8 +12,8 @@ class FacilityQuickFeedbackAdmin(admin.ModelAdmin): @admin.register(FacilityType) class FacilityTypeAdmin(admin.ModelAdmin): - list_display = ["name", "description", "responsible_team", "camp"] - list_filter = ["responsible_team__camp", "responsible_team"] + list_display = ["name", "description", "icon", "marker", "responsible_team", "camp"] + list_filter = ["responsible_team__camp", "icon", "marker", "responsible_team"] @admin.register(Facility) diff --git a/src/facilities/migrations/0004_facilitytype_marker.py b/src/facilities/migrations/0004_facilitytype_marker.py new file mode 100644 index 00000000..3bc841cd --- /dev/null +++ b/src/facilities/migrations/0004_facilitytype_marker.py @@ -0,0 +1,33 @@ +# Generated by Django 3.0.3 on 2020-03-10 11:09 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ("facilities", "0003_location_not_null"), + ] + + operations = [ + migrations.AddField( + model_name="facilitytype", + name="marker", + field=models.CharField( + choices=[ + ("blueIcon", "Blue (#2A81CB)"), + ("goldIcon", "Gold (#FFD326)"), + ("redIcon", "Red (#CB2B3E)"), + ("greenIcon", "Green (#2AAD27)"), + ("orangeIcon", "Orange (#CB8427)"), + ("yellowIcon", "Yellow (#CAC428)"), + ("violetIcon", "Violet (#9C2BCB)"), + ("greyIcon", "Grey (#7B7B7B)"), + ("blackIcon", "Black (#3D3D3D)"), + ], + default="blueIcon", + help_text="The name/colour of the Leaflet marker to use for this facility type.", + max_length=10, + ), + ), + ] diff --git a/src/facilities/models.py b/src/facilities/models.py index 646f9957..2eedcacd 100644 --- a/src/facilities/models.py +++ b/src/facilities/models.py @@ -8,6 +8,7 @@ from django.core.exceptions import ValidationError from django.db import models from django.shortcuts import reverse from django.utils.text import slugify +from maps.utils import LeafletMarkerChoices from utils.models import CampRelatedModel, UUIDModel logger = logging.getLogger("bornhack.%s" % __name__) @@ -59,6 +60,13 @@ class FacilityType(CampRelatedModel): help_text="Name of the fontawesome icon to use, including the 'fab fa-' or 'fas fa-' part.", ) + marker = models.CharField( + max_length=10, + choices=LeafletMarkerChoices.choices, + default=LeafletMarkerChoices.BLUE, + help_text="The name/colour of the Leaflet marker to use for this facility type.", + ) + responsible_team = models.ForeignKey( "teams.Team", on_delete=models.PROTECT, diff --git a/src/facilities/templates/facility_detail.html b/src/facilities/templates/facility_detail.html index f83c1d47..c84bccda 100644 --- a/src/facilities/templates/facility_detail.html +++ b/src/facilities/templates/facility_detail.html @@ -1,9 +1,13 @@ {% extends 'program_base.html' %} {% load leaflet_tags %} +{% load static %} {% block extra_head %} - {% leaflet_js %} {% leaflet_css %} + + + + {% endblock extra_head %} {% block title %} @@ -16,26 +20,29 @@

{{ facility.facility_type.name }}: {{ facility.name }}

-

{{ facility.description }}

+

+ {{ facility.name }} {{ facility.description }}

{% if request.user.is_authenticated %} Submit Feedback {% endif %} Back to {{ facilitytype.name }} list -

{% leaflet_map "facility_detail" %}

+

+

+ + {% endblock %} diff --git a/src/facilities/templates/facility_list.html b/src/facilities/templates/facility_list.html index a942b64a..05bd97da 100644 --- a/src/facilities/templates/facility_list.html +++ b/src/facilities/templates/facility_list.html @@ -1,9 +1,13 @@ {% extends 'program_base.html' %} {% load leaflet_tags %} +{% load static %} {% block extra_head %} - {% leaflet_js %} {% leaflet_css %} + + + + {% endblock extra_head %} {% block title %} @@ -25,34 +29,43 @@ Facilities of type {{ facilitytype }} | {{ block.super }} {% endif %}

{{ facility.name }} +

{{ facility.description }}

+

Location: Lat {{ facility.location.y }} Long {{ facility.location.x }}

{% if request.user.is_authenticated %} {% else %} {% endif %} {% endfor %} +

+

-

{% leaflet_map "facility_list" %}

Back to facility type list + + {% endblock %} diff --git a/src/facilities/templates/facility_type_list.html b/src/facilities/templates/facility_type_list.html index ddeb30b7..b3081aaa 100644 --- a/src/facilities/templates/facility_type_list.html +++ b/src/facilities/templates/facility_type_list.html @@ -1,26 +1,63 @@ {% extends 'program_base.html' %} +{% load leaflet_tags %} +{% load static %} {% block title %} Facility Types | {{ block.super }} {% endblock %} +{% block extra_head %} + {% leaflet_css %} + + + + +{% endblock extra_head %} + {% block content %}
-

Facility Types

+

Facilities

+

The {{ camp.title }} facilities are grouped in categories. Pick a category to limit the facilities shown.

{% for ft in facilitytype_list %}

{{ ft.name }} +

{{ ft.description }}

{% endfor %}
+

+

+ + + + {% endblock %} diff --git a/src/maps/__init__.py b/src/maps/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/src/maps/apps.py b/src/maps/apps.py new file mode 100644 index 00000000..06d92359 --- /dev/null +++ b/src/maps/apps.py @@ -0,0 +1,5 @@ +from django.apps import AppConfig + + +class MapsConfig(AppConfig): + name = "maps" diff --git a/src/maps/migrations/__init__.py b/src/maps/migrations/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/src/maps/urls.py b/src/maps/urls.py new file mode 100644 index 00000000..81a62a5a --- /dev/null +++ b/src/maps/urls.py @@ -0,0 +1,9 @@ +from django.urls import re_path + +from .views import MapProxyView + +app_name = "maps" + +urlpatterns = [ + re_path("kfproxy/(?P.*)", MapProxyView.as_view(), name="proxy"), +] diff --git a/src/maps/utils.py b/src/maps/utils.py new file mode 100644 index 00000000..a448bcfb --- /dev/null +++ b/src/maps/utils.py @@ -0,0 +1,19 @@ +from django.db import models + + +class LeafletMarkerChoices(models.TextChoices): + """ + Leaflet icon color choices, a models.TextChoices class to use when we want to set + choices for a model field to pick a marker colour for a Leaflet map. + These map directly to the L.Icon() objects in static_src/js/leaflet-color-markers.js. + """ + + BLUE = "blueIcon", "Blue (#2A81CB)" + GOLD = "goldIcon", "Gold (#FFD326)" + RED = "redIcon", "Red (#CB2B3E)" + GREEN = "greenIcon", "Green (#2AAD27)" + ORANGE = "orangeIcon", "Orange (#CB8427)" + YELLOW = "yellowIcon", "Yellow (#CAC428)" + VIOLET = "violetIcon", "Violet (#9C2BCB)" + GREY = "greyIcon", "Grey (#7B7B7B)" + BLACK = "blackIcon", "Black (#3D3D3D)" diff --git a/src/maps/views.py b/src/maps/views.py new file mode 100644 index 00000000..b805c084 --- /dev/null +++ b/src/maps/views.py @@ -0,0 +1,54 @@ +import requests +from django.conf import settings +from django.core.exceptions import PermissionDenied +from django.http import HttpResponse +from django.views.generic import View + + +class MapProxyView(View): + """ + Proxy for KortForsyningen map service. Created so we can show maps without + leaking the IP of our visitors. + """ + + def get(self, *args, **kwargs): + """ + Before we make the request we check that the path is in our whitelist. + Before we return the response we copy headers except for a list we dont want. + """ + # only permit certain paths + path = self.request.path.replace("/maps/kfproxy", "", 1) + if path not in ["/orto_foraar", "/topo_skaermkort", "/mat", "/dhm"]: + raise PermissionDenied("No thanks") + + # ok, get the full path including querystring, and add our token + fullpath = self.request.get_full_path().replace("/maps/kfproxy", "", 1) + fullpath += f"&token={settings.KORTFORSYNINGEN_TOKEN}" + + # make the request + r = requests.get("https://services.kortforsyningen.dk" + fullpath) + + # make the response + response = HttpResponse(r.content, status=r.status_code) + + # list of headers that cause trouble when proxying + excluded_headers = [ + "connection", + "content-encoding", + "content-length", + "keep-alive", + "proxy-authenticate", + "proxy-authorization", + "te", + "trailers", + "transfer-encoding", + "upgrade", + ] + # proxy all headers from our upstream request to the response to our client, + # if they headers are not in our list of troublemakers + for key, value in r.headers.items(): + if key.lower() not in excluded_headers: + response[key] = value + + # all good, return the response + return response diff --git a/src/static_src/img/leaflet/marker-icon-2x-black.png b/src/static_src/img/leaflet/marker-icon-2x-black.png new file mode 100644 index 0000000000000000000000000000000000000000..23c94cfed50fb9b7adc5f0b99c5d5e8f4eeb58bc GIT binary patch literal 3183 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 U(+;`1LjV8(07*qoM6N<$g4YR6xc~qF literal 0 HcmV?d00001 diff --git a/src/static_src/img/leaflet/marker-icon-2x-green.png b/src/static_src/img/leaflet/marker-icon-2x-green.png new file mode 100644 index 0000000000000000000000000000000000000000..c359abb6c2c2a1ee7272e3f85ee825583f6924f2 GIT binary patch literal 4203 zcmV-x5R~tUP)~BqEIT3 zP^qfMc1(Ddr-&0sp|liQl@_&zh$IalD1n4LjPd)G0CCo@wb%AO@9WIWuYb(F*YCT# z_O1gRYyQ~lb7tl{zxQ|Mh^q4cp}CnJ@a8WqyHv;*32~9a<*K?!3>mNol>ssA2^t1& z8eg>U-uFBdW@=tJSBbpy8IestSblRG(#>*5;(c3Dp8Ud7`2GVDbK_hiAR-UZ=ls`b$%WKR^QlIc>h%GXi7kC zyk|*n%hmgVw*!a>l}jqPh316Cc`fkGkO0I8Cu@*N?}`;{Zg7%eFvs2>4Al2Ej+f9w zm05{=&6O5&JD7F9YaXRK>nH?Vu8AH49=RG82)=<_1@G zSV<}xh9k9S8)y>ifhc<0)9={y)U<)z`uW!^jwU`8;bJ3}%90$pApKwAJ+U58&&)Ov zY}JtENjf?XjhzJ{dJIfNwXc2ho$EJG8OU$mbIY7sR(}k5m2-~rvbGxqikc@h1GCvo z*^pPV1g21$TRcU}1NR$z3WiXUqkwB;_&GFW(g8+z) zNOQb}sv?xTQ5FA>$PfSYqkA97`KgRO~z*qpveixtErmm3R3!}P~6 zB_Z!?tJ!mg@%RVNn(n~W`lva#{TAbR> zWkP9wMpky%>{t}n8Zah^3IaH5aTQBGH^Y=i0#n%JPW;00uFvd_SmB=a?TowrZVEQtQ z3p8sUJIQ|eiGa?t@S;e0PL;-Z4T<#-{=Lm-nIlf!K=p zvB^D@o98g?C~pTcCI%+($7Q!7l5FIp-}*1^r?{%XilPyUk>b>p=H%9A$;*Z?Zm4gl zb;i2&>Gy1Uyd8PM+dwE)N)-KR@o^&HCy_>}-x950n?l@X7@0^Z(SrUlhdqVD#W9rI8YDsl)dNT)(9;+&jX$dccX?R)yET`qy~-)qlZD@|R%DF@s-P zxdy#N*?08>5A6674?gt(jb;`o7HIVdd`^UHo+DVn?#`IlJBFz6SHJUKZoBMuthHSbU87e`Mj8U% zdmbNtl#f63F=}Cg{<-}WuPjpLFziu(W-xilLcc|7$JEQJEHgp%jjBps$`S~mRRpx{ zE>GL5hF}F(Gt~BtqpG~&HNVYU7TrOXWjN=s)^-6IW4eDk=g9M%Tj#%?x4rHTRF%=; zQL;m}>%M!<-D-O;tw!=ZPn)Cqy9RivsNhOjsv~?%$zZR@>(UO(FDx3A7x!PvTbKSp z7eHt6$9ECw0y4(noa0Xx{~1eOz64RB^}I(_ac+``?;*A#s!CRNhzhEDrBT&Is){ph zPdtUNVO$D7%|-)N<(8{o%d);}Pf(|mgW>VNA1|ffzv8x(0yR=~7$ju_QwqK=#S~y+ z7l@W)H{0wPHae3;Xw_3L^zwO2PT2X=m9!@V>OB9_c~@dp2q9p`Y&W&()jDg`Ja%mF zGGkR1i3*{Tj4`&2@=P5os48Y8sg=QS(?vJ-T>P29hzM6#Ude^k1&9jnh)F8jp5shC z#snZ#G-V7b3tfac0BV3B5VWUyNs>R(O6pa%6)rAcdcq>7+e-Z0ek#Uew$uYe=h+w|8xE{TfGl@J zlPIJ~ftaLT-g_iT=y{{6yH%B<;Zf0JiM{9W6iDsOD1UKj6Kwo3KW+& zDb1~*M85jJUt!nS4nhd01=Lx52!Wy~*uxlKeEfduMV+ja5tsOGz20l?4hbSbXpS{I zGWva`A&V-PAEQi< zQ=?9vwPAEUpMCtp?E1w{P@#HtAED}rg%Tzy9Zc0?oZ$9nw2rm_Y8RRQciHVv?uqyR z@ZK9l=LZdcbA|N>DZxilYU?6GwS;#}7E{4w02|E_MsLQV1cib9@UA zJ@+j>_sAOd9^8}s=8OA@i##a!;gB||$GooJV#E-iSA4wyc;vCa-SAbHYH9N@QEzXJ zHpn#x*Ve-xWPz$ujC-){&on7&Exz&CTE6kvS{76nuyFB0a+kCJxdZGS z8z8nFfh$=mSM=c*v=WH1Fey19S&A{LN^_)<)J^2Ut|N1;_&>p+p&7&;bc6*SQ#JUp zVv#5U&-$4-FpkE^!HGc*ZXG;vF~(4yUqP0D&l7hQYLU>GoVIl3 z#HQE-j@YULL^1xs6X>8dv7I7>facXl^E=)keMx_{O5>+19v|`(BC(}XqY2;1CaD%MgN2~-) zMTqq&WW%bo#tQJ3ykZdpzQ2I}W6u;cPh>{MBfjC8YC@A&QbK7aERB(gTr~x|8hnk zTUKlu0{*ij6%WMRpcn$YAl*oYSiu90!6XeM^5re7ca8TxR)~BKpf%c}G@48(D`hX( zjRsRqODqk!P5@NF+&k&9!iLp5o&eSZ6#J5)n@XF~5k0TnipAt!>VnMO&dttx>o@BBQ5N( zL!nDk&SrPzG?yK66z#-SR98+`{nA4!k4WT40IhwEuB~)g$yu_Ej;AX2rnnJR*KW9L z=TFWW2tc%YCqNwbxFZQbsZ^RZAbB~}vUboCCIUcolI-=IfNWa1^HCN3c1J3mvu|e{ zN}SQ2NtXBmRf@I-0RQpRRXetvGmzx>>ajyfDtVswK6*Hde!MhdA~-^{vU-a5 zb0%+_R&RS6_$GkgpS+04P4e|KB#n}kkSxUw-;svMS2o|debt9Bg*<`14!u+P-(zfB?AY?pA0?BVrDwg6phpMFp3Y2!ISK z+Ef%K3ek^EyKb583qSq9*4-lVMSx;|6C2ZUT*;KDtx{!I#yPMa!eG&%WAE9vYRAD@ z2LfQlei*1rQ{iAbJu18M^y=_PQpq6bpmvTDMxy8^&Z?3;o0rzF*s?#sy#P8`fQMip zlL|gErCu^+f`QASv1xe-DglQ;|c81u9tu3zO12Cp>$oD~-d} zHa~OLwf)(?xa9*sJ1nZ70f+}Z5(H}?x0Okmk=$0mfO-Q5d?&;G_=dmx`Pg{}0+5Hw zr+_0`D0(RIxt*OplWm9!m8_DS)?k-`KcKdB?>Vt8=koGXcW)R~)pSwvfF~B|NG!LN zo}NlYkwP$sy42}Mx2)Jyd%=LDXkS_b3~EqlFRWrKojW3@O2Z~;_+!!-h(-M$&YAx@ z*8$o)`4IqfFk+kOK4aBXPkFZLs_FVh%XFoosvp|?!QIUl90)*rM+Y=0amb%mDxyL~ zk~HE0-?`cF^Oqf-|4%c*NY2C{n?Ja_DXJd?Fo#0A=xmbVcWk5Ts_CWW!xMe}Kw&j^o9?y=mpnM}Osjv|HC6B$}18 zIg!lv_w38>UiwXdjjMLtHkY> zK~#9!-CJ919Mu{A&Rll(X2@e*?3 zp$Se}AdpKVl|Wg0wr-kKy`ToQq1;*#fdUjtiVBTVg*GO!lQ`Jf^@@r^@B>qx<*opKckD zty{N#UkLFyfL;L5G!31dorp%GP*ru-{X_(wUkCvq#H@Q<*F`>`M>3g2xm@O-rvU5- zhr`d->qm6~dGNsp1L1J^SpYu(07X&I)zyWLj*c0dvuzudN(HX#!gXC-JvW0~@x3RXd@{ReAe%OA>QYtp2!O8vz>+0P(ACu?8E{<}<#KsG z+poU35YRLYhG9Ta6ggiqnM5j;;@duSU3dN7y?f6!3}o}>&7V~iIby}j&{HvxEV=gys4O(2;}W(N`7Lqu4%Y#9Q90Eh^= zTn@Hv%aGdY%eHOg^LY>vbX`X*7UL+mHj~Nhu4-DFHf{P05uF5}b$558tE&qDP$(2o zsZEXz_|*WCkP{VdaZ z=%I(cN<`lwBJ}k1$e3O#mFknxnufNvHW-F6BhghVl^K4eswx73KwVNs>J~3g0YGa z1;Jnt!C(;W?d>oOL*8F37HhJjsw$$pFURdXUX#0pN?%)6;7Jyrp?JeOCy9P$(o%*0Lc66aU4ucOz6(2 zSFgsZRjaUaqZZX%YY-7GT)2RIJ`Vu6^Ugc5e*OAc_CGK%fPsMltX;bn zufP5}jvhS<%d#*wHinySx(SM+z%Y!eKIytHDwPT}O+z#q*5e&nSr&uf8vbd{MD){7+Pe4St>#nZ-MV!PPIkB7emicx_0}tu)YR0Bx#zoF*Odx`K@-t{LPRTwNQ%OGk`$Xxp-=!3 zVa=K~^7)01wQJXch+tWkG#!@m^9>F{?4tmBX91}tBX|)aLa|r`5nUrsI&$Yg98Y|KS7ZRRBbpQvXf! zU3?#(ioXzQba2LY9B0NFwJx8Qizq}iMnp0i)UrJpi@B)Yk zZEbBc{G^`nUn-UOaL*}3^fuSybA+`yF9zM#)`s@>cDSyKLx&D6xSl_F@E|P9f?*gk za+S;Fs%!i69hbsHbV4bWN^b#36Ooh&wF(~Fw&kW{u^3cU#pL89_V3@1iHV7t0J7OE z;_*06pFRz4aB!o$Rw2iGV-Nrep-||U`u_XxyGM^6T`h$8oWFRfHKA?W&@>IIs=_b~ zjgkt68p>cYUl00MykMn^|6F)<+}P#_RMZ*MO`p^%)bmOSDTnu|Ek@&6>754LT; ztSAbV%Vkk06c7%F5eNjNsZ~>=g+f6VWGh#$L^7F_jp(VVDNIdG%?h0z9UWM@bms#_V#uF!1(w$m%4u(8XCI$>UPl6M6@oG$;bjL5D3(DQXKUR!+>EJviQ+; zT`oRX*;;Rh#-A*0+eS8<<(&7_tiIMqAAR)F%{SltF%k8rQYmzIcSF~8cBr}rcTN;V zk%55wTaM$vw(W)*bwUWqWHOm#v3e>VkN;&>U+dVhV=jPa0U(u1$t>SUox$%+EXzVJ zmqRw2MWIkYxm<3j+vv|7{N99!o}Rb&tEy@OK&f0VOZs$Ozh?d3`7YLUnM{VO!;IrN z2j>M6kH@C~{EjK)1XN41v~sX{vZV1$?H3~>Be|;Gcp`d+LmX#suII1E#ZGQn7W*p+ zAr91ht&m70{tDplepXnSUJo`{k}w-Y^vdw?@JBU)csK6@fa&RJ$%?P_a!uLb-hh`k zAcWX6XN@w~k7v%D`3-=75|KQKKp;@FdTi#007K5x}H-yclVd>+7i{^l7+uvVKCM=B!nv+>gK@bH@p2I7rvthu;{buD~_eWOq) zNa0FE+pE^`)&6Lj<|{;WoLS+#QmcWsSl{4G&TJ6T^NB>_M8iNlyZj;N71mw+4!o7V z;akrYLOfFIxtc&s(|iNKt5-LgYt{9QTr4z+$Y00&)-=t3E*gm6R|;+I21L#LYt#2ecIkY!o&HCr=%h3Cp< zvz)go0De^O^K}C;P4hzlzhPF`SL*HJSG#mwm-Ra{4!|599{#xLK)lAm4ggN6RFbST z!&i8YOeVukg(85*7PPm8+&nZibef0`Ud_s4iZ9l1{Nxy89d5Ps2bC9z1xNi1q_lK0Ib$srBUoH#68b zm<=M@ok%3I*Bpq~9M}gS={U|TR^~G)|2^q+T7K87Y1)Cs>}63vhK7bRM6{brV#jgh zx4YHY;1()_2e2z1j~A{R5KlZl1>lnFx^iQ_Z$xIX!GH6yF;*-VaR6i0Sn?Af28upKl=Lmo@?gXO$Bo7*fH6< z@x6IvNh6CfB6?(SaF9N=KmcHPc=!l_6YLKhwR~*6n@A-7*z9#%)n1qFBmOp?+ek#T ztrZK3R{gK;efQmW9KcuE(Y>zW8>VS~y%p=V?1cvr{g46pUU6@4)p{)hl1L<82k>X# zPp^9I*Z(abeqU)d8!hz_pRfGEYg*jh%5}6BGXf%d1lM5v7jS1S`wZT)V*mgE07*qo IM6N<$f)ZuZgXGXy)F-2*eNI;eWHu;frj%jceYy9&?|biamuES@{&DWT_|EXI^S*<6 zCMS7w=RD_}@A>WD^E^sK_+4o3a!>f^C%3JaOlp(FvPmJEMP!p!c))<5`jt`xn7Dsx zc$;#cNgR>H5pf)2j5&F_BCrpoKX>s>PdtA{fIRSt zZCS^0t`SFl63DiG&t!At@*QMzd0fw*bB-iQs0C$$N|{I4wP05 z$b+A{@WV=}&jK3&9M_|#w~t)D1IKYr880Fr%}pweQtFg3#u%zWg~?)pC~UNTo&atL zM$X#3P&-->kbk@4^?tf9zZ>`nfYzFxzSVSf_srOwi9<|OM@#}H=H$7RQWlWopfdUy!V!$mQNeVzN;?m^K$BYz&ijsySnM^Th*3;n1m#( zA#uY3Sd>0!wCm%fawzSzB{W$qP?{{ZMjauFFS+FA{U??To<_eWbCO$b&^J~cnK^(LQX1&E0v+!JdQgOY439Bm_rL~vF&2-xJ;+VmKei~r}@Pg62^y`_Ef0a_0r|)HT~~ z5RuD7g!Svz;`_b@Q7K^J5D_^e-Nc~t&Klk(JUN&iz zSUwN9sZ@&I-d+$x(g+p>!b#;U0LOdT04Pa>Nn%V`U68XdQJthVg_G`}x2Ky*r9!n< zcc{l-0xmg4wf6nPTiz}rmx~B%RqUF%1OM(aMxwc;lhn)Tu0FE) zG#yS)ai3tCG^@ZDvF;4-Uvvmt8-^0Wqac%y*&CB(*gV^MBz{t=T zMwuCDiBf7t#;cTK^{PHrt?ou8*0|%Kh{)Vv+*~JGrwL8Wv12c`=6d@FZhrD-t`%MK zKIJO1nKY@4XHTF!1$u62xPCXvbBII3;K(?YN(B_;S8w60H(yNeme(#5!Dk+)@WLU+#wVCASJUiLL81Vjxj-*hCuTrjS_Z9~vbH0whtKd(mHV{(C--fWoiy=URL7T!(ZzjS(=KcWdA*fK18* zF*b0S#1=%ebgf+w!^Gq?aboCLyOs0*h~|RMbZ-5x$pcCB0{y+47#pvd%@YIVzUv) z^;&;#&_>u~1bkOFfkg9U+D?12YCXgV^lf?Fk`u(<&F3MBB2G*z!)+hbtU#K3^c-bX zOW3GM*aYCF<`!wIEA4<7>W$FG2BqoUbl#GIc zy2iBQ+Vs9wraa!iWDp`kY49i_LZ)S>abw;}5+JO{El>m62*-^;XyO@zX3a*ExEa+o zzVBlM#*ZIaGLY%fKv|NW`jOtr}qj5+f(H5q>TrOa+aXQf_B%4`vz_0D3wy z^!8*i#_+_qZzK*ES4IBUw|3E}1*B6x>-sF&V8ZI$!MGW(j4@0F4O^QCztsINbo~sN z5)sPPM!US6(@x?L6WLsB^V%L9P>z{9t0r!;bWUI6uSk;nF4&B(F+D5coCxzBpd zq%m(H*V@~3P;UjpszcY~&f~{kFb5vky-g|gTG!Qd<(oy-JQJEYM0+V5$0eQdDNWZ1 zCPz8?#6Gm+(Y0m^ZYne5nW!G{!qY$GN4x)y!U4>OesBgI^tGLD`hh|&?(4~L&Zb`L zr>DnIvH)7t(>Q+5jKr}X8iHDbO3mhD9T|^oCQT;gppbTOjl&Xz@q*UyvTFf2)?c7l zsv}z6f5n{#EKFm7)NQ8_bT@V@z3$I0cpf&7QM3_d1sKpa?N-4aKwO}*@qa{v^RM3j&uGn+vwWsh}yGmjdvfCCpfu$#< zxuHZB)rn%H7GQ!B@$>|7WsIaUi9`W};iBhLq#yxN2_qBM?TeB-X6JtM{#`($7A8zi z*P0n-8Zq*UcAd#0A{2@>!q^}p({W_JIV+IuU)etad>3GNJOBrDIt`w-*7QpBly3_y z2L{K2ma6^B$L@NjGAA2vV(tW(3L4a^&6LH@pD`Bx%%9$9ap^zHLrD_nW^ zpc;dpOeag7|PWK zQ`M+-n|9sYw={FKoqG>HVq$&@&_5EiS$M7874%d-%CSs-OBy1wZ|B{If4O8JmX?%% zw3j$h%a7w^x>n4{owT)$sh~l*Zc}w-ti7HVknMX9|3o2=0-PABHkm*VrM+dh4dvKG z6EU0^Y+q}9XUAQKo;htG_BzD57GSCzQK^M1=D}LhC_Dss zQ#SxfP)(Q$8g0EkZQID%IVPs-)an9I7f;=^sFY?ggFkxb!J{Jb&6jM&*bLQ8FFj57 zGAMB{#xO8kZw2D7?!4pR;EDmUPTl=95LRo3LOB9w>9(SjLgzZcf$?I4Ml1k<^5pZ2 zPBIt!z{mDJ{i0IpYXAddbtD#)cI?S6R;60fhztW0)`1w|pLg7GXl%uSH1m|3fLg6C zOibH%xOBR6aqnXZsFba7#->7|L;$9gmM<-7OG|lZ`&ai5qq*H?#`Z2zxyq6Rjx4A< zUIyhVj4}+4wk|={S9b0>JbA`|0L0bs3qZLM3uA>45^N0-gNkL&P7FHT2?>l9+R`Yv zmHI79F2t7l;K#r9TtQ;F1z@OXufUWzIN991%!rfCp|vJa!oXPE%5cBpco~>ShJ>XNo7|1K%rAMijPc$Bt`&6bccWYX_dyO^YGv9{>8M2e9?Nan1sZB zsgTXh>Zx2mi&hXPhT(}eLH@bzU)f)M#ee|l4*xb_G%>ca>0{q|TK;PZVLLV*1Bv*a+SVLm@CxGFJgebPQ;-zyaB`77h zsXR(4!g|a|p?yzyE_X?v}fgn%cn{Mw=Wm!0%p87iG?0Vc{;64i#G*rIU7T)PrWs+Iay zchB}W{1kY5cQY=QEaUo<9eWS`;mVxd3N?u>)mjSLAX=0Xzg0kX-hKGTg8GkN5K<(Ns+dJFCfH6={$M+WCE1Rh zRK?DRn9Yv27%yeO2^3kpBo%CuD7aV+XplibKv)v8BS+XqXhx&aX!f`D>+X9`K6Jk) zfi$aTM4Ya=CDohmd+-0Ad(Qcv|Ls;H!vBZMUFr^hxbF8)lN_r>^lBw?hKQ`z-~of8 z)PPcIki-m3t^LiR_kQoM%u(zDL7#z*+NratzokBKHObyXAMb zJdnIDKpy+8t5?Ow`6Tcj;EY#wsuYgn;QAh}>w#97IKjj*Ns?f#eQkH+z-F}i;+5O( z`^8BCa{s#Z1;=qdCCdIKP-y+0FBT|vbWkXjaD8vqK8&$6Divy#Dvet0XkZa=d)$=I zU9;o<$z=obz(wmnpp^OounNHOTzbl7iX9y|j&scYA_A>RYK>Crn0u_X)T>n{#>R-7 zQS0YX;Fj8%7vDKwKbjYie|yVSeo)eP0v}4}r0H3?lCGX^l+s5g6-C&vi5Lq>!fX3h zN~M527w!9K-vfQ*`RU0?#z#glrakuuty}t|cRh7a<%EH3zUaELr<(r(TnfSTMF_=b(G@}&2f&zs?`#w%FkIMS9)-o|R#^m^T>#p4-tY5$V{{4#va{s#Z=P8H# zExZxnlvDfY?Cx%F8(Xbo8X<7vxkv}Ws{qxjRfdNSw)|&UTYJsb&p-Iwf`Qz3@w?B` z);1x z9v(a9nPYnSgjRmN{$1b#wC1$aSK&DhB0@Ydwd^2T7LO;U5Myy&m(xyP)$+-;;N1Jf zeSL@sO60PM8eg7u zYi+*higQHtPXTvjxlFlSPR%?OR8K+o4`+gfl zl*BaS2vGnE<#{;y0Jpar9pvWKw`qjfD9!pSR;)<39_H%JZ+qwE$5_ND_bW<-QlUUG zp92hLs&a&4%!okamI8Dk4_M+jW};Ff3`4>&Y-ee$H9-&%1OZ(g9R$9M+gZT+KBh8- z%wZf;siDgbg}|qy7*MH&SgpUpC-mF6&59Bc{{5n>)>&(x2RM7pS>!wq8$~3O({rwt zSMF&iv58uh;gM0SjgO)w8l`v@<5fztvRr0GcPC0TB0@4gIpGl%koUcWacUpv8&d2l8ASR7kMg))FoT86% zAdW4=qZ3$!b3gFDd4mAxJnIZD{M1LW2&0n|)EZGce9ty^IydkfmmmnR2o`gd2F?V? zdp=m3CN5*Z%8X6BE?CRx^c0CTbgW&&`5%7&f|K1@SN$%lF8vJv4o!@MwP-gt>)2up z(u}}b@}AeK&fcI!WVMLkWIxV_(JC*E+Ordil%lF|rQ3%>7T5f1O(vuGgG`v!=@5K)T2&jg5ME7A#G;iSN3aA zuYe+sEm+C+=gi@c#H7wd-Jd@B9uHp(hg@B#tx2J=6H0 zvQ*KCEf&Fu-LEY?BO**S8%HR&>(06&wwm&xo_vAcLLO@^+dlIZk_A?gPu_eh&03AX z_c^sQb$DBE%$|%hIo4XsRI`!QCcK~ry4F4oOo<4UX4oc#v-(LCw?&9EdU|oSW_oal zhd2BMlNtY+?Fz>y+49L-7~Z}Ur4(z+38~He!=dz z^V{o`Qg3#(qAQ>3(sQv;8%5|`4##x~e2>XSNbS&J_HKRUG(IOU@h_3Br-=K=XRDrYep(l)S?*Rkq$>_J!jk5zN#yZf`f;e!#Ew^|5b!lu9$=`ET6K^WV6e(yBgAx!}#XLBQeN zdzgB8f4jg6T#vQoUOF<4XQnEMN#-o4(P=^+uQ#xOQucv%sT*1EVV6W2CQ;Qeq!a`= z`GDkzIzFQ?kW5bFc9zIHF6XW2W4Joa&~$~wS}F&IsT>%7O$yMgEEYJUs|P179p_bt zq!d0?IxCF^&D5W*PSgXhl7sHP@bU+haAi3kaCYyCG)|9@&z&hbz;p>g+-XE~XOCdoWXpF_kLHaZtHjdJf{cpgklG zv5`gMaCYB2UM5!>C!bn-WO@oC7LD3-{g3+}J4V;KSst=VxD((|Ev++@Han`Lk z+aEXW?0>|fp8^=jVz>@+XxBvv%hI%;vI#h14H3I}(~DbPSTqm-N6e=ICgOG+$LZ=^ zHYayF()0DHW=JKiPpnezO>+i^xo+6-;uAkoB0mJ!U$3W1py#HAm)Iq3D(9ziskQ8{ zx9k7!ZQS+vPfi#JfN@e^nTie7sCiTbTiR{avc_c8q?TI4ILh8KuW&t|n?ADRiRXd) z0QP4}iOTuldrM{wf?Qj?ZdpSqzH|M~t$UXYNLEVT2*`9|m~2^P34Nt?j5i)Os9OUN zi*i3Z?*uyE8#lc8#BSgofPqFT#VF53<#MU`eF9Af0k~;?8fdih#@}z;@#wxK2Lh1o zS5q^>R5Q#naA^s$cz_aNG;GjF-z*44#h+ggrCG?$*YDiASHylh^_8%F45x$K;*(!K zKshBT1}P8tw^B$B@YDowGBLh|(S_JzAN<&!C&xt8*8zr-7>l5s98S?E)j(%%PSHne2O}|qiET05FaOEU9;=*m zAOK0h`zkOVi!gE&2LpFz|4<5@W%1!C#-!F5)_!uw36;ht^6;NN`^dD2d>LRcu^7`# zzf>sZW+aAgp@0SwYdCo1^{g*$*uJg)x&cW=g7|jekP+cf=Crz0L=?x8LzVt5wMN*o z#z0iJcb)J&PPBt;CBFbLWFZzo9G#Y{uZ`NJ65?oLk+wBN0R!2Lh0-=s;?f zBo)_6MMSAr`GzVMP$CRPG1;lhFAtU9^p8s-A1y^EAAf0UQ$+nWz(E7CF({?*ip3+o zQ7WR8B1&MmeRd?Dxw-%DDGIfRAODq&Tf{6tWxSGfWu-5tvTv&)G$K(rL~*5 z%`WMeoN76~487~Emu&~$wgOn2>E6FE={I`7a~pT{U$o?+_wvYW<_1VVT??(DZVl}( zrmVeTIYv~=^{wt*Z@ug(;F9j_jh@LgQvGP-uKwR%mSc$Jl0HS$r&|Cr5G_fGUnwA) zUfi-(6ptQd`X6q1@rfV($^pr)wm(>{Zd}fR)N+5%e%D(syANRFuKsJ5a~yY>ErK%K c#7VgR7cCatd{=o@n*aa+07*qoM6N<$g4{nAa{vGU literal 0 HcmV?d00001 diff --git a/src/static_src/img/leaflet/marker-icon-2x-violet.png b/src/static_src/img/leaflet/marker-icon-2x-violet.png new file mode 100644 index 0000000000000000000000000000000000000000..ea748aa32933206dee2dec724aa8d9724384a41d GIT binary patch literal 4190 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 literal 0 HcmV?d00001 diff --git a/src/static_src/img/leaflet/marker-icon-2x-yellow.png b/src/static_src/img/leaflet/marker-icon-2x-yellow.png new file mode 100644 index 0000000000000000000000000000000000000000..8b677d9390539f7f386176b754ec3bb2791def52 GIT binary patch literal 4159 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 JPDHLkV1j#5>~{bF literal 0 HcmV?d00001 diff --git a/src/static_src/img/leaflet/marker-icon-black.png b/src/static_src/img/leaflet/marker-icon-black.png new file mode 100644 index 0000000000000000000000000000000000000000..d262ae42eef90a127232ef9102438247d6e995d2 GIT binary patch literal 1523 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 literal 0 HcmV?d00001 diff --git a/src/static_src/img/leaflet/marker-icon-gold.png b/src/static_src/img/leaflet/marker-icon-gold.png new file mode 100644 index 0000000000000000000000000000000000000000..162fada6bb5ec9283873074f87c94bed4a183ce4 GIT binary patch literal 1862 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 literal 0 HcmV?d00001 diff --git a/src/static_src/img/leaflet/marker-icon-grey.png b/src/static_src/img/leaflet/marker-icon-grey.png new file mode 100644 index 0000000000000000000000000000000000000000..ebbab8effc42123c5fb5f83344561dcb4af0eabd GIT binary patch literal 1691 zcmV;M24wk(P)P001cn1^@s6z>|W`00006VoOIv0RI60 z0RN!9r;`8x010qNS#tmY3ljhU3ljkVnw%H_000McNliru-3$s2GAD}NWF!Cp1}I5H zK~z}7rB}^w6v-9;RrU9@$AJvk;GMZdLQ8IuBMVL|J`Ul^A%`frL=bTX91B?+O|%kP zP-YKd*_FnSokbxeibx#gA3#BZ!>*N$!i9*hNMLKte9<%AT{YeHk&Ao8c*gdal=KeW z^@f<3f|aHzdcEF`XKvdz zY}-bw)e@~%OKPouQmIsyhd}1%=l214Ix{o#om?)5IF6x|!nlJ{3eWSvImg=CT0|** z|LWDNs{laX()%)>&%2)Iq1)|3N(rs?kYq90EK*8@VF=fCF*!MDN-2Ne-v9udKY#wG zgpiZ__wRQYV?zrVh5_IAkllJbd4WX_`a2j4>1n1&304^umP;zW@Mo@#4jt zl(Jqd7IUU)f^$A_44&t~FbuR>Eksd-BuQYJCMG5(uy^lX06?~}Y`CrqAp~B%dc_UH zD40TsS<^I0E|){6(-}~990yWLynOi*v$L}}cI+6Yrl!zrHu2!W13Y~A5C;w%fNk3Y zo8z2ga&i)eVJIQQtf{r0a~ub0nhpe-QVQF)v9`8`Q>RYhz zA0Y%h&+`C$K(*FK9ml~a5Y9Oc9XbR;$d;*l`0!yQNdijg5QyVA&{`igrIa~B2$WI- z@z7dBDFxSccPzy0m^a%~N}-hUD1d)4#)ftxrG#Z!c=F`QwjfWRK80ZzLnlEg&9d$r zs+79V7)vRo1IB5Z!uNfwuCC(IqemkFUc7jL$B!Q)pU*=GF~k6ju|z5L5305PI*OuX z!?nJoX$m0(_U+q;rKKg@zkk1UCdWEt4&^Bgb=?QxK99}R;zsr;M3QyU%!(#S@qZJbq3&* zTeogChd?$8@Z%_oz&X!&XV+dZ#*|?gzZodZw?8(}D~(2jIgT?j)3%F6yV{p!el=8PjYi|Crw6xR#aJkWF^kefjU2K-DF6#Aq z4B(?$trqSGvQanJk|gQHal9kdyRMtv{ai}<*~oTj)X!?Q8f&e~&1RF?w!LK=LZW`mo(@Gt07u zyve+1x7!TB;`Qs-lU;*s+#6pAA=;z7aa}j_qERZ9Zf)DbZZ}!0)r8ji(wjGLm~Gqr zE1FW8dBL^TmokoeClCO5_Uzdogb?3$yWPGwuIr-H=|D=k`uzFxKke9z@1$_=-aQ3i zAqWC)Sr#nIf@zuvf`Ai37B=SpKM(*Yl}dk+QvNp#L+$%My4|i;N_1J@{DBbSo0~Up{&4IE5_UJ{g%D&n lUW`rUZ_Al8XD;p5=6`+tS@~>Hl+6GD002ovPDHLkV1lF>BccER literal 0 HcmV?d00001 diff --git a/src/static_src/img/leaflet/marker-icon-orange.png b/src/static_src/img/leaflet/marker-icon-orange.png new file mode 100644 index 0000000000000000000000000000000000000000..fbbce7b2ab1e5de921b5f5488960a333ed37d054 GIT binary patch literal 1862 zcmV-M2f6r(P)P001cn1^@s6z>|W`00006VoOIv0RI60 z0RN!9r;`8x010qNS#tmY3ljhU3ljkVnw%H_000McNliru-3tN{D;cm-z$E|x2GdDI zK~z}7rI%}rT~!sw|7-7a?z!ijduKYG>9ougD~4o{4_fFm#t_t)HU^^~-j9O{&6*ZVhgaj*XZKaKfQtWiz@B2KDefHkV54WAp?YwcH z{J-3@*ZS?X*WPR0L(GijjOX{iXSL4IP1>vx4kj7i(9UnXIKCWPS`6~X2j1I5Y(C4N zPcd`15F(b2tBua2wbqw{#vt)CYweGAe(l7oD}p?@io~{E+xCLQSHnUPVHkQ|-iL5< zAR;g`tkO_fgeZzsrCcIr{$|h_Jaqe){;ZdT{C?locQDDLuIs*Y?RDLO>quCwz$R4KyS;pC8MgYnVfC{yVL9qBti{GF4pF9`Yd-fcUipkKAFYLlzmJ6z6Un6$p+ zp39sM%7vJon$*)%lg2VW{*iC}?YTLS-`&5t!$|o?S65eS82Hdp32Y6PJ4i@4ehZ>R zVR&e;PI=jL$Ad2q0)V(O$w>L*La`+u_<5-61gz0u<~ah1d4IP?L)E6>=RFi#S{)Oc zXRi1b0PyVnTR+JpKd^RPyJzAuz_v+3I&fRskSlgT_^XgBcEAnWAe`Ksxh5{7qkXkU zLT*34d+Xf*K)=0jQ;>qj-?qLh$UA^Zt4-VBge|bhV|=QNdc6*<5=h5IP-sDCTLBUV zI;#NMUd@qLM52Mdf#D<%+wLR+w@Pv-Ec#H@F+j|o93oYOzM%nJf6ESRzWoy@uGxV4 z5|E`&L#m)`b_|f~YYW+<(bLn(!7w}l1Iw?;Lh zxGWMbD&+{2Z$;1hK0WV=di&-NA?&;X)0KK7KeOzuQ3wm3PvF~xWo-8Y7p&9fWP1+c zB*mH=w}6NiJi6<8wj(hbCip6uDu9}3?{8N*^`hcC#lkelXT>Zw{)@M z{!KS`3mZ>?O*VTuaKkp#Q^v*N8sa!cOZz(1rpF*17dLbj(Gob&$pkpNnh%mLgufc6 z|2b%o>26|XJax~;S2lFDZs{lpn7G^&Hai6A6dM;aV=0P;jKCHqDq97;_WOj~N8E_oK)T-b(29%z6o}fHRr37ha zYQfH)-^@UI51z^_I$_)LwX^21&_!DsKyzpwaik%{q}6XO^|z^er=LL2QH07vCM^+&+zi1 zkhu_j!}Z8A9_~GOs=Ocs0JO*-sMNHnL<%w&g1}44@d~I!3iW!XjWLg1>vIm|^FKII zA@JAx2IE+`0W3Gl$UdGrmXF@wJHnaBQ{EE@sZ>2W>1KPdW^1GuVLjV8(07*qoM6N<$f@n2+ ANB{r; literal 0 HcmV?d00001 diff --git a/src/static_src/img/leaflet/marker-icon-red.png b/src/static_src/img/leaflet/marker-icon-red.png new file mode 100644 index 0000000000000000000000000000000000000000..3e64e06d1db4eecf0d6e4446630fc4f9b97694b2 GIT binary patch literal 1870 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 A%>V!Z literal 0 HcmV?d00001 diff --git a/src/static_src/img/leaflet/marker-shadow.png b/src/static_src/img/leaflet/marker-shadow.png new file mode 100644 index 0000000000000000000000000000000000000000..84c580847f0b20fa72d328985a08c0c176554a69 GIT binary patch literal 608 zcmV-m0-ybfP)9uxu(PDa20NtOu&LOs@Hz6GMI+Q6g1Z=qj$sxT(UW7u!XkL;lC1Sux{-k zrKG=Ll3X`pmJ#TlL7Pm#g6k<}JL*YPF{=D*Jt9ddf(0rbK-p3Q$jBIdfPIGdCL={p zPZe29%|u7Kq6UF#1O~k@qlzy)@7NJH5b5QZH0w1L>&ZF>IAnU}cyCIWV=(@k>0)}s z#u&vVyO&ex=p?gju}^>lcQj(kJsJ0NpK8Z8sR=XG6xB+HOVoRA8qCQS`s8N(9~4t_ zw-PKkoa*ao^O6^s672eiQj0-B4xiUrcGz&vi|)FMV#poEi8-3nKkDR!>3g5X98WNi zBH}N}lhCgFIR?EBbvrT#<`}O6sF8c@fZ`WtHr_)(%$^a*sAHW3!6o*hm;#OI1-8RB zNTX3GBfsk44PkjCr z@9>IwOYpNAYKBY&%*Z2;ebvG5gr4Fto(cRG^HWGEFqo0PtqHs*^9XnG5HESz!R>^Z uBWCvJ -1) { + var originalInitTile = L.GridLayer.prototype._initTile; + L.GridLayer.include({ + _initTile: function (tile) { + originalInitTile.call(this, tile); + var tileSize = this.getTileSize(); + tile.style.width = tileSize.x + 1 + 'px'; + tile.style.height = tileSize.y + 1 + 'px'; + } + }); + } + + var myAttributionText = '© Styrelsen for Dataforsyning og Effektivisering'; + + // we need a custom crs for the map + var crs = new L.Proj.CRS('EPSG:25832', '+proj=utm +zone=32 +ellps=GRS80 +units=m +no_defs', { + resolutions: [1638.4,819.2,409.6,204.8,102.4,51.2,25.6,12.8,6.4,3.2,1.6,0.8,0.4,0.2], + origin: [120000,6500000], + bounds: L.bounds([120000, 5661139.2],[1378291.2, 6500000]) + }); + + // Make the map object using the custom projection + var map = new L.Map('map', { + crs: crs, + center: [55.3, 9.9], // Set center location + zoom: 9, // Initial zoom level + minzoom: 0, + maxzoom: 13, + }) + + // Define ortophoto layer [WMTS:orto_foraar] + var ortofotowmts = L.tileLayer('/maps/kfproxy/orto_foraar?request=GetTile&version=1.0.0&service=WMTS&Layer=orto_foraar&style=default&format=image/jpeg&TileMatrixSet=View1&TileMatrix={zoom}&TileRow={y}&TileCol={x}', { + minZoom: 0, + maxZoom: 13, + attribution: myAttributionText, + crossOrigin: true, + zoom: function () { + var zoomlevel = map._animateToZoom ? map._animateToZoom : map.getZoom(); + if (zoomlevel < 10) + return 'L0' + zoomlevel; + else + return 'L' + zoomlevel; + } + }).addTo(map); + + // skaermkort layer [WMTS:topo_skaermkort] + var toposkaermkortwmts = L.tileLayer.wms('/maps/kfproxy/topo_skaermkort', { + layers: 'dtk_skaermkort', + format: 'image/png', + attribution: myAttributionText + }); + + // hillshade tile layer [WMTS:dhm] + var dhmwmts = L.tileLayer.wms('/maps/kfproxy/dhm', { + layers: 'dhm_terraen_skyggekort_overdrevet', + format: 'image/png', + attribution: myAttributionText + }); + + // Matrikelskel overlay [WMS:mat] + var matrikel = L.tileLayer.wms('/maps/kfproxy/mat', { + transparent: true, + layers: 'MatrikelSkel,Centroide', + format: 'image/png', + attribution: myAttributionText, + minZoom: 9 + }).addTo(map); // addTo means that the layer is visible by default + + // Hillshade overlay [WMS:dhm] + var hillshade = L.tileLayer.wms('/maps/kfproxy/dhm', { + transparent: true, + layers: 'dhm_terraen_skyggekort_transparent_overdrevet', + format: 'image/png', + attribution: myAttributionText, + }); + + // Define layer groups for layer control + var baseLayers = { + "Ortophoto Map": ortofotowmts, + "Regular Map": toposkaermkortwmts, + "Hillshade Map": dhmwmts + }; + var overlays = { + "Cadastral Map Overlay": matrikel, + "Hillshade Map Overlay": hillshade + }; + + // Add layer control to map + L.control.layers(baseLayers, overlays).addTo(map); + + // Add scale line to map, disable imperial units + L.control.scale({imperial: false}).addTo(map); + + // fire our callback when ready + map.whenReady(MapReadyCallback); +})(); diff --git a/src/static_src/js/leaflet-1.6.0.js b/src/static_src/js/leaflet-1.6.0.js new file mode 100644 index 00000000..13e8b1e0 --- /dev/null +++ b/src/static_src/js/leaflet-1.6.0.js @@ -0,0 +1,5 @@ +/* @preserve + * Leaflet 1.6.0, a JS library for interactive maps. http://leafletjs.com + * (c) 2010-2019 Vladimir Agafonkin, (c) 2010-2011 CloudMade + */ +!function(t,i){"object"==typeof exports&&"undefined"!=typeof module?i(exports):"function"==typeof define&&define.amd?define(["exports"],i):i(t.L={})}(this,function(t){"use strict";var i=Object.freeze;function h(t){var i,e,n,o;for(e=1,n=arguments.length;e=this.min.x&&e.x<=this.max.x&&i.y>=this.min.y&&e.y<=this.max.y},intersects:function(t){t=R(t);var i=this.min,e=this.max,n=t.min,o=t.max,s=o.x>=i.x&&n.x<=e.x,r=o.y>=i.y&&n.y<=e.y;return s&&r},overlaps:function(t){t=R(t);var i=this.min,e=this.max,n=t.min,o=t.max,s=o.x>i.x&&n.xi.y&&n.y=n.lat&&e.lat<=o.lat&&i.lng>=n.lng&&e.lng<=o.lng},intersects:function(t){t=D(t);var i=this._southWest,e=this._northEast,n=t.getSouthWest(),o=t.getNorthEast(),s=o.lat>=i.lat&&n.lat<=e.lat,r=o.lng>=i.lng&&n.lng<=e.lng;return s&&r},overlaps:function(t){t=D(t);var i=this._southWest,e=this._northEast,n=t.getSouthWest(),o=t.getNorthEast(),s=o.lat>i.lat&&n.lati.lng&&n.lng';var i=t.firstChild;return i.style.behavior="url(#default#VML)",i&&"object"==typeof i.adj}catch(t){return!1}}();function Bt(t){return 0<=navigator.userAgent.toLowerCase().indexOf(t)}var At=(Object.freeze||Object)({ie:it,ielt9:et,edge:nt,webkit:ot,android:st,android23:rt,androidStock:ht,opera:ut,chrome:lt,gecko:ct,safari:_t,phantom:dt,opera12:pt,win:mt,ie3d:ft,webkit3d:gt,gecko3d:vt,any3d:yt,mobile:xt,mobileWebkit:wt,mobileWebkit3d:Pt,msPointer:Lt,pointer:bt,touch:Tt,mobileOpera:zt,mobileGecko:Mt,retina:Ct,passiveEvents:St,canvas:Et,svg:Zt,vml:kt}),It=Lt?"MSPointerDown":"pointerdown",Ot=Lt?"MSPointerMove":"pointermove",Rt=Lt?"MSPointerUp":"pointerup",Nt=Lt?"MSPointerCancel":"pointercancel",Dt=["INPUT","SELECT","OPTION"],jt={},Wt=!1,Ht=0;function Ft(t,i,e,n){return"touchstart"===i?function(t,i,e){var n=a(function(t){if("mouse"!==t.pointerType&&t.MSPOINTER_TYPE_MOUSE&&t.pointerType!==t.MSPOINTER_TYPE_MOUSE){if(!(Dt.indexOf(t.target.tagName)<0))return;ji(t)}Gt(t,i)});t["_leaflet_touchstart"+e]=n,t.addEventListener(It,n,!1),Wt||(document.documentElement.addEventListener(It,Ut,!0),document.documentElement.addEventListener(Ot,Vt,!0),document.documentElement.addEventListener(Rt,qt,!0),document.documentElement.addEventListener(Nt,qt,!0),Wt=!0)}(t,e,n):"touchmove"===i?function(t,i,e){function n(t){(t.pointerType!==t.MSPOINTER_TYPE_MOUSE&&"mouse"!==t.pointerType||0!==t.buttons)&&Gt(t,i)}t["_leaflet_touchmove"+e]=n,t.addEventListener(Ot,n,!1)}(t,e,n):"touchend"===i&&function(t,i,e){function n(t){Gt(t,i)}t["_leaflet_touchend"+e]=n,t.addEventListener(Rt,n,!1),t.addEventListener(Nt,n,!1)}(t,e,n),this}function Ut(t){jt[t.pointerId]=t,Ht++}function Vt(t){jt[t.pointerId]&&(jt[t.pointerId]=t)}function qt(t){delete jt[t.pointerId],Ht--}function Gt(t,i){for(var e in t.touches=[],jt)t.touches.push(jt[e]);t.changedTouches=[t],i(t)}var Kt=Lt?"MSPointerDown":bt?"pointerdown":"touchstart",Yt=Lt?"MSPointerUp":bt?"pointerup":"touchend",Xt="_leaflet_";function Jt(t,o,i){var s,r,a=!1;function e(t){var i;if(bt){if(!nt||"mouse"===t.pointerType)return;i=Ht}else i=t.touches.length;if(!(1this.options.maxZoom)?this.setZoom(t):this},panInsideBounds:function(t,i){this._enforcingBounds=!0;var e=this.getCenter(),n=this._limitCenter(e,this._zoom,D(t));return e.equals(n)||this.panTo(n,i),this._enforcingBounds=!1,this},panInside:function(t,i){var e=I((i=i||{}).paddingTopLeft||i.padding||[0,0]),n=I(i.paddingBottomRight||i.padding||[0,0]),o=this.getCenter(),s=this.project(o),r=this.project(t),a=this.getPixelBounds(),h=a.getSize().divideBy(2),u=R([a.min.add(e),a.max.subtract(n)]);if(!u.contains(r)){this._enforcingBounds=!0;var l=s.subtract(r),c=I(r.x+l.x,r.y+l.y);(r.xu.max.x)&&(c.x=s.x-l.x,0u.max.y)&&(c.y=s.y-l.y,0=this.options.transform3DLimit&&this._resetView(this.getCenter(),this.getZoom())},_findEventTargets:function(t,i){for(var e,n=[],o="mouseout"===i||"mouseover"===i,s=t.target||t.srcElement,r=!1;s;){if((e=this._targets[u(s)])&&("click"===i||"preclick"===i)&&!t._simulated&&this._draggableMoved(e)){r=!0;break}if(e&&e.listens(i,!0)){if(o&&!Yi(s,t))break;if(n.push(e),o)break}if(s===this._container)break;s=s.parentNode}return n.length||r||o||!Yi(s,t)||(n=[this]),n},_handleDOMEvent:function(t){if(this._loaded&&!Ki(t)){var i=t.type;"mousedown"!==i&&"keypress"!==i&&"keyup"!==i&&"keydown"!==i||Mi(t.target||t.srcElement),this._fireDOMEvent(t,i)}},_mouseEvents:["click","dblclick","mouseover","mouseout","contextmenu"],_fireDOMEvent:function(t,i,e){if("click"===t.type){var n=h({},t);n.type="preclick",this._fireDOMEvent(n,n.type,e)}if(!t._stopped&&(e=(e||[]).concat(this._findEventTargets(t,i))).length){var o=e[0];"contextmenu"===i&&o.listens(i,!0)&&ji(t);var s={originalEvent:t};if("keypress"!==t.type&&"keydown"!==t.type&&"keyup"!==t.type){var r=o.getLatLng&&(!o._radius||o._radius<=10);s.containerPoint=r?this.latLngToContainerPoint(o.getLatLng()):this.mouseEventToContainerPoint(t),s.layerPoint=this.containerPointToLayerPoint(s.containerPoint),s.latlng=r?o.getLatLng():this.layerPointToLatLng(s.layerPoint)}for(var a=0;athis.options.zoomAnimationThreshold)return!1;var n=this.getZoomScale(i),o=this._getCenterOffset(t)._divideBy(1-1/n);return!(!0!==e.animate&&!this.getSize().contains(o))&&(M(function(){this._moveStart(!0,!1)._animateZoom(t,i,!0)},this),!0)},_animateZoom:function(t,i,e,n){this._mapPane&&(e&&(this._animatingZoom=!0,this._animateToCenter=t,this._animateToZoom=i,mi(this._mapPane,"leaflet-zoom-anim")),this.fire("zoomanim",{center:t,zoom:i,noUpdate:n}),setTimeout(a(this._onZoomTransitionEnd,this),250))},_onZoomTransitionEnd:function(){this._animatingZoom&&(this._mapPane&&fi(this._mapPane,"leaflet-zoom-anim"),this._animatingZoom=!1,this._move(this._animateToCenter,this._animateToZoom),M(function(){this._moveEnd(!0)},this))}});function Qi(t){return new te(t)}var te=E.extend({options:{position:"topright"},initialize:function(t){p(this,t)},getPosition:function(){return this.options.position},setPosition:function(t){var i=this._map;return i&&i.removeControl(this),this.options.position=t,i&&i.addControl(this),this},getContainer:function(){return this._container},addTo:function(t){this.remove(),this._map=t;var i=this._container=this.onAdd(t),e=this.getPosition(),n=t._controlCorners[e];return mi(i,"leaflet-control"),-1!==e.indexOf("bottom")?n.insertBefore(i,n.firstChild):n.appendChild(i),this._map.on("unload",this.remove,this),this},remove:function(){return this._map&&(li(this._container),this.onRemove&&this.onRemove(this._map),this._map.off("unload",this.remove,this),this._map=null),this},_refocusOnMap:function(t){this._map&&t&&0",n=document.createElement("div");return n.innerHTML=e,n.firstChild},_addItem:function(t){var i,e=document.createElement("label"),n=this._map.hasLayer(t.layer);t.overlay?((i=document.createElement("input")).type="checkbox",i.className="leaflet-control-layers-selector",i.defaultChecked=n):i=this._createRadioElement("leaflet-base-layers_"+u(this),n),this._layerControlInputs.push(i),i.layerId=u(t.layer),ki(i,"click",this._onInputClick,this);var o=document.createElement("span");o.innerHTML=" "+t.name;var s=document.createElement("div");return e.appendChild(s),s.appendChild(i),s.appendChild(o),(t.overlay?this._overlaysList:this._baseLayersList).appendChild(e),this._checkDisabledLayers(),e},_onInputClick:function(){var t,i,e=this._layerControlInputs,n=[],o=[];this._handlingClick=!0;for(var s=e.length-1;0<=s;s--)t=e[s],i=this._getLayer(t.layerId).layer,t.checked?n.push(i):t.checked||o.push(i);for(s=0;si.options.maxZoom},_expandIfNotCollapsed:function(){return this._map&&!this.options.collapsed&&this.expand(),this},_expand:function(){return this.expand()},_collapse:function(){return this.collapse()}}),ee=te.extend({options:{position:"topleft",zoomInText:"+",zoomInTitle:"Zoom in",zoomOutText:"−",zoomOutTitle:"Zoom out"},onAdd:function(t){var i="leaflet-control-zoom",e=ui("div",i+" leaflet-bar"),n=this.options;return this._zoomInButton=this._createButton(n.zoomInText,n.zoomInTitle,i+"-in",e,this._zoomIn),this._zoomOutButton=this._createButton(n.zoomOutText,n.zoomOutTitle,i+"-out",e,this._zoomOut),this._updateDisabled(),t.on("zoomend zoomlevelschange",this._updateDisabled,this),e},onRemove:function(t){t.off("zoomend zoomlevelschange",this._updateDisabled,this)},disable:function(){return this._disabled=!0,this._updateDisabled(),this},enable:function(){return this._disabled=!1,this._updateDisabled(),this},_zoomIn:function(t){!this._disabled&&this._map._zoomthis._map.getMinZoom()&&this._map.zoomOut(this._map.options.zoomDelta*(t.shiftKey?3:1))},_createButton:function(t,i,e,n,o){var s=ui("a",e,n);return s.innerHTML=t,s.href="#",s.title=i,s.setAttribute("role","button"),s.setAttribute("aria-label",i),Di(s),ki(s,"click",Wi),ki(s,"click",o,this),ki(s,"click",this._refocusOnMap,this),s},_updateDisabled:function(){var t=this._map,i="leaflet-disabled";fi(this._zoomInButton,i),fi(this._zoomOutButton,i),!this._disabled&&t._zoom!==t.getMinZoom()||mi(this._zoomOutButton,i),!this._disabled&&t._zoom!==t.getMaxZoom()||mi(this._zoomInButton,i)}});$i.mergeOptions({zoomControl:!0}),$i.addInitHook(function(){this.options.zoomControl&&(this.zoomControl=new ee,this.addControl(this.zoomControl))});var ne=te.extend({options:{position:"bottomleft",maxWidth:100,metric:!0,imperial:!0},onAdd:function(t){var i="leaflet-control-scale",e=ui("div",i),n=this.options;return this._addScales(n,i+"-line",e),t.on(n.updateWhenIdle?"moveend":"move",this._update,this),t.whenReady(this._update,this),e},onRemove:function(t){t.off(this.options.updateWhenIdle?"moveend":"move",this._update,this)},_addScales:function(t,i,e){t.metric&&(this._mScale=ui("div",i,e)),t.imperial&&(this._iScale=ui("div",i,e))},_update:function(){var t=this._map,i=t.getSize().y/2,e=t.distance(t.containerPointToLatLng([0,i]),t.containerPointToLatLng([this.options.maxWidth,i]));this._updateScales(e)},_updateScales:function(t){this.options.metric&&t&&this._updateMetric(t),this.options.imperial&&t&&this._updateImperial(t)},_updateMetric:function(t){var i=this._getRoundNum(t),e=i<1e3?i+" m":i/1e3+" km";this._updateScale(this._mScale,e,i/t)},_updateImperial:function(t){var i,e,n,o=3.2808399*t;5280Leaflet'},initialize:function(t){p(this,t),this._attributions={}},onAdd:function(t){for(var i in(t.attributionControl=this)._container=ui("div","leaflet-control-attribution"),Di(this._container),t._layers)t._layers[i].getAttribution&&this.addAttribution(t._layers[i].getAttribution());return this._update(),this._container},setPrefix:function(t){return this.options.prefix=t,this._update(),this},addAttribution:function(t){return t&&(this._attributions[t]||(this._attributions[t]=0),this._attributions[t]++,this._update()),this},removeAttribution:function(t){return t&&this._attributions[t]&&(this._attributions[t]--,this._update()),this},_update:function(){if(this._map){var t=[];for(var i in this._attributions)this._attributions[i]&&t.push(i);var e=[];this.options.prefix&&e.push(this.options.prefix),t.length&&e.push(t.join(", ")),this._container.innerHTML=e.join(" | ")}}});$i.mergeOptions({attributionControl:!0}),$i.addInitHook(function(){this.options.attributionControl&&(new oe).addTo(this)});te.Layers=ie,te.Zoom=ee,te.Scale=ne,te.Attribution=oe,Qi.layers=function(t,i,e){return new ie(t,i,e)},Qi.zoom=function(t){return new ee(t)},Qi.scale=function(t){return new ne(t)},Qi.attribution=function(t){return new oe(t)};var se=E.extend({initialize:function(t){this._map=t},enable:function(){return this._enabled||(this._enabled=!0,this.addHooks()),this},disable:function(){return this._enabled&&(this._enabled=!1,this.removeHooks()),this},enabled:function(){return!!this._enabled}});se.addTo=function(t,i){return t.addHandler(i,this),this};var re,ae={Events:Z},he=Tt?"touchstart mousedown":"mousedown",ue={mousedown:"mouseup",touchstart:"touchend",pointerdown:"touchend",MSPointerDown:"touchend"},le={mousedown:"mousemove",touchstart:"touchmove",pointerdown:"touchmove",MSPointerDown:"touchmove"},ce=k.extend({options:{clickTolerance:3},initialize:function(t,i,e,n){p(this,n),this._element=t,this._dragStartTarget=i||t,this._preventOutline=e},enable:function(){this._enabled||(ki(this._dragStartTarget,he,this._onDown,this),this._enabled=!0)},disable:function(){this._enabled&&(ce._dragging===this&&this.finishDrag(),Ai(this._dragStartTarget,he,this._onDown,this),this._enabled=!1,this._moved=!1)},_onDown:function(t){if(!t._simulated&&this._enabled&&(this._moved=!1,!pi(this._element,"leaflet-zoom-anim")&&!(ce._dragging||t.shiftKey||1!==t.which&&1!==t.button&&!t.touches||((ce._dragging=this)._preventOutline&&Mi(this._element),Ti(),Qt(),this._moving)))){this.fire("down");var i=t.touches?t.touches[0]:t,e=Si(this._element);this._startPoint=new B(i.clientX,i.clientY),this._parentScale=Ei(e),ki(document,le[t.type],this._onMove,this),ki(document,ue[t.type],this._onUp,this)}},_onMove:function(t){if(!t._simulated&&this._enabled)if(t.touches&&1i.max.x&&(e|=2),t.yi.max.y&&(e|=8),e}function ge(t,i,e,n){var o,s=i.x,r=i.y,a=e.x-s,h=e.y-r,u=a*a+h*h;return 0this._layersMaxZoom&&this.setZoom(this._layersMaxZoom),void 0===this.options.minZoom&&this._layersMinZoom&&this.getZoom()t.y!=n.y>t.y&&t.x<(n.x-e.x)*(t.y-e.y)/(n.y-e.y)+e.x&&(u=!u);return u||je.prototype._containsPoint.call(this,t,!0)}});var He=ke.extend({initialize:function(t,i){p(this,i),this._layers={},t&&this.addData(t)},addData:function(t){var i,e,n,o=v(t)?t:t.features;if(o){for(i=0,e=o.length;iu.x&&(l=s.x+n-u.x+h.x),s.x-l-a.x<0&&(l=s.x-a.x),s.y+e+h.y>u.y&&(c=s.y+e-u.y+h.y),s.y-c-a.y<0&&(c=s.y-a.y),(l||c)&&t.fire("autopanstart").panBy([l,c])}},_onCloseButtonClick:function(t){this._close(),Wi(t)},_getAnchor:function(){return I(this._source&&this._source._getPopupAnchor?this._source._getPopupAnchor():[0,0])}});$i.mergeOptions({closePopupOnClick:!0}),$i.include({openPopup:function(t,i,e){return t instanceof sn||(t=new sn(e).setContent(t)),i&&t.setLatLng(i),this.hasLayer(t)?this:(this._popup&&this._popup.options.autoClose&&this.closePopup(),this._popup=t,this.addLayer(t))},closePopup:function(t){return t&&t!==this._popup||(t=this._popup,this._popup=null),t&&this.removeLayer(t),this}}),Ee.include({bindPopup:function(t,i){return t instanceof sn?(p(t,i),(this._popup=t)._source=this):(this._popup&&!i||(this._popup=new sn(i,this)),this._popup.setContent(t)),this._popupHandlersAdded||(this.on({click:this._openPopup,keypress:this._onKeyPress,remove:this.closePopup,move:this._movePopup}),this._popupHandlersAdded=!0),this},unbindPopup:function(){return this._popup&&(this.off({click:this._openPopup,keypress:this._onKeyPress,remove:this.closePopup,move:this._movePopup}),this._popupHandlersAdded=!1,this._popup=null),this},openPopup:function(t,i){return this._popup&&this._map&&(i=this._popup._prepareOpen(this,t,i),this._map.openPopup(this._popup,i)),this},closePopup:function(){return this._popup&&this._popup._close(),this},togglePopup:function(t){return this._popup&&(this._popup._map?this.closePopup():this.openPopup(t)),this},isPopupOpen:function(){return!!this._popup&&this._popup.isOpen()},setPopupContent:function(t){return this._popup&&this._popup.setContent(t),this},getPopup:function(){return this._popup},_openPopup:function(t){var i=t.layer||t.target;this._popup&&this._map&&(Wi(t),i instanceof Re?this.openPopup(t.layer||t.target,t.latlng):this._map.hasLayer(this._popup)&&this._popup._source===i?this.closePopup():this.openPopup(i,t.latlng))},_movePopup:function(t){this._popup.setLatLng(t.latlng)},_onKeyPress:function(t){13===t.originalEvent.keyCode&&this._openPopup(t)}});var rn=on.extend({options:{pane:"tooltipPane",offset:[0,0],direction:"auto",permanent:!1,sticky:!1,interactive:!1,opacity:.9},onAdd:function(t){on.prototype.onAdd.call(this,t),this.setOpacity(this.options.opacity),t.fire("tooltipopen",{tooltip:this}),this._source&&this._source.fire("tooltipopen",{tooltip:this},!0)},onRemove:function(t){on.prototype.onRemove.call(this,t),t.fire("tooltipclose",{tooltip:this}),this._source&&this._source.fire("tooltipclose",{tooltip:this},!0)},getEvents:function(){var t=on.prototype.getEvents.call(this);return Tt&&!this.options.permanent&&(t.preclick=this._close),t},_close:function(){this._map&&this._map.closeTooltip(this)},_initLayout:function(){var t="leaflet-tooltip "+(this.options.className||"")+" leaflet-zoom-"+(this._zoomAnimated?"animated":"hide");this._contentNode=this._container=ui("div",t)},_updateLayout:function(){},_adjustPan:function(){},_setPosition:function(t){var i=this._map,e=this._container,n=i.latLngToContainerPoint(i.getCenter()),o=i.layerPointToContainerPoint(t),s=this.options.direction,r=e.offsetWidth,a=e.offsetHeight,h=I(this.options.offset),u=this._getAnchor();t="top"===s?t.add(I(-r/2+h.x,-a+h.y+u.y,!0)):"bottom"===s?t.subtract(I(r/2-h.x,-h.y,!0)):"center"===s?t.subtract(I(r/2+h.x,a/2-u.y+h.y,!0)):"right"===s||"auto"===s&&o.xthis.options.maxZoom||ethis.options.maxZoom||void 0!==this.options.minZoom&&oe.max.x)||!i.wrapLat&&(t.ye.max.y))return!1}if(!this.options.bounds)return!0;var n=this._tileCoordsToBounds(t);return D(this.options.bounds).overlaps(n)},_keyToBounds:function(t){return this._tileCoordsToBounds(this._keyToTileCoords(t))},_tileCoordsToNwSe:function(t){var i=this._map,e=this.getTileSize(),n=t.scaleBy(e),o=n.add(e);return[i.unproject(n,t.z),i.unproject(o,t.z)]},_tileCoordsToBounds:function(t){var i=this._tileCoordsToNwSe(t),e=new N(i[0],i[1]);return this.options.noWrap||(e=this._map.wrapLatLngBounds(e)),e},_tileCoordsToKey:function(t){return t.x+":"+t.y+":"+t.z},_keyToTileCoords:function(t){var i=t.split(":"),e=new B(+i[0],+i[1]);return e.z=+i[2],e},_removeTile:function(t){var i=this._tiles[t];i&&(li(i.el),delete this._tiles[t],this.fire("tileunload",{tile:i.el,coords:this._keyToTileCoords(t)}))},_initTile:function(t){mi(t,"leaflet-tile");var i=this.getTileSize();t.style.width=i.x+"px",t.style.height=i.y+"px",t.onselectstart=l,t.onmousemove=l,et&&this.options.opacity<1&&yi(t,this.options.opacity),st&&!rt&&(t.style.WebkitBackfaceVisibility="hidden")},_addTile:function(t,i){var e=this._getTilePos(t),n=this._tileCoordsToKey(t),o=this.createTile(this._wrapCoords(t),a(this._tileReady,this,t));this._initTile(o),this.createTile.length<2&&M(a(this._tileReady,this,t,null,o)),Pi(o,e),this._tiles[n]={el:o,coords:t,current:!0},i.appendChild(o),this.fire("tileloadstart",{tile:o,coords:t})},_tileReady:function(t,i,e){i&&this.fire("tileerror",{error:i,tile:e,coords:t});var n=this._tileCoordsToKey(t);(e=this._tiles[n])&&(e.loaded=+new Date,this._map._fadeAnimated?(yi(e.el,0),C(this._fadeFrame),this._fadeFrame=M(this._updateOpacity,this)):(e.active=!0,this._pruneTiles()),i||(mi(e.el,"leaflet-tile-loaded"),this.fire("tileload",{tile:e.el,coords:t})),this._noTilesToLoad()&&(this._loading=!1,this.fire("load"),et||!this._map._fadeAnimated?M(this._pruneTiles,this):setTimeout(a(this._pruneTiles,this),250)))},_getTilePos:function(t){return t.scaleBy(this.getTileSize()).subtract(this._level.origin)},_wrapCoords:function(t){var i=new B(this._wrapX?r(t.x,this._wrapX):t.x,this._wrapY?r(t.y,this._wrapY):t.y);return i.z=t.z,i},_pxBoundsToTileRange:function(t){var i=this.getTileSize();return new O(t.min.unscaleBy(i).floor(),t.max.unscaleBy(i).ceil().subtract([1,1]))},_noTilesToLoad:function(){for(var t in this._tiles)if(!this._tiles[t].loaded)return!1;return!0}});var un=hn.extend({options:{minZoom:0,maxZoom:18,subdomains:"abc",errorTileUrl:"",zoomOffset:0,tms:!1,zoomReverse:!1,detectRetina:!1,crossOrigin:!1},initialize:function(t,i){this._url=t,(i=p(this,i)).detectRetina&&Ct&&0')}}catch(t){return function(t){return document.createElement("<"+t+' xmlns="urn:schemas-microsoft.com:vml" class="lvml">')}}}(),fn={_initContainer:function(){this._container=ui("div","leaflet-vml-container")},_update:function(){this._map._animatingZoom||(_n.prototype._update.call(this),this.fire("update"))},_initPath:function(t){var i=t._container=mn("shape");mi(i,"leaflet-vml-shape "+(this.options.className||"")),i.coordsize="1 1",t._path=mn("path"),i.appendChild(t._path),this._updateStyle(t),this._layers[u(t)]=t},_addPath:function(t){var i=t._container;this._container.appendChild(i),t.options.interactive&&t.addInteractiveTarget(i)},_removePath:function(t){var i=t._container;li(i),t.removeInteractiveTarget(i),delete this._layers[u(t)]},_updateStyle:function(t){var i=t._stroke,e=t._fill,n=t.options,o=t._container;o.stroked=!!n.stroke,o.filled=!!n.fill,n.stroke?(i||(i=t._stroke=mn("stroke")),o.appendChild(i),i.weight=n.weight+"px",i.color=n.color,i.opacity=n.opacity,n.dashArray?i.dashStyle=v(n.dashArray)?n.dashArray.join(" "):n.dashArray.replace(/( *, *)/g," "):i.dashStyle="",i.endcap=n.lineCap.replace("butt","flat"),i.joinstyle=n.lineJoin):i&&(o.removeChild(i),t._stroke=null),n.fill?(e||(e=t._fill=mn("fill")),o.appendChild(e),e.color=n.fillColor||n.color,e.opacity=n.fillOpacity):e&&(o.removeChild(e),t._fill=null)},_updateCircle:function(t){var i=t._point.round(),e=Math.round(t._radius),n=Math.round(t._radiusY||e);this._setPath(t,t._empty()?"M0 0":"AL "+i.x+","+i.y+" "+e+","+n+" 0,23592600")},_setPath:function(t,i){t._path.v=i},_bringToFront:function(t){_i(t._container)},_bringToBack:function(t){di(t._container)}},gn=kt?mn:$,vn=_n.extend({getEvents:function(){var t=_n.prototype.getEvents.call(this);return t.zoomstart=this._onZoomStart,t},_initContainer:function(){this._container=gn("svg"),this._container.setAttribute("pointer-events","none"),this._rootGroup=gn("g"),this._container.appendChild(this._rootGroup)},_destroyContainer:function(){li(this._container),Ai(this._container),delete this._container,delete this._rootGroup,delete this._svgSize},_onZoomStart:function(){this._update()},_update:function(){if(!this._map._animatingZoom||!this._bounds){_n.prototype._update.call(this);var t=this._bounds,i=t.getSize(),e=this._container;this._svgSize&&this._svgSize.equals(i)||(this._svgSize=i,e.setAttribute("width",i.x),e.setAttribute("height",i.y)),Pi(e,t.min),e.setAttribute("viewBox",[t.min.x,t.min.y,i.x,i.y].join(" ")),this.fire("update")}},_initPath:function(t){var i=t._path=gn("path");t.options.className&&mi(i,t.options.className),t.options.interactive&&mi(i,"leaflet-interactive"),this._updateStyle(t),this._layers[u(t)]=t},_addPath:function(t){this._rootGroup||this._initContainer(),this._rootGroup.appendChild(t._path),t.addInteractiveTarget(t._path)},_removePath:function(t){li(t._path),t.removeInteractiveTarget(t._path),delete this._layers[u(t)]},_updatePath:function(t){t._project(),t._update()},_updateStyle:function(t){var i=t._path,e=t.options;i&&(e.stroke?(i.setAttribute("stroke",e.color),i.setAttribute("stroke-opacity",e.opacity),i.setAttribute("stroke-width",e.weight),i.setAttribute("stroke-linecap",e.lineCap),i.setAttribute("stroke-linejoin",e.lineJoin),e.dashArray?i.setAttribute("stroke-dasharray",e.dashArray):i.removeAttribute("stroke-dasharray"),e.dashOffset?i.setAttribute("stroke-dashoffset",e.dashOffset):i.removeAttribute("stroke-dashoffset")):i.setAttribute("stroke","none"),e.fill?(i.setAttribute("fill",e.fillColor||e.color),i.setAttribute("fill-opacity",e.fillOpacity),i.setAttribute("fill-rule",e.fillRule||"evenodd")):i.setAttribute("fill","none"))},_updatePoly:function(t,i){this._setPath(t,Q(t._parts,i))},_updateCircle:function(t){var i=t._point,e=Math.max(Math.round(t._radius),1),n="a"+e+","+(Math.max(Math.round(t._radiusY),1)||e)+" 0 1,0 ",o=t._empty()?"M0 0":"M"+(i.x-e)+","+i.y+n+2*e+",0 "+n+2*-e+",0 ";this._setPath(t,o)},_setPath:function(t,i){t._path.setAttribute("d",i)},_bringToFront:function(t){_i(t._path)},_bringToBack:function(t){di(t._path)}});function yn(t){return Zt||kt?new vn(t):null}kt&&vn.include(fn),$i.include({getRenderer:function(t){var i=t.options.renderer||this._getPaneRenderer(t.options.pane)||this.options.renderer||this._renderer;return i||(i=this._renderer=this._createRenderer()),this.hasLayer(i)||this.addLayer(i),i},_getPaneRenderer:function(t){if("overlayPane"===t||void 0===t)return!1;var i=this._paneRenderers[t];return void 0===i&&(i=this._createRenderer({pane:t}),this._paneRenderers[t]=i),i},_createRenderer:function(t){return this.options.preferCanvas&&pn(t)||yn(t)}});var xn=We.extend({initialize:function(t,i){We.prototype.initialize.call(this,this._boundsToLatLngs(t),i)},setBounds:function(t){return this.setLatLngs(this._boundsToLatLngs(t))},_boundsToLatLngs:function(t){return[(t=D(t)).getSouthWest(),t.getNorthWest(),t.getNorthEast(),t.getSouthEast()]}});vn.create=gn,vn.pointsToPath=Q,He.geometryToLayer=Fe,He.coordsToLatLng=Ve,He.coordsToLatLngs=qe,He.latLngToCoords=Ge,He.latLngsToCoords=Ke,He.getFeature=Ye,He.asFeature=Xe,$i.mergeOptions({boxZoom:!0});var wn=se.extend({initialize:function(t){this._map=t,this._container=t._container,this._pane=t._panes.overlayPane,this._resetStateTimeout=0,t.on("unload",this._destroy,this)},addHooks:function(){ki(this._container,"mousedown",this._onMouseDown,this)},removeHooks:function(){Ai(this._container,"mousedown",this._onMouseDown,this)},moved:function(){return this._moved},_destroy:function(){li(this._pane),delete this._pane},_resetState:function(){this._resetStateTimeout=0,this._moved=!1},_clearDeferredResetState:function(){0!==this._resetStateTimeout&&(clearTimeout(this._resetStateTimeout),this._resetStateTimeout=0)},_onMouseDown:function(t){if(!t.shiftKey||1!==t.which&&1!==t.button)return!1;this._clearDeferredResetState(),this._resetState(),Qt(),Ti(),this._startPoint=this._map.mouseEventToContainerPoint(t),ki(document,{contextmenu:Wi,mousemove:this._onMouseMove,mouseup:this._onMouseUp,keydown:this._onKeyDown},this)},_onMouseMove:function(t){this._moved||(this._moved=!0,this._box=ui("div","leaflet-zoom-box",this._container),mi(this._container,"leaflet-crosshair"),this._map.fire("boxzoomstart")),this._point=this._map.mouseEventToContainerPoint(t);var i=new O(this._point,this._startPoint),e=i.getSize();Pi(this._box,i.min),this._box.style.width=e.x+"px",this._box.style.height=e.y+"px"},_finish:function(){this._moved&&(li(this._box),fi(this._container,"leaflet-crosshair")),ti(),zi(),Ai(document,{contextmenu:Wi,mousemove:this._onMouseMove,mouseup:this._onMouseUp,keydown:this._onKeyDown},this)},_onMouseUp:function(t){if((1===t.which||1===t.button)&&(this._finish(),this._moved)){this._clearDeferredResetState(),this._resetStateTimeout=setTimeout(a(this._resetState,this),0);var i=new N(this._map.containerPointToLatLng(this._startPoint),this._map.containerPointToLatLng(this._point));this._map.fitBounds(i).fire("boxzoomend",{boxZoomBounds:i})}},_onKeyDown:function(t){27===t.keyCode&&this._finish()}});$i.addInitHook("addHandler","boxZoom",wn),$i.mergeOptions({doubleClickZoom:!0});var Pn=se.extend({addHooks:function(){this._map.on("dblclick",this._onDoubleClick,this)},removeHooks:function(){this._map.off("dblclick",this._onDoubleClick,this)},_onDoubleClick:function(t){var i=this._map,e=i.getZoom(),n=i.options.zoomDelta,o=t.originalEvent.shiftKey?e-n:e+n;"center"===i.options.doubleClickZoom?i.setZoom(o):i.setZoomAround(t.containerPoint,o)}});$i.addInitHook("addHandler","doubleClickZoom",Pn),$i.mergeOptions({dragging:!0,inertia:!rt,inertiaDeceleration:3400,inertiaMaxSpeed:1/0,easeLinearity:.2,worldCopyJump:!1,maxBoundsViscosity:0});var Ln=se.extend({addHooks:function(){if(!this._draggable){var t=this._map;this._draggable=new ce(t._mapPane,t._container),this._draggable.on({dragstart:this._onDragStart,drag:this._onDrag,dragend:this._onDragEnd},this),this._draggable.on("predrag",this._onPreDragLimit,this),t.options.worldCopyJump&&(this._draggable.on("predrag",this._onPreDragWrap,this),t.on("zoomend",this._onZoomEnd,this),t.whenReady(this._onZoomEnd,this))}mi(this._map._container,"leaflet-grab leaflet-touch-drag"),this._draggable.enable(),this._positions=[],this._times=[]},removeHooks:function(){fi(this._map._container,"leaflet-grab"),fi(this._map._container,"leaflet-touch-drag"),this._draggable.disable()},moved:function(){return this._draggable&&this._draggable._moved},moving:function(){return this._draggable&&this._draggable._moving},_onDragStart:function(){var t=this._map;if(t._stop(),this._map.options.maxBounds&&this._map.options.maxBoundsViscosity){var i=D(this._map.options.maxBounds);this._offsetLimit=R(this._map.latLngToContainerPoint(i.getNorthWest()).multiplyBy(-1),this._map.latLngToContainerPoint(i.getSouthEast()).multiplyBy(-1).add(this._map.getSize())),this._viscosity=Math.min(1,Math.max(0,this._map.options.maxBoundsViscosity))}else this._offsetLimit=null;t.fire("movestart").fire("dragstart"),t.options.inertia&&(this._positions=[],this._times=[])},_onDrag:function(t){if(this._map.options.inertia){var i=this._lastTime=+new Date,e=this._lastPos=this._draggable._absPos||this._draggable._newPos;this._positions.push(e),this._times.push(i),this._prunePositions(i)}this._map.fire("move",t).fire("drag",t)},_prunePositions:function(t){for(;1i.max.x&&(t.x=this._viscousLimit(t.x,i.max.x)),t.y>i.max.y&&(t.y=this._viscousLimit(t.y,i.max.y)),this._draggable._newPos=this._draggable._startPos.add(t)}},_onPreDragWrap:function(){var t=this._worldWidth,i=Math.round(t/2),e=this._initialWorldOffset,n=this._draggable._newPos.x,o=(n-i+e)%t+i-e,s=(n+i+e)%t-i-e,r=Math.abs(o+e)i.getMaxZoom()&&10?90:-90),t.lat_ts=t.lat1)}function o(t){var s=this;if(2===arguments.length){var i=arguments[1];"string"==typeof i?"+"===i.charAt(0)?o[t]=yt(arguments[1]):o[t]=Ct(arguments[1]):o[t]=i}else if(1===arguments.length){if(Array.isArray(t))return t.map(function(t){Array.isArray(t)?o.apply(s,t):o(t)});if("string"==typeof t){if(t in o)return o[t]}else"EPSG"in t?o["EPSG:"+t.EPSG]=t:"ESRI"in t?o["ESRI:"+t.ESRI]=t:"IAU2000"in t?o["IAU2000:"+t.IAU2000]=t:console.log(t);return}}function l(t){return"string"==typeof t}function M(t){return t in o}function c(t){return Et.some(function(s){return t.indexOf(s)>-1})}function u(s){var i=t(s,"authority");if(i){var a=t(i,"epsg");return a&&Pt.indexOf(a)>-1}}function f(s){var i=t(s,"extension");if(i)return t(i,"proj4")}function m(t){return"+"===t[0]}function p(t){if(!l(t))return t;if(M(t))return o[t];if(c(t)){var s=Ct(t);if(u(s))return o["EPSG:3857"];var i=f(s);return i?yt(i):s}return m(t)?yt(t):void 0}function d(t){return t}function y(t,s){var i=Tt.length;return t.names?(Tt[i]=t,t.names.forEach(function(t){Gt[t.toLowerCase()]=i}),this):(console.log(s),!0)}function _(t,s,i,a){var h=t*t,e=s*s,n=(h-e)/h,r=0;return a?(h=(t*=1-n*(et+n*(nt+n*rt)))*t,n=0):r=Math.sqrt(n),{es:n,e:r,ep2:(h-e)/e}}function x(s,i,a,h,e){if(!s){var n=t(zt,h);n||(n=Lt),s=n.a,i=n.b,a=n.rf}return a&&!i&&(i=(1-1/a)*s),(0===a||Math.abs(s-i)3&&(0===n.datum_params[3]&&0===n.datum_params[4]&&0===n.datum_params[5]&&0===n.datum_params[6]||(n.datum_type=tt,n.datum_params[3]*=at,n.datum_params[4]*=at,n.datum_params[5]*=at,n.datum_params[6]=n.datum_params[6]/1e6+1))),n.a=i,n.b=a,n.es=h,n.ep2=e,n}function Projection(s,i){if(!(this instanceof Projection))return new Projection(s);i=i||function(t){if(t)throw t};var a=p(s);if("object"==typeof a){var h=Projection.projections.get(a.projName);if(h){if(a.datumCode&&"none"!==a.datumCode){var e=t(Dt,a.datumCode);e&&(a.datum_params=e.towgs84?e.towgs84.split(","):null,a.ellps=e.ellipse,a.datumName=e.datumName?e.datumName:a.datumCode)}a.k0=a.k0||1,a.axis=a.axis||"enu",a.ellps=a.ellps||"wgs84";var n=x(a.a,a.b,a.rf,a.ellps,a.sphere),r=_(n.a,n.b,n.rf,a.R_A),o=a.datum||v(a.datumCode,a.datum_params,n.a,n.b,r.es,r.ep2);Nt(this,a),Nt(this,h),this.a=n.a,this.b=n.b,this.rf=n.rf,this.sphere=n.sphere,this.es=r.es,this.e=r.e,this.ep2=r.ep2,this.datum=o,this.init(),i(null,this)}else i(s)}else i(s)}function g(t,s){return t.datum_type===s.datum_type&&(!(t.a!==s.a||Math.abs(t.es-s.es)>5e-11)&&(t.datum_type===$?t.datum_params[0]===s.datum_params[0]&&t.datum_params[1]===s.datum_params[1]&&t.datum_params[2]===s.datum_params[2]:t.datum_type!==tt||t.datum_params[0]===s.datum_params[0]&&t.datum_params[1]===s.datum_params[1]&&t.datum_params[2]===s.datum_params[2]&&t.datum_params[3]===s.datum_params[3]&&t.datum_params[4]===s.datum_params[4]&&t.datum_params[5]===s.datum_params[5]&&t.datum_params[6]===s.datum_params[6]))}function b(t,s,i){var a,h,e,n,r=t.x,o=t.y,l=t.z?t.z:0;if(o<-ht&&o>-1.001*ht)o=-ht;else if(o>ht&&o<1.001*ht)o=ht;else{if(o<-ht)return{x:-1/0,y:-1/0,z:t.z};if(o>ht)return{x:1/0,y:1/0,z:t.z}}return r>Math.PI&&(r-=2*Math.PI),h=Math.sin(o),n=Math.cos(o),e=h*h,a=i/Math.sqrt(1-s*e),{x:(a+l)*n*Math.cos(r),y:(a+l)*n*Math.sin(r),z:(a*(1-s)+l)*h}}function w(t,s,i,a){var h,e,n,r,o,l,M,c,u,f,m,p,d,y,_,x,v=t.x,g=t.y,b=t.z?t.z:0;if(h=Math.sqrt(v*v+g*g),e=Math.sqrt(v*v+g*g+b*b),h/i<1e-12){if(y=0,e/i<1e-12)return _=ht,x=-a,{x:t.x,y:t.y,z:t.z}}else y=Math.atan2(g,v);n=b/e,c=(r=h/e)*(1-s)*(o=1/Math.sqrt(1-s*(2-s)*r*r)),u=n*o,d=0;do{d++,l=s*(M=i/Math.sqrt(1-s*u*u))/(M+(x=h*c+b*u-M*(1-s*u*u))),p=(m=n*(o=1/Math.sqrt(1-l*(2-l)*r*r)))*c-(f=r*(1-l)*o)*u,c=f,u=m}while(p*p>1e-24&&d<30);return _=Math.atan(m/Math.abs(f)),{x:y,y:_,z:x}}function A(t,s,i){if(s===$)return{x:t.x+i[0],y:t.y+i[1],z:t.z+i[2]};if(s===tt){var a=i[0],h=i[1],e=i[2],n=i[3],r=i[4],o=i[5],l=i[6];return{x:l*(t.x-o*t.y+r*t.z)+a,y:l*(o*t.x+t.y-n*t.z)+h,z:l*(-r*t.x+n*t.y+t.z)+e}}}function C(t,s,i){if(s===$)return{x:t.x-i[0],y:t.y-i[1],z:t.z-i[2]};if(s===tt){var a=i[0],h=i[1],e=i[2],n=i[3],r=i[4],o=i[5],l=i[6],M=(t.x-a)/l,c=(t.y-h)/l,u=(t.z-e)/l;return{x:M+o*c-r*u,y:-o*M+c+n*u,z:r*M-n*c+u}}}function E(t){return t===$||t===tt}function P(t){if("function"==typeof Number.isFinite){if(Number.isFinite(t))return;throw new TypeError("coordinates must be finite numbers")}if("number"!=typeof t||t!==t||!isFinite(t))throw new TypeError("coordinates must be finite numbers")}function N(t,s){return(t.datum.datum_type===$||t.datum.datum_type===tt)&&"WGS84"!==s.datumCode||(s.datum.datum_type===$||s.datum.datum_type===tt)&&"WGS84"!==t.datumCode}function S(t,s,i){var a;return Array.isArray(i)&&(i=Ft(i)),Qt(i),t.datum&&s.datum&&N(t,s)&&(i=S(t,a=new Projection("WGS84"),i),t=a),"enu"!==t.axis&&(i=Ut(t,!1,i)),"longlat"===t.projName?i={x:i.x*lt,y:i.y*lt,z:i.z||0}:(t.to_meter&&(i={x:i.x*t.to_meter,y:i.y*t.to_meter,z:i.z||0}),i=t.inverse(i)),t.from_greenwich&&(i.x+=t.from_greenwich),i=Bt(t.datum,s.datum,i),s.from_greenwich&&(i={x:i.x-s.from_greenwich,y:i.y,z:i.z||0}),"longlat"===s.projName?i={x:i.x*Mt,y:i.y*Mt,z:i.z||0}:(i=s.forward(i),s.to_meter&&(i={x:i.x/s.to_meter,y:i.y/s.to_meter,z:i.z||0})),"enu"!==s.axis?Ut(s,!0,i):i}function k(t,s,i){var a,h,e;return Array.isArray(i)?(a=S(t,s,i)||{x:NaN,y:NaN},i.length>2?void 0!==t.name&&"geocent"===t.name||void 0!==s.name&&"geocent"===s.name?"number"==typeof a.z?[a.x,a.y,a.z].concat(i.splice(3)):[a.x,a.y,i[2]].concat(i.splice(3)):[a.x,a.y].concat(i.splice(2)):[a.x,a.y]):(h=S(t,s,i),2===(e=Object.keys(i)).length?h:(e.forEach(function(a){if(void 0!==t.name&&"geocent"===t.name||void 0!==s.name&&"geocent"===s.name){if("x"===a||"y"===a||"z"===a)return}else if("x"===a||"y"===a)return;h[a]=i[a]}),h))}function q(t){return t instanceof Projection?t:t.oProj?t.oProj:Projection(t)}function I(t,s,i){t=q(t);var a,h=!1;return void 0===s?(s=t,t=Wt,h=!0):(void 0!==s.x||Array.isArray(s))&&(i=s,s=t,t=Wt,h=!0),s=q(s),i?k(t,s,i):(a={forward:function(i){return k(t,s,i)},inverse:function(i){return k(s,t,i)}},h&&(a.oProj=s),a)}function O(t,s){return s=s||5,D(j({lat:t[1],lon:t[0]}),s)}function R(t){var s=z(Q(t.toUpperCase()));return s.lat&&s.lon?[s.lon,s.lat]:[(s.left+s.right)/2,(s.top+s.bottom)/2]}function G(t){return t*(Math.PI/180)}function T(t){return t/Math.PI*180}function j(t){var s,i,a,h,e,n,r,o=t.lat,l=t.lon,M=6378137,c=G(o),u=G(l);r=Math.floor((l+180)/6)+1,180===l&&(r=60),o>=56&&o<64&&l>=3&&l<12&&(r=32),o>=72&&o<84&&(l>=0&&l<9?r=31:l>=9&&l<21?r=33:l>=21&&l<33?r=35:l>=33&&l<42&&(r=37)),n=G(6*(r-1)-180+3),s=M/Math.sqrt(1-.00669438*Math.sin(c)*Math.sin(c)),i=Math.tan(c)*Math.tan(c),a=.006739496752268451*Math.cos(c)*Math.cos(c);var f=.9996*s*((h=Math.cos(c)*(u-n))+(1-i+a)*h*h*h/6+(5-18*i+i*i+72*a-.39089081163157013)*h*h*h*h*h/120)+5e5,m=.9996*((e=M*(.9983242984503243*c-.002514607064228144*Math.sin(2*c)+2639046602129982e-21*Math.sin(4*c)-3.418046101696858e-9*Math.sin(6*c)))+s*Math.tan(c)*(h*h/2+(5-i+9*a+4*a*a)*h*h*h*h/24+(61-58*i+i*i+600*a-2.2240339282485886)*h*h*h*h*h*h/720));return o<0&&(m+=1e7),{northing:Math.round(m),easting:Math.round(f),zoneNumber:r,zoneLetter:L(o)}}function z(t){var s=t.northing,i=t.easting,a=t.zoneLetter,h=t.zoneNumber;if(h<0||h>60)return null;var e,n,r,o,l,M,c,u,f=6378137,m=(1-Math.sqrt(.99330562))/(1+Math.sqrt(.99330562)),p=i-5e5,d=s;a<"N"&&(d-=1e7),M=6*(h-1)-180+3,u=(c=d/.9996/6367449.145945056)+(3*m/2-27*m*m*m/32)*Math.sin(2*c)+(21*m*m/16-55*m*m*m*m/32)*Math.sin(4*c)+151*m*m*m/96*Math.sin(6*c),e=f/Math.sqrt(1-.00669438*Math.sin(u)*Math.sin(u)),n=Math.tan(u)*Math.tan(u),r=.006739496752268451*Math.cos(u)*Math.cos(u),o=.99330562*f/Math.pow(1-.00669438*Math.sin(u)*Math.sin(u),1.5),l=p/(.9996*e);var y=u-e*Math.tan(u)/o*(l*l/2-(5+3*n+10*r-4*r*r-.06065547077041606)*l*l*l*l/24+(61+90*n+298*r+45*n*n-1.6983531815716497-3*r*r)*l*l*l*l*l*l/720);y=T(y);var _=(l-(1+2*n+r)*l*l*l/6+(5-2*r+28*n-3*r*r+.05391597401814761+24*n*n)*l*l*l*l*l/120)/Math.cos(u);_=M+T(_);var x;if(t.accuracy){var v=z({northing:t.northing+t.accuracy,easting:t.easting+t.accuracy,zoneLetter:t.zoneLetter,zoneNumber:t.zoneNumber});x={top:v.lat,right:v.lon,bottom:y,left:_}}else x={lat:y,lon:_};return x}function L(t){var s="Z";return 84>=t&&t>=72?s="X":72>t&&t>=64?s="W":64>t&&t>=56?s="V":56>t&&t>=48?s="U":48>t&&t>=40?s="T":40>t&&t>=32?s="S":32>t&&t>=24?s="R":24>t&&t>=16?s="Q":16>t&&t>=8?s="P":8>t&&t>=0?s="N":0>t&&t>=-8?s="M":-8>t&&t>=-16?s="L":-16>t&&t>=-24?s="K":-24>t&&t>=-32?s="J":-32>t&&t>=-40?s="H":-40>t&&t>=-48?s="G":-48>t&&t>=-56?s="F":-56>t&&t>=-64?s="E":-64>t&&t>=-72?s="D":-72>t&&t>=-80&&(s="C"),s}function D(t,s){var i="00000"+t.easting,a="00000"+t.northing;return t.zoneNumber+t.zoneLetter+B(t.easting,t.northing,t.zoneNumber)+i.substr(i.length-5,s)+a.substr(a.length-5,s)}function B(t,s,i){var a=U(i);return F(Math.floor(t/1e5),Math.floor(s/1e5)%20,a)}function U(t){var s=t%Ht;return 0===s&&(s=Ht),s}function F(t,s,i){var a=i-1,h=Kt.charCodeAt(a),e=Xt.charCodeAt(a),n=h+t-1,r=e+s,o=!1;return n>$t&&(n=n-$t+Jt-1,o=!0),(n===Vt||hVt||(n>Vt||hZt||(n>Zt||h$t&&(n=n-$t+Jt-1),r>Yt?(r=r-Yt+Jt-1,o=!0):o=!1,(r===Vt||eVt||(r>Vt||eZt||(r>Zt||eYt&&(r=r-Yt+Jt-1),String.fromCharCode(n)+String.fromCharCode(r)}function Q(t){if(t&&0===t.length)throw"MGRSPoint coverting from nothing";for(var s,i=t.length,a=null,h="",e=0;!/[A-Z]/.test(s=t.charAt(e));){if(e>=2)throw"MGRSPoint bad conversion from: "+t;h+=s,e++}var n=parseInt(h,10);if(0===e||e+3>i)throw"MGRSPoint bad conversion from: "+t;var r=t.charAt(e++);if(r<="A"||"B"===r||"Y"===r||r>="Z"||"I"===r||"O"===r)throw"MGRSPoint zone letter "+r+" not handled: "+t;a=t.substring(e,e+=2);for(var o=U(n),l=W(a.charAt(0),o),M=H(a.charAt(1),o);M0&&(u=1e5/Math.pow(10,y),f=t.substring(e,e+y),_=parseFloat(f)*u,m=t.substring(e+y),x=parseFloat(m)*u),p=_+l,d=x+M,{easting:p,northing:d,zoneLetter:r,zoneNumber:n,accuracy:u}}function W(t,s){for(var i=Kt.charCodeAt(s-1),a=1e5,h=!1;i!==t.charCodeAt(0);){if(++i===Vt&&i++,i===Zt&&i++,i>$t){if(h)throw"Bad character: "+t;i=Jt,h=!0}a+=1e5}return a}function H(t,s){if(t>"V")throw"MGRSPoint given invalid Northing "+t;for(var i=Xt.charCodeAt(s-1),a=0,h=!1;i!==t.charCodeAt(0);){if(++i===Vt&&i++,i===Zt&&i++,i>Yt){if(h)throw"Bad character: "+t;i=Jt,h=!0}a+=1e5}return a}function K(t){var s;switch(t){case"C":s=11e5;break;case"D":s=2e6;break;case"E":s=28e5;break;case"F":s=37e5;break;case"G":s=46e5;break;case"H":s=55e5;break;case"J":s=64e5;break;case"K":s=73e5;break;case"L":s=82e5;break;case"M":s=91e5;break;case"N":s=0;break;case"P":s=8e5;break;case"Q":s=17e5;break;case"R":s=26e5;break;case"S":s=35e5;break;case"T":s=44e5;break;case"U":s=53e5;break;case"V":s=62e5;break;case"W":s=7e6;break;case"X":s=79e5;break;default:s=-1}if(s>=0)return s;throw"Invalid zone letter: "+t}function Point(t,s,i){if(!(this instanceof Point))return new Point(t,s,i);if(Array.isArray(t))this.x=t[0],this.y=t[1],this.z=t[2]||0;else if("object"==typeof t)this.x=t.x,this.y=t.y,this.z=t.z||0;else if("string"==typeof t&&void 0===s){var a=t.split(",");this.x=parseFloat(a[0],10),this.y=parseFloat(a[1],10),this.z=parseFloat(a[2],10)||0}else this.x=t,this.y=s,this.z=i||0;console.warn("proj4.Point will be removed in version 3, use proj4.toPoint")}function X(t){var s,i=[];return i[0]=t*Ts,s=t*t,i[0]+=s*js,i[1]=s*Ls,s*=t,i[0]+=s*zs,i[1]+=s*Ds,i[2]=s*Bs,i}function J(t,s){var i=t+t;return t+s[0]*Math.sin(i)+s[1]*Math.sin(i+i)+s[2]*Math.sin(i+i+i)}function V(t,s,i,a){var h;return tct&&h<=ht+ct?(a.value=ri.AREA_1,h-=ht):h>ht+ct||h<=-(ht+ct)?(a.value=ri.AREA_2,h=h>=0?h-ft:h+ft):(a.value=ri.AREA_3,h+=ht)),h}function Z(t,s){var i=t+s;return i<-ft?i+=ut:i>+ft&&(i-=ut),i}function Y(t,s,i,a){for(var h=s;a;--a){var e=t(h);if(h-=e,Math.abs(e)=this.text.length)return;t=this.text[this.place++]}switch(this.state){case _t:return this.neutral(t);case 2:return this.keyword(t);case 4:return this.quoted(t);case 5:return this.afterquote(t);case 3:return this.number(t);case-1:return}},s.prototype.afterquote=function(t){if('"'===t)return this.word+='"',void(this.state=4);if(bt.test(t))return this.word=this.word.trim(),void this.afterItem(t);throw new Error("havn't handled \""+t+'" in afterquote yet, index '+this.place)},s.prototype.afterItem=function(t){return","===t?(null!==this.word&&this.currentObject.push(this.word),this.word=null,void(this.state=_t)):"]"===t?(this.level--,null!==this.word&&(this.currentObject.push(this.word),this.word=null),this.state=_t,this.currentObject=this.stack.pop(),void(this.currentObject||(this.state=-1))):void 0},s.prototype.number=function(t){if(!wt.test(t)){if(bt.test(t))return this.word=parseFloat(this.word),void this.afterItem(t);throw new Error("havn't handled \""+t+'" in number yet, index '+this.place)}this.word+=t},s.prototype.quoted=function(t){'"'!==t?this.word+=t:this.state=5},s.prototype.keyword=function(t){if(gt.test(t))this.word+=t;else{if("["===t){var s=[];return s.push(this.word),this.level++,null===this.root?this.root=s:this.currentObject.push(s),this.stack.push(this.currentObject),this.currentObject=s,void(this.state=_t)}if(!bt.test(t))throw new Error("havn't handled \""+t+'" in keyword yet, index '+this.place);this.afterItem(t)}},s.prototype.neutral=function(t){if(vt.test(t))return this.word=t,void(this.state=2);if('"'===t)return this.word="",void(this.state=4);if(wt.test(t))return this.word=t,void(this.state=3);{if(!bt.test(t))throw new Error("havn't handled \""+t+'" in neutral yet, index '+this.place);this.afterItem(t)}},s.prototype.output=function(){for(;this.place90&&i*Mt<-90&&s*Mt>180&&s*Mt<-180)return null;var a,h;if(Math.abs(Math.abs(i)-ht)<=ot)return null;if(this.sphere)a=this.x0+this.a*this.k0*qt(s-this.long0),h=this.y0+this.a*this.k0*Math.log(Math.tan(ct+.5*i));else{var e=Math.sin(i),n=It(this.e,i,e);a=this.x0+this.a*this.k0*qt(s-this.long0),h=this.y0-this.a*this.k0*Math.log(n)}return t.x=a,t.y=h,t},inverse:function(t){var s,i,a=t.x-this.x0,h=t.y-this.y0;if(this.sphere)i=ht-2*Math.atan(Math.exp(-h/(this.a*this.k0)));else{var e=Math.exp(-h/(this.a*this.k0));if(-9999===(i=Ot(this.e,e)))return null}return s=qt(this.long0+a/(this.a*this.k0)),t.x=s,t.y=i,t},names:["Mercator","Popular Visualisation Pseudo Mercator","Mercator_1SP","Mercator_Auxiliary_Sphere","merc"]},{init:function(){},forward:d,inverse:d,names:["longlat","identity"]}],Gt={},Tt=[],jt={start:function(){Rt.forEach(y)},add:y,get:function(t){if(!t)return!1;var s=t.toLowerCase();return void 0!==Gt[s]&&Tt[Gt[s]]?Tt[Gt[s]]:void 0}},zt={};zt.MERIT={a:6378137,rf:298.257,ellipseName:"MERIT 1983"},zt.SGS85={a:6378136,rf:298.257,ellipseName:"Soviet Geodetic System 85"},zt.GRS80={a:6378137,rf:298.257222101,ellipseName:"GRS 1980(IUGG, 1980)"},zt.IAU76={a:6378140,rf:298.257,ellipseName:"IAU 1976"},zt.airy={a:6377563.396,b:6356256.91,ellipseName:"Airy 1830"},zt.APL4={a:6378137,rf:298.25,ellipseName:"Appl. Physics. 1965"},zt.NWL9D={a:6378145,rf:298.25,ellipseName:"Naval Weapons Lab., 1965"},zt.mod_airy={a:6377340.189,b:6356034.446,ellipseName:"Modified Airy"},zt.andrae={a:6377104.43,rf:300,ellipseName:"Andrae 1876 (Den., Iclnd.)"},zt.aust_SA={a:6378160,rf:298.25,ellipseName:"Australian Natl & S. Amer. 1969"},zt.GRS67={a:6378160,rf:298.247167427,ellipseName:"GRS 67(IUGG 1967)"},zt.bessel={a:6377397.155,rf:299.1528128,ellipseName:"Bessel 1841"},zt.bess_nam={a:6377483.865,rf:299.1528128,ellipseName:"Bessel 1841 (Namibia)"},zt.clrk66={a:6378206.4,b:6356583.8,ellipseName:"Clarke 1866"},zt.clrk80={a:6378249.145,rf:293.4663,ellipseName:"Clarke 1880 mod."},zt.clrk58={a:6378293.645208759,rf:294.2606763692654,ellipseName:"Clarke 1858"},zt.CPM={a:6375738.7,rf:334.29,ellipseName:"Comm. des Poids et Mesures 1799"},zt.delmbr={a:6376428,rf:311.5,ellipseName:"Delambre 1810 (Belgium)"},zt.engelis={a:6378136.05,rf:298.2566,ellipseName:"Engelis 1985"},zt.evrst30={a:6377276.345,rf:300.8017,ellipseName:"Everest 1830"},zt.evrst48={a:6377304.063,rf:300.8017,ellipseName:"Everest 1948"},zt.evrst56={a:6377301.243,rf:300.8017,ellipseName:"Everest 1956"},zt.evrst69={a:6377295.664,rf:300.8017,ellipseName:"Everest 1969"},zt.evrstSS={a:6377298.556,rf:300.8017,ellipseName:"Everest (Sabah & Sarawak)"},zt.fschr60={a:6378166,rf:298.3,ellipseName:"Fischer (Mercury Datum) 1960"},zt.fschr60m={a:6378155,rf:298.3,ellipseName:"Fischer 1960"},zt.fschr68={a:6378150,rf:298.3,ellipseName:"Fischer 1968"},zt.helmert={a:6378200,rf:298.3,ellipseName:"Helmert 1906"},zt.hough={a:6378270,rf:297,ellipseName:"Hough"},zt.intl={a:6378388,rf:297,ellipseName:"International 1909 (Hayford)"},zt.kaula={a:6378163,rf:298.24,ellipseName:"Kaula 1961"},zt.lerch={a:6378139,rf:298.257,ellipseName:"Lerch 1979"},zt.mprts={a:6397300,rf:191,ellipseName:"Maupertius 1738"},zt.new_intl={a:6378157.5,b:6356772.2,ellipseName:"New International 1967"},zt.plessis={a:6376523,rf:6355863,ellipseName:"Plessis 1817 (France)"},zt.krass={a:6378245,rf:298.3,ellipseName:"Krassovsky, 1942"},zt.SEasia={a:6378155,b:6356773.3205,ellipseName:"Southeast Asia"},zt.walbeck={a:6376896,b:6355834.8467,ellipseName:"Walbeck"},zt.WGS60={a:6378165,rf:298.3,ellipseName:"WGS 60"},zt.WGS66={a:6378145,rf:298.25,ellipseName:"WGS 66"},zt.WGS7={a:6378135,rf:298.26,ellipseName:"WGS 72"};var Lt=zt.WGS84={a:6378137,rf:298.257223563,ellipseName:"WGS 84"};zt.sphere={a:6370997,b:6370997,ellipseName:"Normal Sphere (r=6370997)"};var Dt={};Dt.wgs84={towgs84:"0,0,0",ellipse:"WGS84",datumName:"WGS84"},Dt.ch1903={towgs84:"674.374,15.056,405.346",ellipse:"bessel",datumName:"swiss"},Dt.ggrs87={towgs84:"-199.87,74.79,246.62",ellipse:"GRS80",datumName:"Greek_Geodetic_Reference_System_1987"},Dt.nad83={towgs84:"0,0,0",ellipse:"GRS80",datumName:"North_American_Datum_1983"},Dt.nad27={nadgrids:"@conus,@alaska,@ntv2_0.gsb,@ntv1_can.dat",ellipse:"clrk66",datumName:"North_American_Datum_1927"},Dt.potsdam={towgs84:"606.0,23.0,413.0",ellipse:"bessel",datumName:"Potsdam Rauenberg 1950 DHDN"},Dt.carthage={towgs84:"-263.0,6.0,431.0",ellipse:"clark80",datumName:"Carthage 1934 Tunisia"},Dt.hermannskogel={towgs84:"653.0,-212.0,449.0",ellipse:"bessel",datumName:"Hermannskogel"},Dt.osni52={towgs84:"482.530,-130.596,564.557,-1.042,-0.214,-0.631,8.15",ellipse:"airy",datumName:"Irish National"},Dt.ire65={towgs84:"482.530,-130.596,564.557,-1.042,-0.214,-0.631,8.15",ellipse:"mod_airy",datumName:"Ireland 1965"},Dt.rassadiran={towgs84:"-133.63,-157.5,-158.62",ellipse:"intl",datumName:"Rassadiran"},Dt.nzgd49={towgs84:"59.47,-5.04,187.44,0.47,-0.1,1.024,-4.5993",ellipse:"intl",datumName:"New Zealand Geodetic Datum 1949"},Dt.osgb36={towgs84:"446.448,-125.157,542.060,0.1502,0.2470,0.8421,-20.4894",ellipse:"airy",datumName:"Airy 1830"},Dt.s_jtsk={towgs84:"589,76,480",ellipse:"bessel",datumName:"S-JTSK (Ferro)"},Dt.beduaram={towgs84:"-106,-87,188",ellipse:"clrk80",datumName:"Beduaram"},Dt.gunung_segara={towgs84:"-403,684,41",ellipse:"bessel",datumName:"Gunung Segara Jakarta"},Dt.rnb72={towgs84:"106.869,-52.2978,103.724,-0.33657,0.456955,-1.84218,1",ellipse:"intl",datumName:"Reseau National Belge 1972"},Projection.projections=jt,Projection.projections.start();var Bt=function(t,s,i){return g(t,s)?i:t.datum_type===it||s.datum_type===it?i:t.es!==s.es||t.a!==s.a||E(t.datum_type)||E(s.datum_type)?(i=b(i,t.es,t.a),E(t.datum_type)&&(i=A(i,t.datum_type,t.datum_params)),E(s.datum_type)&&(i=C(i,s.datum_type,s.datum_params)),w(i,s.es,s.a,s.b)):i},Ut=function(t,s,i){var a,h,e,n=i.x,r=i.y,o=i.z||0,l={};for(e=0;e<3;e++)if(!s||2!==e||void 0!==i.z)switch(0===e?(a=n,h="x"):1===e?(a=r,h="y"):(a=o,h="z"),t.axis[e]){case"e":l[h]=a;break;case"w":l[h]=-a;break;case"n":l[h]=a;break;case"s":l[h]=-a;break;case"u":void 0!==i[h]&&(l.z=a);break;case"d":void 0!==i[h]&&(l.z=-a);break;default:return null}return l},Ft=function(t){var s={x:t[0],y:t[1]};return t.length>2&&(s.z=t[2]),t.length>3&&(s.m=t[3]),s},Qt=function(t){P(t.x),P(t.y)},Wt=Projection("WGS84"),Ht=6,Kt="AJSAJS",Xt="AFAFAF",Jt=65,Vt=73,Zt=79,Yt=86,$t=90,ts={forward:O,inverse:function(t){var s=z(Q(t.toUpperCase()));return s.lat&&s.lon?[s.lon,s.lat,s.lon,s.lat]:[s.left,s.bottom,s.right,s.top]},toPoint:R};Point.fromMGRS=function(t){return new Point(R(t))},Point.prototype.toMGRS=function(t){return O([this.x,this.y],t)};var ss=.01068115234375,is=function(t){var s=[];s[0]=1-t*(.25+t*(.046875+t*(.01953125+t*ss))),s[1]=t*(.75-t*(.046875+t*(.01953125+t*ss)));var i=t*t;return s[2]=i*(.46875-t*(.013020833333333334+.007120768229166667*t)),i*=t,s[3]=i*(.3645833333333333-.005696614583333333*t),s[4]=i*t*.3076171875,s},as=function(t,s,i,a){return i*=s,s*=s,a[0]*t-i*(a[1]+s*(a[2]+s*(a[3]+s*a[4])))},hs=function(t,s,i){for(var a=1/(1-s),h=t,e=20;e;--e){var n=Math.sin(h),r=1-s*n*n;if(r=(as(h,n,Math.cos(h),i)-t)*(r*Math.sqrt(r))*a,h-=r,Math.abs(r)ot?Math.tan(e):0,m=Math.pow(f,2),p=Math.pow(m,2);s=1-this.es*Math.pow(r,2),l/=Math.sqrt(s);var d=as(e,r,o,this.en);i=this.a*(this.k0*l*(1+M/6*(1-m+c+M/20*(5-18*m+p+14*c-58*m*c+M/42*(61+179*p-p*m-479*m)))))+this.x0,a=this.a*(this.k0*(d-this.ml0+r*n*l/2*(1+M/12*(5-m+9*c+4*u+M/30*(61+p-58*m+270*c-330*m*c+M/56*(1385+543*p-p*m-3111*m))))))+this.y0}else{var y=o*Math.sin(n);if(Math.abs(Math.abs(y)-1)=1){if(y-1>ot)return 93;a=0}else a=Math.acos(a);e<0&&(a=-a),a=this.a*this.k0*(a-this.lat0)+this.y0}return t.x=i,t.y=a,t},inverse:function(t){var s,i,a,h,e=(t.x-this.x0)*(1/this.a),n=(t.y-this.y0)*(1/this.a);if(this.es)if(s=this.ml0+n/this.k0,i=hs(s,this.es,this.en),Math.abs(i)ot?Math.tan(i):0,M=this.ep2*Math.pow(o,2),c=Math.pow(M,2),u=Math.pow(l,2),f=Math.pow(u,2);s=1-this.es*Math.pow(r,2);var m=e*Math.sqrt(s)/this.k0,p=Math.pow(m,2);a=i-(s*=l)*p/(1-this.es)*.5*(1-p/12*(5+3*u-9*M*u+M-4*c-p/30*(61+90*u-252*M*u+45*f+46*M-p/56*(1385+3633*u+4095*f+1574*f*u)))),h=qt(this.long0+m*(1-p/6*(1+2*u+M-p/20*(5+28*u+24*f+8*M*u+6*M-p/42*(61+662*u+1320*f+720*f*u))))/o)}else a=ht*kt(n),h=0;else{var d=Math.exp(e/this.k0),y=.5*(d-1/d),_=this.lat0+n/this.k0,x=Math.cos(_);s=Math.sqrt((1-Math.pow(x,2))/(1+Math.pow(y,2))),a=Math.asin(s),n<0&&(a=-a),h=0===y&&0===x?0:qt(Math.atan2(y,x)+this.long0)}return t.x=h,t.y=a,t},names:["Transverse_Mercator","Transverse Mercator","tmerc"]},ns=function(t){var s=Math.exp(t);return s=(s-1/s)/2},rs=function(t,s){t=Math.abs(t),s=Math.abs(s);var i=Math.max(t,s),a=Math.min(t,s)/(i||1);return i*Math.sqrt(1+Math.pow(a,2))},os=function(t){var s=1+t,i=s-1;return 0===i?t:t*Math.log(s)/i},ls=function(t){var s=Math.abs(t);return s=os(s*(1+s/(rs(1,s)+1))),t<0?-s:s},Ms=function(t,s){for(var i,a=2*Math.cos(2*s),h=t.length-1,e=t[h],n=0;--h>=0;)i=a*e-n+t[h],n=e,e=i;return s+i*Math.sin(2*s)},cs=function(t,s){for(var i,a=2*Math.cos(s),h=t.length-1,e=t[h],n=0;--h>=0;)i=a*e-n+t[h],n=e,e=i;return Math.sin(s)*i},us=function(t){var s=Math.exp(t);return s=(s+1/s)/2},fs=function(t,s,i){for(var a,h,e=Math.sin(s),n=Math.cos(s),r=ns(i),o=us(i),l=2*n*o,M=-2*e*r,c=t.length-1,u=t[c],f=0,m=0,p=0;--c>=0;)a=m,h=f,u=l*(m=u)-a-M*(f=p)+t[c],p=M*m-h+l*f;return l=e*o,M=n*r,[l*u-M*p,l*p+M*u]},ms={init:function(){if(void 0===this.es||this.es<=0)throw new Error("incorrect elliptical usage");this.x0=void 0!==this.x0?this.x0:0,this.y0=void 0!==this.y0?this.y0:0,this.long0=void 0!==this.long0?this.long0:0,this.lat0=void 0!==this.lat0?this.lat0:0,this.cgb=[],this.cbg=[],this.utg=[],this.gtu=[];var t=this.es/(1+Math.sqrt(1-this.es)),s=t/(2-t),i=s;this.cgb[0]=s*(2+s*(-2/3+s*(s*(116/45+s*(26/45+s*(-2854/675)))-2))),this.cbg[0]=s*(s*(2/3+s*(4/3+s*(-82/45+s*(32/45+s*(4642/4725)))))-2),i*=s,this.cgb[1]=i*(7/3+s*(s*(-227/45+s*(2704/315+s*(2323/945)))-1.6)),this.cbg[1]=i*(5/3+s*(-16/15+s*(-13/9+s*(904/315+s*(-1522/945))))),i*=s,this.cgb[2]=i*(56/15+s*(-136/35+s*(-1262/105+s*(73814/2835)))),this.cbg[2]=i*(-26/15+s*(34/21+s*(1.6+s*(-12686/2835)))),i*=s,this.cgb[3]=i*(4279/630+s*(-332/35+s*(-399572/14175))),this.cbg[3]=i*(1237/630+s*(s*(-24832/14175)-2.4)),i*=s,this.cgb[4]=i*(4174/315+s*(-144838/6237)),this.cbg[4]=i*(-734/315+s*(109598/31185)),i*=s,this.cgb[5]=i*(601676/22275),this.cbg[5]=i*(444337/155925),i=Math.pow(s,2),this.Qn=this.k0/(1+s)*(1+i*(.25+i*(1/64+i/256))),this.utg[0]=s*(s*(2/3+s*(-37/96+s*(1/360+s*(81/512+s*(-96199/604800)))))-.5),this.gtu[0]=s*(.5+s*(-2/3+s*(5/16+s*(41/180+s*(-127/288+s*(7891/37800)))))),this.utg[1]=i*(-1/48+s*(-1/15+s*(437/1440+s*(-46/105+s*(1118711/3870720))))),this.gtu[1]=i*(13/48+s*(s*(557/1440+s*(281/630+s*(-1983433/1935360)))-.6)),i*=s,this.utg[2]=i*(-17/480+s*(37/840+s*(209/4480+s*(-5569/90720)))),this.gtu[2]=i*(61/240+s*(-103/140+s*(15061/26880+s*(167603/181440)))),i*=s,this.utg[3]=i*(-4397/161280+s*(11/504+s*(830251/7257600))),this.gtu[3]=i*(49561/161280+s*(-179/168+s*(6601661/7257600))),i*=s,this.utg[4]=i*(-4583/161280+s*(108847/3991680)),this.gtu[4]=i*(34729/80640+s*(-3418889/1995840)),i*=s,this.utg[5]=-.03233083094085698*i,this.gtu[5]=.6650675310896665*i;var a=Ms(this.cbg,this.lat0);this.Zb=-this.Qn*(a+cs(this.gtu,2*a))},forward:function(t){var s=qt(t.x-this.long0),i=t.y;i=Ms(this.cbg,i);var a=Math.sin(i),h=Math.cos(i),e=Math.sin(s),n=Math.cos(s);i=Math.atan2(a,n*h),s=Math.atan2(e*h,rs(a,h*n)),s=ls(Math.tan(s));var r=fs(this.gtu,2*i,2*s);i+=r[0],s+=r[1];var o,l;return Math.abs(s)<=2.623395162778?(o=this.a*(this.Qn*s)+this.x0,l=this.a*(this.Qn*i+this.Zb)+this.y0):(o=1/0,l=1/0),t.x=o,t.y=l,t},inverse:function(t){var s=(t.x-this.x0)*(1/this.a),i=(t.y-this.y0)*(1/this.a);i=(i-this.Zb)/this.Qn,s/=this.Qn;var a,h;if(Math.abs(s)<=2.623395162778){var e=fs(this.utg,2*i,2*s);i+=e[0],s+=e[1],s=Math.atan(ns(s));var n=Math.sin(i),r=Math.cos(i),o=Math.sin(s),l=Math.cos(s);i=Math.atan2(n*l,rs(o,l*r)),s=Math.atan2(o,l*r),a=qt(s+this.long0),h=Ms(this.cgb,i)}else a=1/0,h=1/0;return t.x=a,t.y=h,t},names:["Extended_Transverse_Mercator","Extended Transverse Mercator","etmerc"]},ps=function(t,s){if(void 0===t){if((t=Math.floor(30*(qt(s)+Math.PI)/Math.PI)+1)<0)return 0;if(t>60)return 60}return t},ds={init:function(){var t=ps(this.zone,this.long0);if(void 0===t)throw new Error("unknown utm zone");this.lat0=0,this.long0=(6*Math.abs(t)-183)*lt,this.x0=5e5,this.y0=this.utmSouth?1e7:0,this.k0=.9996,ms.init.apply(this),this.forward=ms.forward,this.inverse=ms.inverse},names:["Universal Transverse Mercator System","utm"],dependsOn:"etmerc"},ys=function(t,s){return Math.pow((1-t)/(1+t),s)},_s=20,xs={init:function(){var t=Math.sin(this.lat0),s=Math.cos(this.lat0);s*=s,this.rc=Math.sqrt(1-this.es)/(1-this.es*t*t),this.C=Math.sqrt(1+this.es*s*s/(1-this.es)),this.phic0=Math.asin(t/this.C),this.ratexp=.5*this.C*this.e,this.K=Math.tan(.5*this.phic0+ct)/(Math.pow(Math.tan(.5*this.lat0+ct),this.C)*ys(this.e*t,this.ratexp))},forward:function(t){var s=t.x,i=t.y;return t.y=2*Math.atan(this.K*Math.pow(Math.tan(.5*i+ct),this.C)*ys(this.e*Math.sin(i),this.ratexp))-ht,t.x=this.C*s,t},inverse:function(t){for(var s=t.x/this.C,i=t.y,a=Math.pow(Math.tan(.5*i+ct)/this.K,1/this.C),h=_s;h>0&&(i=2*Math.atan(a*ys(this.e*Math.sin(t.y),-.5*this.e))-ht,!(Math.abs(i-t.y)<1e-14));--h)t.y=i;return h?(t.x=s,t.y=i,t):null},names:["gauss"]},vs={init:function(){xs.init.apply(this),this.rc&&(this.sinc0=Math.sin(this.phic0),this.cosc0=Math.cos(this.phic0),this.R2=2*this.rc,this.title||(this.title="Oblique Stereographic Alternative"))},forward:function(t){var s,i,a,h;return t.x=qt(t.x-this.long0),xs.forward.apply(this,[t]),s=Math.sin(t.y),i=Math.cos(t.y),a=Math.cos(t.x),h=this.k0*this.R2/(1+this.sinc0*s+this.cosc0*i*a),t.x=h*i*Math.sin(t.x),t.y=h*(this.cosc0*s-this.sinc0*i*a),t.x=this.a*t.x+this.x0,t.y=this.a*t.y+this.y0,t},inverse:function(t){var s,i,a,h,e;if(t.x=(t.x-this.x0)/this.a,t.y=(t.y-this.y0)/this.a,t.x/=this.k0,t.y/=this.k0,e=Math.sqrt(t.x*t.x+t.y*t.y)){var n=2*Math.atan2(e,this.R2);s=Math.sin(n),i=Math.cos(n),h=Math.asin(i*this.sinc0+t.y*s*this.cosc0/e),a=Math.atan2(t.x*s,e*this.cosc0*i-t.y*this.sinc0*s)}else h=this.phic0,a=0;return t.x=a,t.y=h,xs.inverse.apply(this,[t]),t.x=qt(t.x+this.long0),t},names:["Stereographic_North_Pole","Oblique_Stereographic","Polar_Stereographic","sterea","Oblique Stereographic Alternative","Double_Stereographic"]},gs={init:function(){this.coslat0=Math.cos(this.lat0),this.sinlat0=Math.sin(this.lat0),this.sphere?1===this.k0&&!isNaN(this.lat_ts)&&Math.abs(this.coslat0)<=ot&&(this.k0=.5*(1+kt(this.lat0)*Math.sin(this.lat_ts))):(Math.abs(this.coslat0)<=ot&&(this.lat0>0?this.con=1:this.con=-1),this.cons=Math.sqrt(Math.pow(1+this.e,1+this.e)*Math.pow(1-this.e,1-this.e)),1===this.k0&&!isNaN(this.lat_ts)&&Math.abs(this.coslat0)<=ot&&(this.k0=.5*this.cons*St(this.e,Math.sin(this.lat_ts),Math.cos(this.lat_ts))/It(this.e,this.con*this.lat_ts,this.con*Math.sin(this.lat_ts))),this.ms1=St(this.e,this.sinlat0,this.coslat0),this.X0=2*Math.atan(this.ssfn_(this.lat0,this.sinlat0,this.e))-ht,this.cosX0=Math.cos(this.X0),this.sinX0=Math.sin(this.X0))},forward:function(t){var s,i,a,h,e,n,r=t.x,o=t.y,l=Math.sin(o),M=Math.cos(o),c=qt(r-this.long0);return Math.abs(Math.abs(r-this.long0)-Math.PI)<=ot&&Math.abs(o+this.lat0)<=ot?(t.x=NaN,t.y=NaN,t):this.sphere?(s=2*this.k0/(1+this.sinlat0*l+this.coslat0*M*Math.cos(c)),t.x=this.a*s*M*Math.sin(c)+this.x0,t.y=this.a*s*(this.coslat0*l-this.sinlat0*M*Math.cos(c))+this.y0,t):(i=2*Math.atan(this.ssfn_(o,l,this.e))-ht,h=Math.cos(i),a=Math.sin(i),Math.abs(this.coslat0)<=ot?(e=It(this.e,o*this.con,this.con*l),n=2*this.a*this.k0*e/this.cons,t.x=this.x0+n*Math.sin(r-this.long0),t.y=this.y0-this.con*n*Math.cos(r-this.long0),t):(Math.abs(this.sinlat0)0?this.long0+Math.atan2(t.x,-1*t.y):this.long0+Math.atan2(t.x,t.y):this.long0+Math.atan2(t.x*Math.sin(r),n*this.coslat0*Math.cos(r)-t.y*this.sinlat0*Math.sin(r))),t.x=s,t.y=i,t)}if(Math.abs(this.coslat0)<=ot){if(n<=ot)return i=this.lat0,s=this.long0,t.x=s,t.y=i,t;t.x*=this.con,t.y*=this.con,a=n*this.cons/(2*this.a*this.k0),i=this.con*Ot(this.e,a),s=this.con*qt(this.con*this.long0+Math.atan2(t.x,-1*t.y))}else h=2*Math.atan(n*this.cosX0/(2*this.a*this.k0*this.ms1)),s=this.long0,n<=ot?e=this.X0:(e=Math.asin(Math.cos(h)*this.sinX0+t.y*Math.sin(h)*this.cosX0/n),s=qt(this.long0+Math.atan2(t.x*Math.sin(h),n*this.cosX0*Math.cos(h)-t.y*this.sinX0*Math.sin(h)))),i=-1*Ot(this.e,Math.tan(.5*(ht+e)));return t.x=s,t.y=i,t},names:["stere","Stereographic_South_Pole","Polar Stereographic (variant B)"],ssfn_:function(t,s,i){return s*=i,Math.tan(.5*(ht+t))*Math.pow((1-s)/(1+s),.5*i)}},bs={init:function(){var t=this.lat0;this.lambda0=this.long0;var s=Math.sin(t),i=this.a,a=1/this.rf,h=2*a-Math.pow(a,2),e=this.e=Math.sqrt(h);this.R=this.k0*i*Math.sqrt(1-h)/(1-h*Math.pow(s,2)),this.alpha=Math.sqrt(1+h/(1-h)*Math.pow(Math.cos(t),4)),this.b0=Math.asin(s/this.alpha);var n=Math.log(Math.tan(Math.PI/4+this.b0/2)),r=Math.log(Math.tan(Math.PI/4+t/2)),o=Math.log((1+e*s)/(1-e*s));this.K=n-this.alpha*r+this.alpha*e/2*o},forward:function(t){var s=Math.log(Math.tan(Math.PI/4-t.y/2)),i=this.e/2*Math.log((1+this.e*Math.sin(t.y))/(1-this.e*Math.sin(t.y))),a=-this.alpha*(s+i)+this.K,h=2*(Math.atan(Math.exp(a))-Math.PI/4),e=this.alpha*(t.x-this.lambda0),n=Math.atan(Math.sin(e)/(Math.sin(this.b0)*Math.tan(h)+Math.cos(this.b0)*Math.cos(e))),r=Math.asin(Math.cos(this.b0)*Math.sin(h)-Math.sin(this.b0)*Math.cos(h)*Math.cos(e));return t.y=this.R/2*Math.log((1+Math.sin(r))/(1-Math.sin(r)))+this.y0,t.x=this.R*n+this.x0,t},inverse:function(t){for(var s=t.x-this.x0,i=t.y-this.y0,a=s/this.R,h=2*(Math.atan(Math.exp(i/this.R))-Math.PI/4),e=Math.asin(Math.cos(this.b0)*Math.sin(h)+Math.sin(this.b0)*Math.cos(h)*Math.cos(a)),n=Math.atan(Math.sin(a)/(Math.cos(this.b0)*Math.cos(a)-Math.sin(this.b0)*Math.tan(h))),r=this.lambda0+n/this.alpha,o=0,l=e,M=-1e3,c=0;Math.abs(l-M)>1e-7;){if(++c>20)return;o=1/this.alpha*(Math.log(Math.tan(Math.PI/4+e/2))-this.K)+this.e*Math.log(Math.tan(Math.PI/4+Math.asin(this.e*Math.sin(l))/2)),M=l,l=2*Math.atan(Math.exp(o))-Math.PI/2}return t.x=r,t.y=l,t},names:["somerc"]},ws={init:function(){this.no_off=this.no_off||!1,this.no_rot=this.no_rot||!1,isNaN(this.k0)&&(this.k0=1);var t=Math.sin(this.lat0),s=Math.cos(this.lat0),i=this.e*t;this.bl=Math.sqrt(1+this.es/(1-this.es)*Math.pow(s,4)),this.al=this.a*this.bl*this.k0*Math.sqrt(1-this.es)/(1-i*i);var a=It(this.e,this.lat0,t),h=this.bl/s*Math.sqrt((1-this.es)/(1-i*i));h*h<1&&(h=1);var e,n;if(isNaN(this.longc)){var r=It(this.e,this.lat1,Math.sin(this.lat1)),o=It(this.e,this.lat2,Math.sin(this.lat2));this.lat0>=0?this.el=(h+Math.sqrt(h*h-1))*Math.pow(a,this.bl):this.el=(h-Math.sqrt(h*h-1))*Math.pow(a,this.bl);var l=Math.pow(r,this.bl),M=Math.pow(o,this.bl);n=.5*((e=this.el/l)-1/e);var c=(this.el*this.el-M*l)/(this.el*this.el+M*l),u=(M-l)/(M+l),f=qt(this.long1-this.long2);this.long0=.5*(this.long1+this.long2)-Math.atan(c*Math.tan(.5*this.bl*f)/u)/this.bl,this.long0=qt(this.long0);var m=qt(this.long1-this.long0);this.gamma0=Math.atan(Math.sin(this.bl*m)/n),this.alpha=Math.asin(h*Math.sin(this.gamma0))}else e=this.lat0>=0?h+Math.sqrt(h*h-1):h-Math.sqrt(h*h-1),this.el=e*Math.pow(a,this.bl),n=.5*(e-1/e),this.gamma0=Math.asin(Math.sin(this.alpha)/h),this.long0=this.longc-Math.asin(n*Math.tan(this.gamma0))/this.bl;this.no_off?this.uc=0:this.lat0>=0?this.uc=this.al/this.bl*Math.atan2(Math.sqrt(h*h-1),Math.cos(this.alpha)):this.uc=-1*this.al/this.bl*Math.atan2(Math.sqrt(h*h-1),Math.cos(this.alpha))},forward:function(t){var s,i,a,h=t.x,e=t.y,n=qt(h-this.long0);if(Math.abs(Math.abs(e)-ht)<=ot)a=e>0?-1:1,i=this.al/this.bl*Math.log(Math.tan(ct+a*this.gamma0*.5)),s=-1*a*ht*this.al/this.bl;else{var r=It(this.e,e,Math.sin(e)),o=this.el/Math.pow(r,this.bl),l=.5*(o-1/o),M=.5*(o+1/o),c=Math.sin(this.bl*n),u=(l*Math.sin(this.gamma0)-c*Math.cos(this.gamma0))/M;i=Math.abs(Math.abs(u)-1)<=ot?Number.POSITIVE_INFINITY:.5*this.al*Math.log((1-u)/(1+u))/this.bl,s=Math.abs(Math.cos(this.bl*n))<=ot?this.al*this.bl*n:this.al*Math.atan2(l*Math.cos(this.gamma0)+c*Math.sin(this.gamma0),Math.cos(this.bl*n))/this.bl}return this.no_rot?(t.x=this.x0+s,t.y=this.y0+i):(s-=this.uc,t.x=this.x0+i*Math.cos(this.alpha)+s*Math.sin(this.alpha),t.y=this.y0+s*Math.cos(this.alpha)-i*Math.sin(this.alpha)),t},inverse:function(t){var s,i;this.no_rot?(i=t.y-this.y0,s=t.x-this.x0):(i=(t.x-this.x0)*Math.cos(this.alpha)-(t.y-this.y0)*Math.sin(this.alpha),s=(t.y-this.y0)*Math.cos(this.alpha)+(t.x-this.x0)*Math.sin(this.alpha),s+=this.uc);var a=Math.exp(-1*this.bl*i/this.al),h=.5*(a-1/a),e=.5*(a+1/a),n=Math.sin(this.bl*s/this.al),r=(n*Math.cos(this.gamma0)+h*Math.sin(this.gamma0))/e,o=Math.pow(this.el/Math.sqrt((1+r)/(1-r)),1/this.bl);return Math.abs(r-1)ot?this.ns=Math.log(a/r)/Math.log(h/o):this.ns=s,isNaN(this.ns)&&(this.ns=s),this.f0=a/(this.ns*Math.pow(h,this.ns)),this.rh=this.a*this.f0*Math.pow(l,this.ns),this.title||(this.title="Lambert Conformal Conic")}},forward:function(t){var s=t.x,i=t.y;Math.abs(2*Math.abs(i)-Math.PI)<=ot&&(i=kt(i)*(ht-2*ot));var a,h,e=Math.abs(Math.abs(i)-ht);if(e>ot)a=It(this.e,i,Math.sin(i)),h=this.a*this.f0*Math.pow(a,this.ns);else{if((e=i*this.ns)<=0)return null;h=0}var n=this.ns*qt(s-this.long0);return t.x=this.k0*(h*Math.sin(n))+this.x0,t.y=this.k0*(this.rh-h*Math.cos(n))+this.y0,t},inverse:function(t){var s,i,a,h,e,n=(t.x-this.x0)/this.k0,r=this.rh-(t.y-this.y0)/this.k0;this.ns>0?(s=Math.sqrt(n*n+r*r),i=1):(s=-Math.sqrt(n*n+r*r),i=-1);var o=0;if(0!==s&&(o=Math.atan2(i*n,i*r)),0!==s||this.ns>0){if(i=1/this.ns,a=Math.pow(s/(this.a*this.f0),i),-9999===(h=Ot(this.e,a)))return null}else h=-ht;return e=qt(o/this.ns+this.long0),t.x=e,t.y=h,t},names:["Lambert Tangential Conformal Conic Projection","Lambert_Conformal_Conic","Lambert_Conformal_Conic_2SP","lcc"]},Cs={init:function(){this.a=6377397.155,this.es=.006674372230614,this.e=Math.sqrt(this.es),this.lat0||(this.lat0=.863937979737193),this.long0||(this.long0=.4334234309119251),this.k0||(this.k0=.9999),this.s45=.785398163397448,this.s90=2*this.s45,this.fi0=this.lat0,this.e2=this.es,this.e=Math.sqrt(this.e2),this.alfa=Math.sqrt(1+this.e2*Math.pow(Math.cos(this.fi0),4)/(1-this.e2)),this.uq=1.04216856380474,this.u0=Math.asin(Math.sin(this.fi0)/this.alfa),this.g=Math.pow((1+this.e*Math.sin(this.fi0))/(1-this.e*Math.sin(this.fi0)),this.alfa*this.e/2),this.k=Math.tan(this.u0/2+this.s45)/Math.pow(Math.tan(this.fi0/2+this.s45),this.alfa)*this.g,this.k1=this.k0,this.n0=this.a*Math.sqrt(1-this.e2)/(1-this.e2*Math.pow(Math.sin(this.fi0),2)),this.s0=1.37008346281555,this.n=Math.sin(this.s0),this.ro0=this.k1*this.n0/Math.tan(this.s0),this.ad=this.s90-this.uq},forward:function(t){var s,i,a,h,e,n,r,o=t.x,l=t.y,M=qt(o-this.long0);return s=Math.pow((1+this.e*Math.sin(l))/(1-this.e*Math.sin(l)),this.alfa*this.e/2),i=2*(Math.atan(this.k*Math.pow(Math.tan(l/2+this.s45),this.alfa)/s)-this.s45),a=-M*this.alfa,h=Math.asin(Math.cos(this.ad)*Math.sin(i)+Math.sin(this.ad)*Math.cos(i)*Math.cos(a)),e=Math.asin(Math.cos(i)*Math.sin(a)/Math.cos(h)),n=this.n*e,r=this.ro0*Math.pow(Math.tan(this.s0/2+this.s45),this.n)/Math.pow(Math.tan(h/2+this.s45),this.n),t.y=r*Math.cos(n)/1,t.x=r*Math.sin(n)/1,this.czech||(t.y*=-1,t.x*=-1),t},inverse:function(t){var s,i,a,h,e,n,r,o=t.x;t.x=t.y,t.y=o,this.czech||(t.y*=-1,t.x*=-1),e=Math.sqrt(t.x*t.x+t.y*t.y),h=Math.atan2(t.y,t.x)/Math.sin(this.s0),a=2*(Math.atan(Math.pow(this.ro0/e,1/this.n)*Math.tan(this.s0/2+this.s45))-this.s45),s=Math.asin(Math.cos(this.ad)*Math.sin(a)-Math.sin(this.ad)*Math.cos(a)*Math.cos(h)),i=Math.asin(Math.cos(a)*Math.sin(h)/Math.cos(s)),t.x=this.long0-i/this.alfa,n=s,r=0;var l=0;do{t.y=2*(Math.atan(Math.pow(this.k,-1/this.alfa)*Math.pow(Math.tan(s/2+this.s45),1/this.alfa)*Math.pow((1+this.e*Math.sin(n))/(1-this.e*Math.sin(n)),this.e/2))-this.s45),Math.abs(n-t.y)<1e-10&&(r=1),n=t.y,l+=1}while(0===r&&l<15);return l>=15?null:t},names:["Krovak","krovak"]},Es=function(t,s,i,a,h){return t*h-s*Math.sin(2*h)+i*Math.sin(4*h)-a*Math.sin(6*h)},Ps=function(t){return 1-.25*t*(1+t/16*(3+1.25*t))},Ns=function(t){return.375*t*(1+.25*t*(1+.46875*t))},Ss=function(t){return.05859375*t*t*(1+.75*t)},ks=function(t){return t*t*t*(35/3072)},qs=function(t,s,i){var a=s*i;return t/Math.sqrt(1-a*a)},Is=function(t){return Math.abs(t)1e-7?(i=t*s,(1-t*t)*(s/(1-i*i)-.5/t*Math.log((1-i)/(1+i)))):2*s},Ts=.3333333333333333,js=.17222222222222222,zs=.10257936507936508,Ls=.06388888888888888,Ds=.0664021164021164,Bs=.016415012942191543,Us={init:function(){var t=Math.abs(this.lat0);if(Math.abs(t-ht)0){var s;switch(this.qp=Gs(this.e,1),this.mmf=.5/(1-this.es),this.apa=X(this.es),this.mode){case this.N_POLE:case this.S_POLE:this.dd=1;break;case this.EQUIT:this.rq=Math.sqrt(.5*this.qp),this.dd=1/this.rq,this.xmf=1,this.ymf=.5*this.qp;break;case this.OBLIQ:this.rq=Math.sqrt(.5*this.qp),s=Math.sin(this.lat0),this.sinb1=Gs(this.e,s)/this.qp,this.cosb1=Math.sqrt(1-this.sinb1*this.sinb1),this.dd=Math.cos(this.lat0)/(Math.sqrt(1-this.es*s*s)*this.rq*this.cosb1),this.ymf=(this.xmf=this.rq)/this.dd,this.xmf*=this.dd}}else this.mode===this.OBLIQ&&(this.sinph0=Math.sin(this.lat0),this.cosph0=Math.cos(this.lat0))},forward:function(t){var s,i,a,h,e,n,r,o,l,M,c=t.x,u=t.y;if(c=qt(c-this.long0),this.sphere){if(e=Math.sin(u),M=Math.cos(u),a=Math.cos(c),this.mode===this.OBLIQ||this.mode===this.EQUIT){if((i=this.mode===this.EQUIT?1+M*a:1+this.sinph0*e+this.cosph0*M*a)<=ot)return null;s=(i=Math.sqrt(2/i))*M*Math.sin(c),i*=this.mode===this.EQUIT?e:this.cosph0*e-this.sinph0*M*a}else if(this.mode===this.N_POLE||this.mode===this.S_POLE){if(this.mode===this.N_POLE&&(a=-a),Math.abs(u+this.phi0)=0?(s=(l=Math.sqrt(n))*h,i=a*(this.mode===this.S_POLE?l:-l)):s=i=0}}return t.x=this.a*s+this.x0,t.y=this.a*i+this.y0,t},inverse:function(t){t.x-=this.x0,t.y-=this.y0;var s,i,a,h,e,n,r,o=t.x/this.a,l=t.y/this.a;if(this.sphere){var M,c=0,u=0;if(M=Math.sqrt(o*o+l*l),(i=.5*M)>1)return null;switch(i=2*Math.asin(i),this.mode!==this.OBLIQ&&this.mode!==this.EQUIT||(u=Math.sin(i),c=Math.cos(i)),this.mode){case this.EQUIT:i=Math.abs(M)<=ot?0:Math.asin(l*u/M),o*=u,l=c*M;break;case this.OBLIQ:i=Math.abs(M)<=ot?this.phi0:Math.asin(c*this.sinph0+l*u*this.cosph0/M),o*=u*this.cosph0,l=(c-Math.sin(i)*this.sinph0)*M;break;case this.N_POLE:l=-l,i=ht-i;break;case this.S_POLE:i-=ht}s=0!==l||this.mode!==this.EQUIT&&this.mode!==this.OBLIQ?Math.atan2(o,l):0}else{if(r=0,this.mode===this.OBLIQ||this.mode===this.EQUIT){if(o/=this.dd,l*=this.dd,(n=Math.sqrt(o*o+l*l))1&&(t=t>1?1:-1),Math.asin(t)},Qs={init:function(){Math.abs(this.lat1+this.lat2)ot?this.ns0=(this.ms1*this.ms1-this.ms2*this.ms2)/(this.qs2-this.qs1):this.ns0=this.con,this.c=this.ms1*this.ms1+this.ns0*this.qs1,this.rh=this.a*Math.sqrt(this.c-this.ns0*this.qs0)/this.ns0)},forward:function(t){var s=t.x,i=t.y;this.sin_phi=Math.sin(i),this.cos_phi=Math.cos(i);var a=Gs(this.e3,this.sin_phi,this.cos_phi),h=this.a*Math.sqrt(this.c-this.ns0*a)/this.ns0,e=this.ns0*qt(s-this.long0),n=h*Math.sin(e)+this.x0,r=this.rh-h*Math.cos(e)+this.y0;return t.x=n,t.y=r,t},inverse:function(t){var s,i,a,h,e,n;return t.x-=this.x0,t.y=this.rh-t.y+this.y0,this.ns0>=0?(s=Math.sqrt(t.x*t.x+t.y*t.y),a=1):(s=-Math.sqrt(t.x*t.x+t.y*t.y),a=-1),h=0,0!==s&&(h=Math.atan2(a*t.x,a*t.y)),a=s*this.ns0/this.a,this.sphere?n=Math.asin((this.c-a*a)/(2*this.ns0)):(i=(this.c-a*a)/this.ns0,n=this.phi1z(this.e3,i)),e=qt(h/this.ns0+this.long0),t.x=e,t.y=n,t},names:["Albers_Conic_Equal_Area","Albers","aea"],phi1z:function(t,s){var i,a,h,e,n,r=Fs(.5*s);if(t0||Math.abs(e)<=ot?(n=this.x0+1*this.a*i*Math.sin(a)/e,r=this.y0+1*this.a*(this.cos_p14*s-this.sin_p14*i*h)/e):(n=this.x0+this.infinity_dist*i*Math.sin(a),r=this.y0+this.infinity_dist*(this.cos_p14*s-this.sin_p14*i*h)),t.x=n,t.y=r,t},inverse:function(t){var s,i,a,h,e,n;return t.x=(t.x-this.x0)/this.a,t.y=(t.y-this.y0)/this.a,t.x/=this.k0,t.y/=this.k0,(s=Math.sqrt(t.x*t.x+t.y*t.y))?(h=Math.atan2(s,this.rc),i=Math.sin(h),a=Math.cos(h),n=Fs(a*this.sin_p14+t.y*i*this.cos_p14/s),e=Math.atan2(t.x*i,s*this.cos_p14*a-t.y*this.sin_p14*i),e=qt(this.long0+e)):(n=this.phic0,e=0),t.x=e,t.y=n,t},names:["gnom"]},Hs=function(t,s){var i=1-(1-t*t)/(2*t)*Math.log((1-t)/(1+t));if(Math.abs(Math.abs(s)-i)<1e-6)return s<0?-1*ht:ht;for(var a,h,e,n,r=Math.asin(.5*s),o=0;o<30;o++)if(h=Math.sin(r),e=Math.cos(r),n=t*h,a=Math.pow(1-n*n,2)/(2*e)*(s/(1-t*t)-h/(1-n*n)+.5/t*Math.log((1-n)/(1+n))),r+=a,Math.abs(a)<=1e-10)return r;return NaN},Ks={init:function(){this.sphere||(this.k0=St(this.e,Math.sin(this.lat_ts),Math.cos(this.lat_ts)))},forward:function(t){var s,i,a=t.x,h=t.y,e=qt(a-this.long0);if(this.sphere)s=this.x0+this.a*e*Math.cos(this.lat_ts),i=this.y0+this.a*Math.sin(h)/Math.cos(this.lat_ts);else{var n=Gs(this.e,Math.sin(h));s=this.x0+this.a*this.k0*e,i=this.y0+this.a*n*.5/this.k0}return t.x=s,t.y=i,t},inverse:function(t){t.x-=this.x0,t.y-=this.y0;var s,i;return this.sphere?(s=qt(this.long0+t.x/this.a/Math.cos(this.lat_ts)),i=Math.asin(t.y/this.a*Math.cos(this.lat_ts))):(i=Hs(this.e,2*t.y*this.k0/this.a),s=qt(this.long0+t.x/(this.a*this.k0))),t.x=s,t.y=i,t},names:["cea"]},Xs={init:function(){this.x0=this.x0||0,this.y0=this.y0||0,this.lat0=this.lat0||0,this.long0=this.long0||0,this.lat_ts=this.lat_ts||0,this.title=this.title||"Equidistant Cylindrical (Plate Carre)",this.rc=Math.cos(this.lat_ts)},forward:function(t){var s=t.x,i=t.y,a=qt(s-this.long0),h=Is(i-this.lat0);return t.x=this.x0+this.a*a*this.rc,t.y=this.y0+this.a*h,t},inverse:function(t){var s=t.x,i=t.y;return t.x=qt(this.long0+(s-this.x0)/(this.a*this.rc)),t.y=Is(this.lat0+(i-this.y0)/this.a),t},names:["Equirectangular","Equidistant_Cylindrical","eqc"]},Js=20,Vs={init:function(){this.temp=this.b/this.a,this.es=1-Math.pow(this.temp,2),this.e=Math.sqrt(this.es),this.e0=Ps(this.es),this.e1=Ns(this.es),this.e2=Ss(this.es),this.e3=ks(this.es),this.ml0=this.a*Es(this.e0,this.e1,this.e2,this.e3,this.lat0)},forward:function(t){var s,i,a,h=t.x,e=t.y,n=qt(h-this.long0);if(a=n*Math.sin(e),this.sphere)Math.abs(e)<=ot?(s=this.a*n,i=-1*this.a*this.lat0):(s=this.a*Math.sin(a)/Math.tan(e),i=this.a*(Is(e-this.lat0)+(1-Math.cos(a))/Math.tan(e)));else if(Math.abs(e)<=ot)s=this.a*n,i=-1*this.ml0;else{var r=qs(this.a,this.e,Math.sin(e))/Math.tan(e);s=r*Math.sin(a),i=this.a*Es(this.e0,this.e1,this.e2,this.e3,e)-this.ml0+r*(1-Math.cos(a))}return t.x=s+this.x0,t.y=i+this.y0,t},inverse:function(t){var s,i,a,h,e,n,r,o,l;if(a=t.x-this.x0,h=t.y-this.y0,this.sphere)if(Math.abs(h+this.a*this.lat0)<=ot)s=qt(a/this.a+this.long0),i=0;else{n=this.lat0+h/this.a,r=a*a/this.a/this.a+n*n,o=n;var M;for(e=Js;e;--e)if(M=Math.tan(o),l=-1*(n*(o*M+1)-o-.5*(o*o+r)*M)/((o-n)/M-1),o+=l,Math.abs(l)<=ot){i=o;break}s=qt(this.long0+Math.asin(a*Math.tan(o)/this.a)/Math.sin(i))}else if(Math.abs(h+this.ml0)<=ot)i=0,s=qt(this.long0+a/this.a);else{n=(this.ml0+h)/this.a,r=a*a/this.a/this.a+n*n,o=n;var c,u,f,m,p;for(e=Js;e;--e)if(p=this.e*Math.sin(o),c=Math.sqrt(1-p*p)*Math.tan(o),u=this.a*Es(this.e0,this.e1,this.e2,this.e3,o),f=this.e0-2*this.e1*Math.cos(2*o)+4*this.e2*Math.cos(4*o)-6*this.e3*Math.cos(6*o),m=u/this.a,l=(n*(c*m+1)-m-.5*c*(m*m+r))/(this.es*Math.sin(2*o)*(m*m+r-2*n*m)/(4*c)+(n-m)*(c*f-2/Math.sin(2*o))-f),o-=l,Math.abs(l)<=ot){i=o;break}c=Math.sqrt(1-this.es*Math.pow(Math.sin(i),2))*Math.tan(i),s=qt(this.long0+Math.asin(a*c/this.a)/Math.sin(i))}return t.x=s,t.y=i,t},names:["Polyconic","poly"]},Zs={init:function(){this.A=[],this.A[1]=.6399175073,this.A[2]=-.1358797613,this.A[3]=.063294409,this.A[4]=-.02526853,this.A[5]=.0117879,this.A[6]=-.0055161,this.A[7]=.0026906,this.A[8]=-.001333,this.A[9]=67e-5,this.A[10]=-34e-5,this.B_re=[],this.B_im=[],this.B_re[1]=.7557853228,this.B_im[1]=0,this.B_re[2]=.249204646,this.B_im[2]=.003371507,this.B_re[3]=-.001541739,this.B_im[3]=.04105856,this.B_re[4]=-.10162907,this.B_im[4]=.01727609,this.B_re[5]=-.26623489,this.B_im[5]=-.36249218,this.B_re[6]=-.6870983,this.B_im[6]=-1.1651967,this.C_re=[],this.C_im=[],this.C_re[1]=1.3231270439,this.C_im[1]=0,this.C_re[2]=-.577245789,this.C_im[2]=-.007809598,this.C_re[3]=.508307513,this.C_im[3]=-.112208952,this.C_re[4]=-.15094762,this.C_im[4]=.18200602,this.C_re[5]=1.01418179,this.C_im[5]=1.64497696,this.C_re[6]=1.9660549,this.C_im[6]=2.5127645,this.D=[],this.D[1]=1.5627014243,this.D[2]=.5185406398,this.D[3]=-.03333098,this.D[4]=-.1052906,this.D[5]=-.0368594,this.D[6]=.007317,this.D[7]=.0122,this.D[8]=.00394,this.D[9]=-.0013},forward:function(t){var s,i=t.x,a=t.y-this.lat0,h=i-this.long0,e=a/at*1e-5,n=h,r=1,o=0;for(s=1;s<=10;s++)r*=e,o+=this.A[s]*r;var l,M=o,c=n,u=1,f=0,m=0,p=0;for(s=1;s<=6;s++)l=f*M+u*c,u=u*M-f*c,f=l,m=m+this.B_re[s]*u-this.B_im[s]*f,p=p+this.B_im[s]*u+this.B_re[s]*f;return t.x=p*this.a+this.x0,t.y=m*this.a+this.y0,t},inverse:function(t){var s,i,a=t.x,h=t.y,e=a-this.x0,n=(h-this.y0)/this.a,r=e/this.a,o=1,l=0,M=0,c=0;for(s=1;s<=6;s++)i=l*n+o*r,o=o*n-l*r,l=i,M=M+this.C_re[s]*o-this.C_im[s]*l,c=c+this.C_im[s]*o+this.C_re[s]*l;for(var u=0;u.999999999999&&(i=.999999999999),s=Math.asin(i);var a=qt(this.long0+t.x/(.900316316158*this.a*Math.cos(s)));a<-Math.PI&&(a=-Math.PI),a>Math.PI&&(a=Math.PI),i=(2*s+Math.sin(2*s))/Math.PI,Math.abs(i)>1&&(i=1);var h=Math.asin(i);return t.x=a,t.y=h,t},names:["Mollweide","moll"]},ii={init:function(){Math.abs(this.lat1+this.lat2)=0?(i=Math.sqrt(t.x*t.x+t.y*t.y),s=1):(i=-Math.sqrt(t.x*t.x+t.y*t.y),s=-1);var e=0;if(0!==i&&(e=Math.atan2(s*t.x,s*t.y)),this.sphere)return h=qt(this.long0+e/this.ns),a=Is(this.g-i/this.a),t.x=h,t.y=a,t;var n=this.g-i/this.a;return a=Os(n,this.e0,this.e1,this.e2,this.e3),h=qt(this.long0+e/this.ns),t.x=h,t.y=a,t},names:["Equidistant_Conic","eqdc"]},ai={init:function(){this.R=this.a},forward:function(t){var s,i,a=t.x,h=t.y,e=qt(a-this.long0);Math.abs(h)<=ot&&(s=this.x0+this.R*e,i=this.y0);var n=Fs(2*Math.abs(h/Math.PI));(Math.abs(e)<=ot||Math.abs(Math.abs(h)-ht)<=ot)&&(s=this.x0,i=h>=0?this.y0+Math.PI*this.R*Math.tan(.5*n):this.y0+Math.PI*this.R*-Math.tan(.5*n));var r=.5*Math.abs(Math.PI/e-e/Math.PI),o=r*r,l=Math.sin(n),M=Math.cos(n),c=M/(l+M-1),u=c*c,f=c*(2/l-1),m=f*f,p=Math.PI*this.R*(r*(c-m)+Math.sqrt(o*(c-m)*(c-m)-(m+o)*(u-m)))/(m+o);e<0&&(p=-p),s=this.x0+p;var d=o+c;return p=Math.PI*this.R*(f*d-r*Math.sqrt((m+o)*(o+1)-d*d))/(m+o),i=h>=0?this.y0+p:this.y0-p,t.x=s,t.y=i,t},inverse:function(t){var s,i,a,h,e,n,r,o,l,M,c,u,f;return t.x-=this.x0,t.y-=this.y0,c=Math.PI*this.R,a=t.x/c,h=t.y/c,e=a*a+h*h,n=-Math.abs(h)*(1+e),r=n-2*h*h+a*a,o=-2*n+1+2*h*h+e*e,f=h*h/o+(2*r*r*r/o/o/o-9*n*r/o/o)/27,l=(n-r*r/3/o)/o,M=2*Math.sqrt(-l/3),c=3*f/l/M,Math.abs(c)>1&&(c=c>=0?1:-1),u=Math.acos(c)/3,i=t.y>=0?(-M*Math.cos(u+Math.PI/3)-r/3/o)*Math.PI:-(-M*Math.cos(u+Math.PI/3)-r/3/o)*Math.PI,s=Math.abs(a)2*ht*this.a)return;return i=s/this.a,a=Math.sin(i),h=Math.cos(i),e=this.long0,Math.abs(s)<=ot?n=this.lat0:(n=Fs(h*this.sin_p12+t.y*a*this.cos_p12/s),r=Math.abs(this.lat0)-ht,e=qt(Math.abs(r)<=ot?this.lat0>=0?this.long0+Math.atan2(t.x,-t.y):this.long0-Math.atan2(-t.x,t.y):this.long0+Math.atan2(t.x*a,s*this.cos_p12*h-t.y*this.sin_p12*a))),t.x=e,t.y=n,t}return o=Ps(this.es),l=Ns(this.es),M=Ss(this.es),c=ks(this.es),Math.abs(this.sin_p12-1)<=ot?(u=this.a*Es(o,l,M,c,ht),s=Math.sqrt(t.x*t.x+t.y*t.y),f=u-s,n=Os(f/this.a,o,l,M,c),e=qt(this.long0+Math.atan2(t.x,-1*t.y)),t.x=e,t.y=n,t):Math.abs(this.sin_p12+1)<=ot?(u=this.a*Es(o,l,M,c,ht),s=Math.sqrt(t.x*t.x+t.y*t.y),f=s-u,n=Os(f/this.a,o,l,M,c),e=qt(this.long0+Math.atan2(t.x,t.y)),t.x=e,t.y=n,t):(s=Math.sqrt(t.x*t.x+t.y*t.y),d=Math.atan2(t.x,t.y),m=qs(this.a,this.e,this.sin_p12),y=Math.cos(d),_=this.e*this.cos_p12*y,x=-_*_/(1-this.es),v=3*this.es*(1-x)*this.sin_p12*this.cos_p12*y/(1-this.es),g=s/m,b=g-x*(1+x)*Math.pow(g,3)/6-v*(1+3*x)*Math.pow(g,4)/24,w=1-x*b*b/2-g*b*b*b/6,p=Math.asin(this.sin_p12*Math.cos(b)+this.cos_p12*Math.sin(b)*y),e=qt(this.long0+Math.asin(Math.sin(d)*Math.sin(b)/Math.cos(p))),n=Math.atan((1-this.es*w*this.sin_p12/Math.sin(p))*Math.tan(p)/(1-this.es)),t.x=e,t.y=n,t)},names:["Azimuthal_Equidistant","aeqd"]},ei={init:function(){this.sin_p14=Math.sin(this.lat0),this.cos_p14=Math.cos(this.lat0)},forward:function(t){var s,i,a,h,e,n,r,o=t.x,l=t.y;return a=qt(o-this.long0),s=Math.sin(l),i=Math.cos(l),h=Math.cos(a),((e=this.sin_p14*s+this.cos_p14*i*h)>0||Math.abs(e)<=ot)&&(n=1*this.a*i*Math.sin(a),r=this.y0+1*this.a*(this.cos_p14*s-this.sin_p14*i*h)),t.x=n,t.y=r,t},inverse:function(t){var s,i,a,h,e,n,r;return t.x-=this.x0,t.y-=this.y0,s=Math.sqrt(t.x*t.x+t.y*t.y),i=Fs(s/this.a),a=Math.sin(i),h=Math.cos(i),n=this.long0,Math.abs(s)<=ot?(r=this.lat0,t.x=n,t.y=r,t):(r=Fs(h*this.sin_p14+t.y*a*this.cos_p14/s),e=Math.abs(this.lat0)-ht,Math.abs(e)<=ot?(n=qt(this.lat0>=0?this.long0+Math.atan2(t.x,-t.y):this.long0-Math.atan2(-t.x,t.y)),t.x=n,t.y=r,t):(n=qt(this.long0+Math.atan2(t.x*a,s*this.cos_p14*h-t.y*this.sin_p14*a)),t.x=n,t.y=r,t))},names:["ortho"]},ni={FRONT:1,RIGHT:2,BACK:3,LEFT:4,TOP:5,BOTTOM:6},ri={AREA_0:1,AREA_1:2,AREA_2:3,AREA_3:4},oi={init:function(){this.x0=this.x0||0,this.y0=this.y0||0,this.lat0=this.lat0||0,this.long0=this.long0||0,this.lat_ts=this.lat_ts||0,this.title=this.title||"Quadrilateralized Spherical Cube",this.lat0>=ht-ct/2?this.face=ni.TOP:this.lat0<=-(ht-ct/2)?this.face=ni.BOTTOM:Math.abs(this.long0)<=ct?this.face=ni.FRONT:Math.abs(this.long0)<=ht+ct?this.face=this.long0>0?ni.RIGHT:ni.LEFT:this.face=ni.BACK,0!==this.es&&(this.one_minus_f=1-(this.a-this.b)/this.a,this.one_minus_f_squared=this.one_minus_f*this.one_minus_f)},forward:function(t){var s,i,a,h,e,n,r={x:0,y:0},o={value:0};if(t.x-=this.long0,s=0!==this.es?Math.atan(this.one_minus_f_squared*Math.tan(t.y)):t.y,i=t.x,this.face===ni.TOP)h=ht-s,i>=ct&&i<=ht+ct?(o.value=ri.AREA_0,a=i-ht):i>ht+ct||i<=-(ht+ct)?(o.value=ri.AREA_1,a=i>0?i-ft:i+ft):i>-(ht+ct)&&i<=-ct?(o.value=ri.AREA_2,a=i+ht):(o.value=ri.AREA_3,a=i);else if(this.face===ni.BOTTOM)h=ht+s,i>=ct&&i<=ht+ct?(o.value=ri.AREA_0,a=-i+ht):i=-ct?(o.value=ri.AREA_1,a=-i):i<-ct&&i>=-(ht+ct)?(o.value=ri.AREA_2,a=-i-ht):(o.value=ri.AREA_3,a=i>0?-i+ft:-i-ft);else{var l,M,c,u,f,m;this.face===ni.RIGHT?i=Z(i,+ht):this.face===ni.BACK?i=Z(i,+ft):this.face===ni.LEFT&&(i=Z(i,-ht)),u=Math.sin(s),f=Math.cos(s),m=Math.sin(i),l=f*Math.cos(i),M=f*m,c=u,this.face===ni.FRONT?a=V(h=Math.acos(l),c,M,o):this.face===ni.RIGHT?a=V(h=Math.acos(M),c,-l,o):this.face===ni.BACK?a=V(h=Math.acos(-l),c,-M,o):this.face===ni.LEFT?a=V(h=Math.acos(-M),c,l,o):(h=a=0,o.value=ri.AREA_0)}return n=Math.atan(12/ft*(a+Math.acos(Math.sin(a)*Math.cos(ct))-ht)),e=Math.sqrt((1-Math.cos(h))/(Math.cos(n)*Math.cos(n))/(1-Math.cos(Math.atan(1/Math.cos(a))))),o.value===ri.AREA_1?n+=ht:o.value===ri.AREA_2?n+=ft:o.value===ri.AREA_3&&(n+=1.5*ft),r.x=e*Math.cos(n),r.y=e*Math.sin(n),r.x=r.x*this.a+this.x0,r.y=r.y*this.a+this.y0,t.x=r.x,t.y=r.y,t},inverse:function(t){var s,i,a,h,e,n,r,o,l,M={lam:0,phi:0},c={value:0};if(t.x=(t.x-this.x0)/this.a,t.y=(t.y-this.y0)/this.a,i=Math.atan(Math.sqrt(t.x*t.x+t.y*t.y)),s=Math.atan2(t.y,t.x),t.x>=0&&t.x>=Math.abs(t.y)?c.value=ri.AREA_0:t.y>=0&&t.y>=Math.abs(t.x)?(c.value=ri.AREA_1,s-=ht):t.x<0&&-t.x>=Math.abs(t.y)?(c.value=ri.AREA_2,s=s<0?s+ft:s-ft):(c.value=ri.AREA_3,s+=ht),l=ft/12*Math.tan(s),e=Math.sin(l)/(Math.cos(l)-1/Math.sqrt(2)),n=Math.atan(e),a=Math.cos(s),h=Math.tan(i),(r=1-a*a*h*h*(1-Math.cos(Math.atan(1/Math.cos(n)))))<-1?r=-1:r>1&&(r=1),this.face===ni.TOP)o=Math.acos(r),M.phi=ht-o,c.value===ri.AREA_0?M.lam=n+ht:c.value===ri.AREA_1?M.lam=n<0?n+ft:n-ft:c.value===ri.AREA_2?M.lam=n-ht:M.lam=n;else if(this.face===ni.BOTTOM)o=Math.acos(r),M.phi=o-ht,c.value===ri.AREA_0?M.lam=-n+ht:c.value===ri.AREA_1?M.lam=-n:c.value===ri.AREA_2?M.lam=-n-ht:M.lam=n<0?-n-ft:-n+ft;else{var u,f,m;l=(u=r)*u,f=(l+=(m=l>=1?0:Math.sqrt(1-l)*Math.sin(n))*m)>=1?0:Math.sqrt(1-l),c.value===ri.AREA_1?(l=f,f=-m,m=l):c.value===ri.AREA_2?(f=-f,m=-m):c.value===ri.AREA_3&&(l=f,f=m,m=-l),this.face===ni.RIGHT?(l=u,u=-f,f=l):this.face===ni.BACK?(u=-u,f=-f):this.face===ni.LEFT&&(l=u,u=f,f=-l),M.phi=Math.acos(-m)-ht,M.lam=Math.atan2(f,u),this.face===ni.RIGHT?M.lam=Z(M.lam,-ht):this.face===ni.BACK?M.lam=Z(M.lam,-ft):this.face===ni.LEFT&&(M.lam=Z(M.lam,+ht))}if(0!==this.es){var p,d,y;p=M.phi<0?1:0,d=Math.tan(M.phi),y=this.b/Math.sqrt(d*d+this.one_minus_f_squared),M.phi=Math.atan(Math.sqrt(this.a*this.a-y*y)/(this.one_minus_f*y)),p&&(M.phi=-M.phi)}return M.lam+=this.long0,t.x=M.lam,t.y=M.phi,t},names:["Quadrilateralized Spherical Cube","Quadrilateralized_Spherical_Cube","qsc"]},li=[[1,2.2199e-17,-715515e-10,31103e-10],[.9986,-482243e-9,-24897e-9,-13309e-10],[.9954,-83103e-8,-448605e-10,-9.86701e-7],[.99,-.00135364,-59661e-9,36777e-10],[.9822,-.00167442,-449547e-11,-572411e-11],[.973,-.00214868,-903571e-10,1.8736e-8],[.96,-.00305085,-900761e-10,164917e-11],[.9427,-.00382792,-653386e-10,-26154e-10],[.9216,-.00467746,-10457e-8,481243e-11],[.8962,-.00536223,-323831e-10,-543432e-11],[.8679,-.00609363,-113898e-9,332484e-11],[.835,-.00698325,-640253e-10,9.34959e-7],[.7986,-.00755338,-500009e-10,9.35324e-7],[.7597,-.00798324,-35971e-9,-227626e-11],[.7186,-.00851367,-701149e-10,-86303e-10],[.6732,-.00986209,-199569e-9,191974e-10],[.6213,-.010418,883923e-10,624051e-11],[.5722,-.00906601,182e-6,624051e-11],[.5322,-.00677797,275608e-9,624051e-11]],Mi=[[-5.20417e-18,.0124,1.21431e-18,-8.45284e-11],[.062,.0124,-1.26793e-9,4.22642e-10],[.124,.0124,5.07171e-9,-1.60604e-9],[.186,.0123999,-1.90189e-8,6.00152e-9],[.248,.0124002,7.10039e-8,-2.24e-8],[.31,.0123992,-2.64997e-7,8.35986e-8],[.372,.0124029,9.88983e-7,-3.11994e-7],[.434,.0123893,-369093e-11,-4.35621e-7],[.4958,.0123198,-102252e-10,-3.45523e-7],[.5571,.0121916,-154081e-10,-5.82288e-7],[.6176,.0119938,-241424e-10,-5.25327e-7],[.6769,.011713,-320223e-10,-5.16405e-7],[.7346,.0113541,-397684e-10,-6.09052e-7],[.7903,.0109107,-489042e-10,-104739e-11],[.8435,.0103431,-64615e-9,-1.40374e-9],[.8936,.00969686,-64636e-9,-8547e-9],[.9394,.00840947,-192841e-9,-42106e-10],[.9761,.00616527,-256e-6,-42106e-10],[1,.00328947,-319159e-9,-42106e-10]],ci=.8487,ui=1.3523,fi=Mt/5,mi=1/fi,pi=18,di=function(t,s){return t[0]+s*(t[1]+s*(t[2]+s*t[3]))},yi=function(t,s){return t[1]+s*(2*t[2]+3*s*t[3])},_i={init:function(){this.x0=this.x0||0,this.y0=this.y0||0,this.long0=this.long0||0,this.es=0,this.title=this.title||"Robinson"},forward:function(t){var s=qt(t.x-this.long0),i=Math.abs(t.y),a=Math.floor(i*fi);a<0?a=0:a>=pi&&(a=pi-1),i=Mt*(i-mi*a);var h={x:di(li[a],i)*s,y:di(Mi[a],i)};return t.y<0&&(h.y=-h.y),h.x=h.x*this.a*ci+this.x0,h.y=h.y*this.a*ui+this.y0,h},inverse:function(t){var s={x:(t.x-this.x0)/(this.a*ci),y:Math.abs(t.y-this.y0)/(this.a*ui)};if(s.y>=1)s.x/=li[pi][0],s.y=t.y<0?-ht:ht;else{var i=Math.floor(s.y*pi);for(i<0?i=0:i>=pi&&(i=pi-1);;)if(Mi[i][0]>s.y)--i;else{if(!(Mi[i+1][0]<=s.y))break;++i}var a=Mi[i],h=5*(s.y-a[0])/(Mi[i+1][0]-a[0]);h=Y(function(t){return(di(a,t)-s.y)/yi(a,t)},h,ot,100),s.x/=di(li[i],h),s.y=(5*i+h)*lt,t.y<0&&(s.y=-s.y)}return s.x=qt(s.x+this.long0),s},names:["Robinson","robin"]},xi={init:function(){this.name="geocent"},forward:function(t){return b(t,this.es,this.a)},inverse:function(t){return w(t,this.es,this.a,this.b)},names:["Geocentric","geocentric","geocent","Geocent"]};return I.defaultDatum="WGS84",I.Proj=Projection,I.WGS84=new I.Proj("WGS84"),I.Point=Point,I.toPoint=Ft,I.defs=o,I.transform=S,I.mgrs=ts,I.version="2.6.0",function(proj4){proj4.Proj.projections.add(es),proj4.Proj.projections.add(ms),proj4.Proj.projections.add(ds),proj4.Proj.projections.add(vs),proj4.Proj.projections.add(gs),proj4.Proj.projections.add(bs),proj4.Proj.projections.add(ws),proj4.Proj.projections.add(As),proj4.Proj.projections.add(Cs),proj4.Proj.projections.add(Rs),proj4.Proj.projections.add(Us),proj4.Proj.projections.add(Qs),proj4.Proj.projections.add(Ws),proj4.Proj.projections.add(Ks),proj4.Proj.projections.add(Xs),proj4.Proj.projections.add(Vs),proj4.Proj.projections.add(Zs),proj4.Proj.projections.add(Ys),proj4.Proj.projections.add(ti),proj4.Proj.projections.add(si),proj4.Proj.projections.add(ii),proj4.Proj.projections.add(ai),proj4.Proj.projections.add(hi),proj4.Proj.projections.add(ei),proj4.Proj.projections.add(oi),proj4.Proj.projections.add(_i),proj4.Proj.projections.add(xi)}(I),I}); \ No newline at end of file diff --git a/src/static_src/js/proj4leaflet.js b/src/static_src/js/proj4leaflet.js new file mode 100644 index 00000000..5ce8d471 --- /dev/null +++ b/src/static_src/js/proj4leaflet.js @@ -0,0 +1,272 @@ +(function (factory) { + var L, proj4; + if (typeof define === 'function' && define.amd) { + // AMD + define(['leaflet', 'proj4'], factory); + } else if (typeof module === 'object' && typeof module.exports === "object") { + // Node/CommonJS + L = require('leaflet'); + proj4 = require('proj4'); + module.exports = factory(L, proj4); + } else { + // Browser globals + if (typeof window.L === 'undefined' || typeof window.proj4 === 'undefined') + throw 'Leaflet and proj4 must be loaded first'; + factory(window.L, window.proj4); + } +}(function (L, proj4) { + if (proj4.__esModule && proj4.default) { + // If proj4 was bundled as an ES6 module, unwrap it to get + // to the actual main proj4 object. + // See discussion in https://github.com/kartena/Proj4Leaflet/pull/147 + proj4 = proj4.default; + } + + L.Proj = {}; + + L.Proj._isProj4Obj = function(a) { + return (typeof a.inverse !== 'undefined' && + typeof a.forward !== 'undefined'); + }; + + L.Proj.Projection = L.Class.extend({ + initialize: function(code, def, bounds) { + var isP4 = L.Proj._isProj4Obj(code); + this._proj = isP4 ? code : this._projFromCodeDef(code, def); + this.bounds = isP4 ? def : bounds; + }, + + project: function (latlng) { + var point = this._proj.forward([latlng.lng, latlng.lat]); + return new L.Point(point[0], point[1]); + }, + + unproject: function (point, unbounded) { + var point2 = this._proj.inverse([point.x, point.y]); + return new L.LatLng(point2[1], point2[0], unbounded); + }, + + _projFromCodeDef: function(code, def) { + if (def) { + proj4.defs(code, def); + } else if (proj4.defs[code] === undefined) { + var urn = code.split(':'); + if (urn.length > 3) { + code = urn[urn.length - 3] + ':' + urn[urn.length - 1]; + } + if (proj4.defs[code] === undefined) { + throw 'No projection definition for code ' + code; + } + } + + return proj4(code); + } + }); + + L.Proj.CRS = L.Class.extend({ + includes: L.CRS, + + options: { + transformation: new L.Transformation(1, 0, -1, 0) + }, + + initialize: function(a, b, c) { + var code, + proj, + def, + options; + + if (L.Proj._isProj4Obj(a)) { + proj = a; + code = proj.srsCode; + options = b || {}; + + this.projection = new L.Proj.Projection(proj, options.bounds); + } else { + code = a; + def = b; + options = c || {}; + this.projection = new L.Proj.Projection(code, def, options.bounds); + } + + L.Util.setOptions(this, options); + this.code = code; + this.transformation = this.options.transformation; + + if (this.options.origin) { + this.transformation = + new L.Transformation(1, -this.options.origin[0], + -1, this.options.origin[1]); + } + + if (this.options.scales) { + this._scales = this.options.scales; + } else if (this.options.resolutions) { + this._scales = []; + for (var i = this.options.resolutions.length - 1; i >= 0; i--) { + if (this.options.resolutions[i]) { + this._scales[i] = 1 / this.options.resolutions[i]; + } + } + } + + this.infinite = !this.options.bounds; + + }, + + scale: function(zoom) { + var iZoom = Math.floor(zoom), + baseScale, + nextScale, + scaleDiff, + zDiff; + if (zoom === iZoom) { + return this._scales[zoom]; + } else { + // Non-integer zoom, interpolate + baseScale = this._scales[iZoom]; + nextScale = this._scales[iZoom + 1]; + scaleDiff = nextScale - baseScale; + zDiff = (zoom - iZoom); + return baseScale + scaleDiff * zDiff; + } + }, + + zoom: function(scale) { + // Find closest number in this._scales, down + var downScale = this._closestElement(this._scales, scale), + downZoom = this._scales.indexOf(downScale), + nextScale, + nextZoom, + scaleDiff; + // Check if scale is downScale => return array index + if (scale === downScale) { + return downZoom; + } + if (downScale === undefined) { + return -Infinity; + } + // Interpolate + nextZoom = downZoom + 1; + nextScale = this._scales[nextZoom]; + if (nextScale === undefined) { + return Infinity; + } + scaleDiff = nextScale - downScale; + return (scale - downScale) / scaleDiff + downZoom; + }, + + distance: L.CRS.Earth.distance, + + R: L.CRS.Earth.R, + + /* Get the closest lowest element in an array */ + _closestElement: function(array, element) { + var low; + for (var i = array.length; i--;) { + if (array[i] <= element && (low === undefined || low < array[i])) { + low = array[i]; + } + } + return low; + } + }); + + L.Proj.GeoJSON = L.GeoJSON.extend({ + initialize: function(geojson, options) { + this._callLevel = 0; + L.GeoJSON.prototype.initialize.call(this, geojson, options); + }, + + addData: function(geojson) { + var crs; + + if (geojson) { + if (geojson.crs && geojson.crs.type === 'name') { + crs = new L.Proj.CRS(geojson.crs.properties.name); + } else if (geojson.crs && geojson.crs.type) { + crs = new L.Proj.CRS(geojson.crs.type + ':' + geojson.crs.properties.code); + } + + if (crs !== undefined) { + this.options.coordsToLatLng = function(coords) { + var point = L.point(coords[0], coords[1]); + return crs.projection.unproject(point); + }; + } + } + + // Base class' addData might call us recursively, but + // CRS shouldn't be cleared in that case, since CRS applies + // to the whole GeoJSON, inluding sub-features. + this._callLevel++; + try { + L.GeoJSON.prototype.addData.call(this, geojson); + } finally { + this._callLevel--; + if (this._callLevel === 0) { + delete this.options.coordsToLatLng; + } + } + } + }); + + L.Proj.geoJson = function(geojson, options) { + return new L.Proj.GeoJSON(geojson, options); + }; + + L.Proj.ImageOverlay = L.ImageOverlay.extend({ + initialize: function (url, bounds, options) { + L.ImageOverlay.prototype.initialize.call(this, url, null, options); + this._projectedBounds = bounds; + }, + + // Danger ahead: Overriding internal methods in Leaflet. + // Decided to do this rather than making a copy of L.ImageOverlay + // and doing very tiny modifications to it. + // Future will tell if this was wise or not. + _animateZoom: function (event) { + var scale = this._map.getZoomScale(event.zoom); + var northWest = L.point(this._projectedBounds.min.x, this._projectedBounds.max.y); + var offset = this._projectedToNewLayerPoint(northWest, event.zoom, event.center); + + L.DomUtil.setTransform(this._image, offset, scale); + }, + + _reset: function () { + var zoom = this._map.getZoom(); + var pixelOrigin = this._map.getPixelOrigin(); + var bounds = L.bounds( + this._transform(this._projectedBounds.min, zoom)._subtract(pixelOrigin), + this._transform(this._projectedBounds.max, zoom)._subtract(pixelOrigin) + ); + var size = bounds.getSize(); + + L.DomUtil.setPosition(this._image, bounds.min); + this._image.style.width = size.x + 'px'; + this._image.style.height = size.y + 'px'; + }, + + _projectedToNewLayerPoint: function (point, zoom, center) { + var viewHalf = this._map.getSize()._divideBy(2); + var newTopLeft = this._map.project(center, zoom)._subtract(viewHalf)._round(); + var topLeft = newTopLeft.add(this._map._getMapPanePos()); + + return this._transform(point, zoom)._subtract(topLeft); + }, + + _transform: function (point, zoom) { + var crs = this._map.options.crs; + var transformation = crs.transformation; + var scale = crs.scale(zoom); + + return transformation.transform(point, scale); + } + }); + + L.Proj.imageOverlay = function (url, bounds, options) { + return new L.Proj.ImageOverlay(url, bounds, options); + }; + + return L.Proj; +})); diff --git a/src/utils/management/commands/bootstrap-devsite.py b/src/utils/management/commands/bootstrap-devsite.py index 46f37bc8..15686c33 100644 --- a/src/utils/management/commands/bootstrap-devsite.py +++ b/src/utils/management/commands/bootstrap-devsite.py @@ -203,6 +203,7 @@ class Command(BaseCommand): name="Toilets", description="All the toilets", icon="fas fa-toilet", + marker="greyIcon", responsible_team=teams["shit"], ) types["toilet"].quickfeedback_options.add(options["na"]) @@ -214,6 +215,7 @@ class Command(BaseCommand): name="Power Infrastructure", description="Power related infrastructure, distribution points, distribution cables, and so on.", icon="fas fa-plug", + marker="goldIcon", responsible_team=teams["power"], ) types["power"].quickfeedback_options.add(options["attention"]) @@ -225,39 +227,39 @@ class Command(BaseCommand): self.output("Creating facilities...") facilities["toilet1"] = Facility.objects.create( facility_type=facility_types["toilet"], - name="Toilet A1", - description="Toilet on the left side in the NOC building", - location=Point(1, 2), + name="Toilet NOC East", + description="Toilet on the east side of the NOC building", + location=Point(9.939783, 55.387217), ) facilities["toilet2"] = Facility.objects.create( facility_type=facility_types["toilet"], - name="Toilet A2", - description="Toilet on the right side in the NOC building", - location=Point(3, 4), + name="Toilet NOC West", + description="Toilet on the west side of the NOC building", + location=Point(9.93967, 55.387197), ) facilities["pdp1"] = Facility.objects.create( facility_type=facility_types["power"], name="PDP1", description="In orga area", - location=Point(5, 6), + location=Point(9.94079, 55.388022), ) facilities["pdp2"] = Facility.objects.create( facility_type=facility_types["power"], name="PDP2", description="In bar area", - location=Point(7, 8), + location=Point(9.942036, 55.387891), ) facilities["pdp3"] = Facility.objects.create( facility_type=facility_types["power"], name="PDP3", description="In speaker tent", - location=Point(9, 10), + location=Point(9.938416, 55.387109), ) facilities["pdp4"] = Facility.objects.create( facility_type=facility_types["power"], name="PDP4", description="In food area", - location=Point(11, 12), + location=Point(9.940146, 55.386983), ) return facilities