source: spip-zone/_plugins_/gis/trunk/saisies/carte.html @ 70028

Last change on this file since 70028 was 70028, checked in by brunobergot@…, 7 years ago

Version 4.3.4 : définir popupAnchor lorsqu'on utilise un logo personnalisé pour les points afin de bien placer la popup par rapport au marqueur + maj du json/gis_sites qui n'était pas up depuis un moment + simplification de l'écriture des crochets dans les squelettes json

File size: 9.1 KB
Line 
1[(#REM)
2
3        Saisie carte
4
5        Parametres optionnels:
6
7        - lat = 48.3                    latitude du centre de la carte
8        - lon = -4.7                    longitude du centre de la carte
9        - zoom = 5                      zoom de la carte
10        - sw_lat = lat - 10°            latitude du sud-ouest de la bounding box
11        - sw_lon = lon - 10°            longitude du sud-ouest de la bounding box
12        - ne_lat = lat + 10°            latitude du nord-est de la bounding box
13        - ne_lon = lon + 10°            longitude du nord-est de la bounding box
14        - largeur = 100%
15        - hauteur = 350px
16
17]
18
19[(#SET{init_lat,#ENV{lat,#CONFIG{gis/lat,0}}})]
20[(#SET{init_lon,#ENV{lon,#CONFIG{gis/lon,0}}})]
21[(#SET{init_zoom,#ENV{zoom,#CONFIG{gis/zoom,0}}})]
22[(#REM) On utilise la bounding box seulement si le centre n'a pas été donné et si les quatre valeurs de la bounding box sont renseignées
23        Les valeurs par defaut sont "centre +/- 10°", ce qui est naze, mais c'est un cas normalement impossible
24]
25[(#ENV{lat}|ou{#ENV{lon}}|non|et{#ENV{sw_lat}}|et{#ENV{sw_lon}}|et{#ENV{ne_lat}}|et{#ENV{ne_lon}})
26        #SET{utiliser_bb, oui}
27        #SET{init_sw_lat,#ENV{sw_lat,#GET{lat}|moins{10}}}
28        #SET{init_sw_lon,#ENV{sw_lon,#GET{lon}|moins{10}}}
29        #SET{init_ne_lat,#ENV{ne_lat,#GET{lat}|plus{10}}}
30        #SET{init_ne_lon,#ENV{ne_lon,#GET{lon}|plus{10}}}
31]
32
33<li class="pleine_largeur editer editer_[(#ENV{nom})][ (#ENV{li_class})][ saisie_(#ENV{type_saisie})]"[ data-id="(#ENV{id_saisie})"]>
34#ENV*{inserer_debut}
35<div id="map_[(#ENV{nom})]" name="formMap" class="formMap" style="width: #ENV{largeur,100%}; height: #ENV{hauteur,350px}"></div>
36<script type="text/javascript">
37<!--
38var form_map;
39var annuler_geocoder = 0;
40[(#ENV{recherche}|!={non}|oui|et{#CONFIG{gis/geocoder}|oui})
41[(#SET{geocoder,oui})]
42var geocoder;]
43
44(function($){
45        var champ_lat = $('#champ_#ENV{champ_lat,lat}');
46        var champ_lon = $('#champ_#ENV{champ_lon,lon}');
47        var champ_zoom = $('#champ_#ENV{champ_zoom,zoom}');
48        var champ_adresse = $('#champ_#ENV{champ_adresse,adresse}');
49        var champ_code_postal = $('##ENV{champ_code_postal,code_postal}');
50        var champ_ville = $('#champ_#ENV{champ_ville,ville}');
51        var champ_region = $('#champ_#ENV{champ_region,region}');
52        var champ_pays = $('#champ_#ENV{champ_pays,pays}');
53       
54        var marker;
55       
56        var maj_inputs = function(map,data,action) {
57                [(#GET{geocoder}|oui)
58                if (action != 'geocoding') {
59                        var f = geocoder.geocode(data);
60                }]
61                var zoom = map.getZoom();
62                $('#champ_#ENV{champ_zoom,zoom}').val(zoom);
63                if(action == 'click'){
64                        $('#champ_#ENV{champ_lat,lat}').val(data.lat);
65                        $('#champ_#ENV{champ_lon,lon}').val(data.lng);
66                        annuler_geocoder = 1;
67                        form_map.panTo(data);
68                        marker.setLatLng(data);
69                }
70                else if(annuler_geocoder != 1){
71                        if(data.point == 'undefined'){
72                                $('#champ_#ENV{champ_lat,lat}').val(data.lat);
73                                $('#champ_#ENV{champ_lon,lon}').val(data.lng);
74                                form_map.panTo(data);
75                                marker.setLatLng(data);
76                        }else{
77                                $('#champ_#ENV{champ_lat,lat}').val(data.point.lat);
78                                $('#champ_#ENV{champ_lon,lon}').val(data.point.lng);
79                                form_map.panTo(data.point);
80                                marker.setLatLng(data.point);
81                        }
82                }
83                if (!marker._map)
84                        form_map.addLayer(marker);
85        }
86       
87        [(#GET{geocoder}|oui)
88        function geocode(query) {
89                $('#champ_#ENV{champ_adresse,adresse}').val(query.street);
90                $('#champ_#ENV{champ_code_postal,code_postal}').val(query.postcode);
91                $('#champ_#ENV{champ_ville,ville}').val(query.locality);
92                $('#champ_#ENV{champ_region,region}').val(query.region);
93                $('#champ_#ENV{champ_pays,pays}').val(query.country);
94                maj_inputs(form_map,query,'geocoding');
95        }]
96       
97        var init_map = function(callback) {
98                // creer la carte
99                var map_container = 'map_[(#ENV{nom})]';
100                form_map = new L.Map(map_container);
101               
102                // appeler l'éventuelle fonction de callback
103                if (callback && typeof(callback) === "function") {
104                        form_map.on('load',function(e){
105                                callback(e.target);
106                        });
107                }
108                form_map.attributionControl.setPrefix('');
109               
110                marker = new L.Marker(new L.LatLng(#ENV{lat,0}, #ENV{lon,0}), {draggable: true});
111               
112                //default layer
113                #SET{layer_defaut,#REM|gis_layer_defaut} #SET{layers,#EVAL{$GLOBALS['gis_layers']}}
114                var [(#GET{layer_defaut})] = [new (#GET{layers}|table_valeur{#GET{layer_defaut}/layer})];
115                form_map.addLayer([(#GET{layer_defaut})]);
116               
117                <B_layers>
118                var layers_control = new L.Control.Layers();
119                layers_control.addBaseLayer([(#GET{layer_defaut})],["(#GET{layers}|table_valeur{#GET{layer_defaut}/nom})"]);
120                <BOUCLE_layers(DATA){source table, #GET{layers}}{si #ENV{control_type,#ENV{controle_type}}|!={non}|et{#ENV{no_control,#ENV{aucun_controle}}|!={oui}}|et{#CONFIG{gis/layers,#ARRAY}|count|>{1}|oui}|oui}>[
121                (#CLE|!={#GET{layer_defaut}}|oui|et{#CLE|in_array{#CONFIG{gis/layers,#ARRAY}}|oui}|oui)
122                layers_control.addBaseLayer([new (#VALEUR|table_valeur{layer})],"[(#VALEUR|table_valeur{nom})]");]
123                </BOUCLE_layers>
124                form_map.addControl(layers_control);
125                // ajouter l'objet du controle de layers à la carte pour permettre d'y accéder depuis le callback
126                form_map.layersControl = layers_control;
127                // classe noajax sur le layer_control pour éviter l'ajout de hidden par SPIP
128                $(layers_control._form).addClass('noajax');
129                </B_layers>
130               
131                [(#GET{utiliser_bb}|non)
132                form_map.setView(new L.LatLng([(#GET{init_lat})], [(#GET{init_lon})]), [(#GET{init_zoom})]); 
133                ]
134                [(#GET{utiliser_bb}|oui)
135                form_map.fitBounds(
136                        new L.LatLngBounds(
137                                new L.LatLng([(#GET{init_sw_lat})], [(#GET{init_sw_lon})]),
138                                new L.LatLng([(#GET{init_ne_lat})], [(#GET{init_ne_lon})])
139                        )
140                );
141                // mettre à jour les champs de latitude et longitude quand la carte est chargée
142                // a voir si on le fait dans tous les cas, pas seulement pour la boundingbox, comme pour le zoom
143                form_map.on('load', function(e) {
144                        $('#champ_#ENV{champ_lat,lat}').val(e.latlng.lat);
145                        $('#champ_#ENV{champ_lon,lon}').val(e.latlng.lon);
146                });             
147                ]
148               
149                [(#GET{geocoder}|oui)
150                geocoder = new L.Geocoder(geocode);]
151               
152                [(#REM) Ici on utilise #ENV{lat} et #ENV{lon}, et pas les valeurs
153                        d'initialisation #GET{init_lat} et #GET{init_lon} qui sont toujours remplies]
154                [(#ENV{lat}|et{#ENV{lon}}|oui)
155                var data = {
156                        "type": "FeatureCollection",
157                        "features": \[
158                                {"type": "Feature",
159                                        "geometry": {"type": "Point", "coordinates": \[#ENV{lon}, #ENV{lat}\]},
160                                        "id":"#ENV{id_gis,oui}",
161                                        "properties": {
162                                                "title":[(#ENV{titre,''}|supprimer_numero|json_encode)],
163                                                "description":[(#ENV{descriptif,''}|json_encode)][,(#LOGO_GIS|oui)
164                                                [(#SET{logo_doc,#LOGO_GIS|image_passe_partout{32,32}|image_recadre{32,32}})]
165                                                #SET{icon_w,#GET{logo_doc}|extraire_attribut{src}|largeur}
166                                                #SET{icon_h,#GET{logo_doc}|extraire_attribut{src}|hauteur}
167                                                ["icon": (#GET{logo_doc}|extraire_attribut{src}|url_absolue|json_encode)],
168                                                "icon_size": \[#GET{icon_w},#GET{icon_h}\],
169                                                "icon_anchor": \[[(#GET{icon_w}|div{2})],[(#GET{icon_h})]\]]
170                                        }
171                                }\]
172                }
173               
174                var geojson = new L.geoJson('', {
175                        onEachFeature: function (feature, layer) {
176                                marker = layer;
177                                layer.options.draggable = true;
178                                if (feature.properties && feature.properties.icon){
179                                        layer.setIcon(new L.Icon({
180                                                iconUrl: feature.properties.icon,
181                                                iconSize: new L.Point( feature.properties.icon_size\[0\], feature.properties.icon_size\[1\] ),
182                                                iconAnchor: new L.Point( feature.properties.icon_anchor\[0\], feature.properties.icon_anchor\[1\] ),
183                                                popupAnchor: new L.Point( feature.properties.popup_anchor\[0\], feature.properties.popup_anchor\[1\] )
184                                        }));
185                                }
186                                if (feature.properties && feature.properties.title){
187                                        layer.bindPopup(feature.properties.title);
188                                }
189                        }
190                }).addTo(form_map);
191                geojson.addData(data);]
192               
193                // mettre a jour les coordonnees quand on clique la carte
194                form_map.on('click', function(e) {
195                        annuler_geocoder = 0;
196                        maj_inputs(form_map,e.latlng,'click');
197                });
198               
199                marker.on("dragend", function(e){
200                        maj_inputs(form_map,e.target._latlng,'click');
201                });
202               
203                // mettre à jour le zoom quand on le modifie
204                form_map.on('zoomend', function(e) {
205                        $('#champ_#ENV{champ_zoom,zoom}').val(e.target._zoom);
206                });
207               
208                [(#GET{geocoder}|oui)
209                // geocoder si clic...
210                $('a##ENV{nom}_rechercher_geocodage').css("cursor","pointer").click(function(){
211                        var address = $("#champ_#ENV{nom}_geocoder").attr("value");
212                        annuler_geocoder = 0;
213                        geocoder.geocode(address);
214                });
215
216                // ne pas soumettre le formulaire si on presse Entree depuis le champ de recherche
217                $('#champ_#ENV{nom}_geocoder').keypress(function(e){
218                        if (e.which == 13) {
219                                $('a##ENV{nom}_rechercher_geocodage').trigger("click");
220                                return false;
221                        }
222                });]
223               
224                [(#ENV{id_gis}|non|ou{#ENV{id_gis}|=={oui}}|et{#CONFIG{gis/geolocaliser_user_html5}|=={on}}|oui)
225                form_map.locate({setView: true, maxZoom: [(#GET{init_zoom})]});]
226               
227        };
228
229        $(function(){
230                jQuery.getScript('[(#PRODUIRE{fond=javascript/gis.js}|compacte)]',function(){
231                        if (typeof(callback_form_map) === "function") {
232                                init_map(callback_form_map);
233                        } else {
234                                init_map();
235                        }
236                });
237        });
238       
239})(jQuery);
240-->
241</script>
242#ENV*{inserer_fin}
243</li>
244[(#GET{geocoder}|oui)
245<li class="rechercher_adresse editer_[(#ENV{nom})]">
246        <label for="champ_#ENV{nom}_geocoder"><:gis:label_rechercher_address:></label>
247        <input type="text" class="text" name="champ_#ENV{nom}_geocoder" id="champ_#ENV{nom}_geocoder" value="" />
248        <a id="#ENV{nom}_rechercher_geocodage"><:info_rechercher:></a>
249</li>]
Note: See TracBrowser for help on using the repository browser.