vue-geojson-view-ts 1.3.14 → 1.3.16

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vue-geojson-view-ts",
3
- "version": "1.3.14",
3
+ "version": "1.3.16",
4
4
  "type": "module",
5
5
  "files": [
6
6
  "dist",
@@ -9,9 +9,11 @@ import * as L from "leaflet";
9
9
  import "leaflet/dist/leaflet.css";
10
10
  import { onMounted, ref } from "vue";
11
11
  import { markerDefault } from "../helpers/imgBase64";
12
- import 'leaflet.fullscreen/Control.FullScreen.css'
13
- import 'leaflet.fullscreen'
12
+ import "leaflet.fullscreen/Control.FullScreen.css";
13
+ import "leaflet.fullscreen";
14
14
  import axios from "axios";
15
+ import gpsIcon from "../assets/gps.svg";
16
+ import sateliteIcon from "../assets/satelite.svg";
15
17
 
16
18
  export type TIconMaker = {
17
19
  iconUrl: string;
@@ -37,6 +39,7 @@ export interface ICoords {
37
39
  export interface IMapSearchAddressProps {
38
40
  configurationMap?: IConfigurationMap;
39
41
  coordinatesMap?: ICoords;
42
+ isSatelite?: boolean;
40
43
  }
41
44
 
42
45
  const props = withDefaults(defineProps<IMapSearchAddressProps>(), {
@@ -69,6 +72,8 @@ const idMap = ref();
69
72
  const coords = ref(props.coordinatesMap);
70
73
  const mapRender = ref();
71
74
  const markerRender = ref();
75
+ const currentTileLayer = ref<L.TileLayer | null>(null);
76
+ const isSatelliteView = ref(false);
72
77
 
73
78
  onMounted(async () => {
74
79
  await makeid(10);
@@ -93,17 +98,40 @@ const renderMap = async () => {
93
98
 
94
99
  const createMap = async () => {
95
100
  const iconMarker = props.configurationMap?.iconMarker;
96
- const map = L.map(idMap.value,{fullscreenControl:true} as any).setView(
101
+ const map = L.map(idMap.value, { fullscreenControl: true } as any).setView(
97
102
  [coords.value.lat, coords.value.lng],
98
103
  coords.value.zoom
99
104
  );
100
105
  map.invalidateSize();
101
106
  mapRender.value = map;
102
- L.tileLayer("https://tile.openstreetmap.org/{z}/{x}/{y}.png", {
103
- maxZoom: props.configurationMap?.maxZoom,
104
- attribution:
105
- '&copy; <a href="http://www.openstreetmap.org/copyright">OpenStreetMap</a>',
106
- }).addTo(map);
107
+
108
+ // Inicializar con la vista correcta según el prop
109
+ isSatelliteView.value = props.isSatelite || false;
110
+ if (isSatelliteView.value) {
111
+ currentTileLayer.value = L.tileLayer(
112
+ "https://api.maptiler.com/maps/satellite/{z}/{x}/{y}.jpg?key=t8mWT2ozs1JWBqMZOnZr",
113
+ {
114
+ attribution:
115
+ '&copy; <a href="https://www.maptiler.com/">MapTiler</a> &copy; <a href="http://www.openstreetmap.org/copyright">OpenStreetMap</a>',
116
+ }
117
+ );
118
+ } else {
119
+ currentTileLayer.value = L.tileLayer(
120
+ "https://tile.openstreetmap.org/{z}/{x}/{y}.png",
121
+ {
122
+ maxZoom: props.configurationMap?.maxZoom,
123
+ attribution:
124
+ '&copy; <a href="http://www.openstreetmap.org/copyright">OpenStreetMap</a>',
125
+ }
126
+ );
127
+ }
128
+ currentTileLayer.value.addTo(map);
129
+
130
+ // Agregar el control satelital si está habilitado
131
+ if (props.isSatelite !== undefined) {
132
+ const satelliteControl = createSatelliteControl();
133
+ map.addControl(satelliteControl);
134
+ }
107
135
 
108
136
  if (iconMarker.type === "image") {
109
137
  const marker = L.marker([coords.value.lat, coords.value.lng], {
@@ -148,6 +176,87 @@ const createMap = async () => {
148
176
  }
149
177
  };
150
178
 
179
+ const createSatelliteControl = (): L.Control => {
180
+ const SatelliteControl = L.Control.extend({
181
+ onAdd: (map: L.Map) => {
182
+ const container = L.DomUtil.create(
183
+ "div",
184
+ "leaflet-control-draw leaflet-bar leaflet-control"
185
+ );
186
+
187
+ const satelliteButton = L.DomUtil.create(
188
+ "a",
189
+ "leaflet-draw-draw-satellite",
190
+ container
191
+ );
192
+
193
+ satelliteButton.href = "#";
194
+ satelliteButton.title = isSatelliteView.value
195
+ ? "Vista Normal"
196
+ : "Vista Satélite";
197
+
198
+ // Usar el mismo estilo que los otros botones de draw
199
+ satelliteButton.style.backgroundImage = isSatelliteView.value
200
+ ? `url(${gpsIcon})`
201
+ : `url(${sateliteIcon})`;
202
+ satelliteButton.style.backgroundPosition = "center";
203
+ satelliteButton.style.backgroundRepeat = "no-repeat";
204
+ satelliteButton.style.backgroundSize = "20px 20px";
205
+
206
+ L.DomEvent.disableClickPropagation(satelliteButton);
207
+ L.DomEvent.on(satelliteButton, "click", toggleSatelliteView);
208
+
209
+ return container;
210
+ },
211
+ });
212
+
213
+ return new SatelliteControl({ position: "topleft" });
214
+ };
215
+
216
+ const toggleSatelliteView = (): void => {
217
+ if (!mapRender.value || !currentTileLayer.value) return;
218
+
219
+ isSatelliteView.value = !isSatelliteView.value;
220
+
221
+ // Remover la capa actual
222
+ mapRender.value.removeLayer(currentTileLayer.value as unknown as L.Layer);
223
+
224
+ // Agregar la nueva capa
225
+ if (isSatelliteView.value) {
226
+ currentTileLayer.value = L.tileLayer(
227
+ "https://api.maptiler.com/maps/satellite/{z}/{x}/{y}.jpg?key=t8mWT2ozs1JWBqMZOnZr",
228
+ {
229
+ attribution:
230
+ '&copy; <a href="https://www.maptiler.com/">MapTiler</a> &copy; <a href="http://www.openstreetmap.org/copyright">OpenStreetMap</a>',
231
+ }
232
+ );
233
+ } else {
234
+ currentTileLayer.value = L.tileLayer(
235
+ "https://tile.openstreetmap.org/{z}/{x}/{y}.png",
236
+ {
237
+ attribution:
238
+ '&copy; <a href="http://www.openstreetmap.org/copyright">OpenStreetMap</a>',
239
+ }
240
+ );
241
+ }
242
+
243
+ currentTileLayer.value.addTo(mapRender.value as L.Map);
244
+
245
+ // Actualizar el ícono del control satelital
246
+ const satelliteButtons = document.querySelectorAll(
247
+ ".leaflet-draw-draw-satellite"
248
+ );
249
+ satelliteButtons.forEach((button) => {
250
+ const htmlButton = button as HTMLElement;
251
+ htmlButton.style.backgroundImage = isSatelliteView.value
252
+ ? `url(${gpsIcon})`
253
+ : `url(${sateliteIcon})`;
254
+ htmlButton.title = isSatelliteView.value
255
+ ? "Vista Normal"
256
+ : "Vista Satélite";
257
+ });
258
+ };
259
+
151
260
  const searchAddress = async (query: string) => {
152
261
  const address = await axios.get(
153
262
  location.protocol + "//nominatim.openstreetmap.org/search?",
@@ -101,26 +101,35 @@ export default defineComponent({
101
101
  onAdd: (map: L.Map) => {
102
102
  const container = L.DomUtil.create(
103
103
  "div",
104
- "leaflet-bar leaflet-control leaflet-control-custom"
104
+ "leaflet-control-draw leaflet-bar leaflet-control"
105
105
  );
106
106
 
107
- container.style.backgroundColor = "white";
108
- container.style.width = "30px";
109
- container.style.height = "30px";
110
- container.style.cursor = "pointer";
111
- container.style.marginTop = "10px"; // Margen superior para separar de otros controles
112
- container.style.backgroundImage = this.isSatelliteView
113
- ? `url(${gpsIcon})`
114
- : `url(${sateliteIcon})`;
115
- container.style.backgroundPosition = "center";
116
- container.style.backgroundRepeat = "no-repeat";
117
- container.style.backgroundSize = "20px 20px";
118
- container.title = this.isSatelliteView
107
+ const satelliteButton = L.DomUtil.create(
108
+ "a",
109
+ "leaflet-draw-draw-satellite",
110
+ container
111
+ );
112
+
113
+ satelliteButton.href = "#";
114
+ satelliteButton.title = this.isSatelliteView
119
115
  ? "Vista Normal"
120
116
  : "Vista Satélite";
121
117
 
122
- L.DomEvent.disableClickPropagation(container);
123
- L.DomEvent.on(container, "click", this.toggleSatelliteView, this);
118
+ // Usar el mismo estilo que los otros botones de draw
119
+ satelliteButton.style.backgroundImage = this.isSatelliteView
120
+ ? `url(${gpsIcon})`
121
+ : `url(${sateliteIcon})`;
122
+ satelliteButton.style.backgroundPosition = "center";
123
+ satelliteButton.style.backgroundRepeat = "no-repeat";
124
+ satelliteButton.style.backgroundSize = "20px 20px";
125
+
126
+ L.DomEvent.disableClickPropagation(satelliteButton);
127
+ L.DomEvent.on(
128
+ satelliteButton,
129
+ "click",
130
+ this.toggleSatelliteView,
131
+ this
132
+ );
124
133
 
125
134
  return container;
126
135
  },
@@ -157,14 +166,16 @@ export default defineComponent({
157
166
 
158
167
  this.currentTileLayer.addTo(this.mapRender as L.Map);
159
168
 
160
- // Actualizar el ícono del control
161
- const controls = document.querySelectorAll(".leaflet-control-custom");
162
- controls.forEach((control) => {
163
- const htmlControl = control as HTMLElement;
164
- htmlControl.style.backgroundImage = this.isSatelliteView
169
+ // Actualizar el ícono del control satelital
170
+ const satelliteButtons = document.querySelectorAll(
171
+ ".leaflet-draw-draw-satellite"
172
+ );
173
+ satelliteButtons.forEach((button) => {
174
+ const htmlButton = button as HTMLElement;
175
+ htmlButton.style.backgroundImage = this.isSatelliteView
165
176
  ? `url(${gpsIcon})`
166
177
  : `url(${sateliteIcon})`;
167
- htmlControl.title = this.isSatelliteView
178
+ htmlButton.title = this.isSatelliteView
168
179
  ? "Vista Normal"
169
180
  : "Vista Satélite";
170
181
  });
@@ -442,11 +453,20 @@ export default defineComponent({
442
453
  pointToLayer: this.getPointToLayer.bind(this),
443
454
  onEachFeature: function (feature, layer) {
444
455
  featureGroup.addLayer(layer);
445
- // Mostrar popup solo para Point
456
+ // Mostrar popup para Point
446
457
  if (feature.geometry.type === "Point") {
447
458
  var popupContent = self.getPopupContent(feature);
448
459
  layer.bindPopup(popupContent);
449
460
  }
461
+ // Mostrar popup para Polygon y MultiPolygon al hacer clic
462
+ else if (
463
+ feature.geometry.type === "Polygon" ||
464
+ feature.geometry.type === "MultiPolygon"
465
+ ) {
466
+ var tooltipContent =
467
+ self.getPolygonTooltipContent(feature);
468
+ layer.bindPopup(tooltipContent);
469
+ }
450
470
  },
451
471
  });
452
472
  }
@@ -464,11 +484,19 @@ export default defineComponent({
464
484
  L.geoJson(item, {
465
485
  onEachFeature: function (feature, layer) {
466
486
  featureGroup.addLayer(layer);
467
- // Mostrar popup solo para Point
487
+ // Mostrar popup para Point
468
488
  if (feature.geometry.type === "Point") {
469
489
  var popupContent = self.getPopupContent(feature);
470
490
  layer.bindPopup(popupContent);
471
491
  }
492
+ // Mostrar popup para Polygon y MultiPolygon al hacer clic
493
+ else if (
494
+ feature.geometry.type === "Polygon" ||
495
+ feature.geometry.type === "MultiPolygon"
496
+ ) {
497
+ var tooltipContent = self.getPolygonTooltipContent(feature);
498
+ layer.bindPopup(tooltipContent);
499
+ }
472
500
  },
473
501
  });
474
502
  }
@@ -649,6 +677,12 @@ export default defineComponent({
649
677
  html += "</div>";
650
678
  return html;
651
679
  },
680
+ getPolygonTooltipContent(feature: any): string {
681
+ const props = feature.properties || {};
682
+ const descripcion = props.descripcion || props.name || "Sin descripción";
683
+
684
+ return `<div style="font-weight: bold; padding: 5px;">${descripcion}</div>`;
685
+ },
652
686
  },
653
687
  watch: {
654
688
  coordinatesMap(newVal) {