3 |
4 | ---
5 | [English version][README_en]
6 |
7 | Argenmap es un visor de mapas desarrollado por el [Instituto Geográfico Nacional][] de licencia libre que permite mostrar mapas base, capas superpuestas, consultar y crear datos.
8 |
9 | Está basado en [Leaflet][] y para funcionar sólo requiere ser publicado con un servidor web. A partir de un archivo de configuración en formato JSON genera un panel lateral con todas las capas publicadas.
10 |
11 | Las capas se agrupan en el panel en secciones que son definidas en el archivo de configuración.
12 |
13 | Incluye por defecto con el mapa base de la República Argentina y se pueden agregar otros.
14 |
15 | ## Documentación
16 | - Guía rápida de [instalación][]
17 | - [Configurar][] capas, mapas base, estilos
18 | - [Funcionalidades][]
19 | - [Colaborar][] con el desarrollo
20 |
21 | [Instituto Geográfico Nacional]: https://www.ign.gob.ar
22 | [Leaflet]: https://leafletjs.com/
23 | [README_en]: src/docs/en/README.md
24 | [instalación]: src/docs/deployment.md
25 | [Configurar]: src/docs/configuration.md
26 | [Funcionalidades]: src/docs/features.md
27 | [Colaborar]: src/docs/contributing.md
28 |
--------------------------------------------------------------------------------
/src/config/default/styles/images/legends/Glaciar.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
15 |
--------------------------------------------------------------------------------
/src/js/components/config-tool/configTool.css:
--------------------------------------------------------------------------------
1 | /*******************************
2 | Configuration Window
3 | *******************************/
4 | #configWrapper {
5 | border-radius: 6px;
6 | box-shadow:
7 | 0 2px 4px rgb(0 0 0 / 20%),
8 | 0 -1px 0 rgb(0 0 0 / 2%);
9 | font-weight: bold;
10 | padding: 10px;
11 | text-align: inherit;
12 | -webkit-user-select: text;
13 | -moz-user-select: text;
14 | user-select: text;
15 | z-index: 99999;
16 | background-color: var(--main-bg-color, white);
17 | width: 400px; /* Aumenta el ancho */
18 | height: 300px; /* Aumenta la altura */
19 | }
20 |
21 | #configWindow {
22 | background-color: #d7f2f7;
23 | border: 1px solid #525252;
24 | border-radius: 4px;
25 | font-size: var(--body-fnt-size, 14px);
26 | padding: 10px; /* Aumenta el padding para mayor espacio interno */
27 | -webkit-user-select: text;
28 | -moz-user-select: text;
29 | user-select: text;
30 | overflow-y: auto; /* Añade scroll si el contenido sobrepasa el tamaño */
31 | height: calc(
32 | 100% - 40px
33 | ); /* Ajusta la altura para que se adapte al contenedor */
34 | }
35 |
36 | #configWindow td {
37 | padding: 3px;
38 | }
39 |
40 | #configWindow tr:nth-child(even) {
41 | background-color: var(--main-bg-color, #fff);
42 | }
43 |
--------------------------------------------------------------------------------
/src/config/default/styles/images/legends/Red de nivelación Topográfica.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
22 |
--------------------------------------------------------------------------------
/src/config/default/styles/images/legends/Red de nivelación de Precisión.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
22 |
--------------------------------------------------------------------------------
/src/js/map/plugins/leaflet/leaflet-editable-label/Leaflet.EditableLabel.css:
--------------------------------------------------------------------------------
1 | .redIcon {
2 | color: rgba(255, 0, 0, 0.637);
3 | font-size: large;
4 | line-height: inherit;
5 | }
6 | .map-label {
7 | min-width: 150px !important;
8 | background: transparent;
9 | font-weight: bold;
10 | color: #333;
11 | font-family: inherit;
12 | font-size: medium;
13 | text-align: center;
14 | border: 2px solid;
15 | overflow: hidden;
16 | height: 32px;
17 | }
18 | .div-icon {
19 | width: auto !important;
20 | height: auto !important;
21 | background-color: transparent;
22 | display: flex;
23 | }
24 | #editableLabelBtn>i {
25 | font-size: large;
26 | line-height: inherit;
27 | }
28 | .icon-text {
29 | display: block;
30 | background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAPJJREFUSEvd1M1JQ0EUQOEvi6wEXVlBFNKAohUYwQrEElykAhWsQCzBhRXEQBpI0ApUsAI3Cq5cKCP3QVCi854TwdzNwDBzzv0ZpmXO0Zoz3+IK3hq27ktHZrXozwTTCdxjLSrbxM1UlVVCtSuoLizjKYCvWEJaq6gt+DyCXVzF5gTbuTPKfaYnOA7oGfqlBUP0ArqPy9KC1P80hxQdPJQUrOMugI9YzYWnczkzOMBFQAfYKy04x2FAj3BaWnCNjYDuYFRS0MYL0ppiBc8lBVsYB/AW3Trw74b802eX8zg+cmn6m/5aULcTM89nZ9LU+P8F727oIRncV5QcAAAAAElFTkSuQmCC");
31 | height: inherit;
32 | background-position: right;
33 | background-repeat: no-repeat;
34 | filter: opacity(70%);
35 | }
--------------------------------------------------------------------------------
/src/config/default/styles/images/legends/Red de nivelación de Alta Precisión.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
22 |
--------------------------------------------------------------------------------
/src/config/default/styles/images/legends/Aeropuerto.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
18 |
--------------------------------------------------------------------------------
/src/js/components/data-managment/data-managment.js:
--------------------------------------------------------------------------------
1 | class Data {
2 | constructor(id, name) {
3 | this.id = id;
4 | this.name = name;
5 | }
6 | add() {}
7 | remove() {}
8 | }
9 | /* OGC Services */
10 | class ogcService extends Data {
11 | constructor(id, name, url, bbox, license, abstract, version) {
12 | super(id, name);
13 | this.url = url;
14 | this.bbox = bbox;
15 | this.license = license;
16 | this.abstract = abstract;
17 | this.version = version;
18 | }
19 | }
20 | class wmsSource extends ogcService {
21 | constructor(id, name, url, bbox, license, abstract, version, layers) {
22 | super(id, name, url, bbox, license, abstract, version);
23 | this.layers = layers;
24 | }
25 | getMap(){}
26 | getFeatureInfo(){}
27 | }
28 | class wmtsSource extends ogcService {
29 | constructor(id, name, url, bbox, license, abstract, version, layers) {
30 | super(id, name, url, bbox, license, abstract, version);
31 | this.layers = layers;
32 | }
33 | getTile(){}
34 | }
35 | /* Vector files formats */
36 | class FeatureCollection extends Data {
37 | constructor(id, name, url, bbox, license, abstract, layers) {
38 | super(id, name);
39 | this.url = url;
40 | this.bbox = bbox;
41 | this.license = license;
42 | this.abstract = abstract;
43 | this.layers = layers;
44 | }
45 | }
--------------------------------------------------------------------------------
/src/config/default/styles/images/legends/Aeródromo.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
18 |
--------------------------------------------------------------------------------
/src/config/default/styles/images/legends/Ferrocarril.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
21 |
--------------------------------------------------------------------------------
/src/js/map/plugins/leaflet/leaflet-simplegraticule/LICENSE:
--------------------------------------------------------------------------------
1 | Copyright (c) 2014-2015, Andrew Blakey
2 |
3 | All rights reserved.
4 |
5 | Redistribution and use in source and binary forms, with or without modification, are
6 | permitted provided that the following conditions are met:
7 |
8 | 1. Redistributions of source code must retain the above copyright notice, this list of
9 | conditions and the following disclaimer.
10 |
11 | 2. Redistributions in binary form must reproduce the above copyright notice, this list
12 | of conditions and the following disclaimer in the documentation and/or other materials
13 | provided with the distribution.
14 |
15 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
16 | EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
17 | MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
18 | COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
19 | EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
20 | SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21 | HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
22 | TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
23 | SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24 |
--------------------------------------------------------------------------------
/src/config/default/styles/images/legends/Abra, paso, portillo, portezuelo.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
19 |
--------------------------------------------------------------------------------
/src/docs/ejemplos_data_json/mapa_base_hibrido.json:
--------------------------------------------------------------------------------
1 | {
2 | "items": [
3 | {
4 | "type": "basemap",
5 | "peso": 1,
6 | "nombre": "Mapas base",
7 | "short_abstract": "",
8 | "class": "",
9 | "seccion": "mapasbase",
10 | "capas": [
11 | {
12 | "titulo": "Imágenes satelitales Here",
13 | "nombre": "here_imagery",
14 | "servicio": "tms",
15 | "version": "1.0.0",
16 | "attribution": "Imágenes satelitales © here",
17 | "host": "https://2.aerial.maps.api.here.com/maptile/2.1/maptile/newest/satellite.day/{z}/{x}/{y}/256/png8?app_id=XiMlA4JwMurUFFYUWYe3&app_code=oTsmqovbl2YudG3E0UlxDA",
18 | "legendImg": "src/styles/images/here.png",
19 | "peso": 50,
20 | "zoom": {
21 | "min": 3,
22 | "max": 20,
23 | "nativeMin": 3,
24 | "nativeMax": 20
25 | },
26 | "isOpenWith": ["provincia_FA003"]
27 | }
28 | ]
29 | },
30 | {
31 | "type": "wmslayer",
32 | "peso": 35,
33 | "nombre": "limites",
34 | "short_abstract": "limites",
35 | "class": "",
36 | "seccion": "limites",
37 | "servicio": "wms",
38 | "version": "1.3.0",
39 | "host": "https://wms.ign.gob.ar/geoserver/limites",
40 | "allowed_layers": [
41 | "area_protegida_070115",
42 | "provincia_FA003"]
43 | }
44 | ],
45 | "template": "ign-geoportal-basic"
46 | }
47 |
--------------------------------------------------------------------------------
/src/js/components/user-message/user-message.css:
--------------------------------------------------------------------------------
1 | .message-container {
2 | border-radius: 16px;
3 | display: flex;
4 | flex-direction: row;
5 | align-items: center;
6 | justify-content: space-between;
7 | position: fixed;
8 | left: 50%;
9 | top: 60%;
10 | transform: translate(-50%, -50%);
11 | padding: 1.5rem 2.5rem;
12 | z-index: 10000;
13 | box-shadow: 0 4px 24px rgba(0, 0, 0, 0.25);
14 | max-width: 90vw;
15 | min-width: 320px;
16 | background: #222;
17 | margin: 0;
18 | opacity: 0.98;
19 | }
20 | .message-text {
21 | margin: 0 1.5rem 0 0;
22 | max-height: 100px;
23 | font-weight: bold;
24 | font-size: 1.25em;
25 | color: #fff;
26 | text-shadow: 0 1px 2px #0008;
27 | letter-spacing: 0.02em;
28 | }
29 | .message-close-btn {
30 | width: 32px;
31 | height: 32px;
32 | line-height: 28px;
33 | border-radius: 100%;
34 | margin: 3px;
35 | padding: 5px;
36 | text-align: center;
37 | font-weight: bolder;
38 | cursor: pointer;
39 | font-size: 1.5em;
40 | color: #fffbe7;
41 | align-self: center;
42 | display: flex;
43 | transition: background 0.2s, color 0.2s;
44 | }
45 | .message-close-btn:hover, .message-close-btn:focus {
46 | background-color: #fff;
47 | border: solid 1px #444;
48 | color: #444;
49 | outline: none;
50 | }
51 | .message-close-btn i {
52 | align-self: center;
53 | margin: auto;
54 | }
55 | @media (max-width: 769px) {
56 | .message-container {
57 | width: 90vw;
58 | min-width: unset;
59 | padding: 1rem;
60 | }
61 | }
--------------------------------------------------------------------------------
/src/js/plugins/highcharts.theme.js:
--------------------------------------------------------------------------------
1 | Highcharts.theme = {
2 | colors: ['#D63900', '#ff5050', '#f7a35c', '#7cb5ec', '#90ee7e', '#7798BF', '#aaeeee', '#ff0066',
3 | '#eeaaee', '#55BF3B', '#7798BF', '#aaeeee'],
4 | chart: {
5 | backgroundColor: null,
6 | style: {
7 | fontFamily: 'Dosis, sans-serif'
8 | }
9 | },
10 | title: {
11 | style: {
12 | fontSize: '16px',
13 | fontWeight: 'bold',
14 | textTransform: 'uppercase'
15 | }
16 | },
17 | tooltip: {
18 | borderWidth: 0,
19 | backgroundColor: 'rgba(219,219,216,0.8)',
20 | shadow: false
21 | },
22 | legend: {
23 | backgroundColor: '#F0F0EA',
24 | itemStyle: {
25 | fontWeight: 'bold',
26 | fontSize: '13px'
27 | }
28 | },
29 | xAxis: {
30 | gridLineWidth: 1,
31 | labels: {
32 | style: {
33 | fontSize: '12px'
34 | }
35 | }
36 | },
37 | yAxis: {
38 | minorTickInterval: 'auto',
39 | title: {
40 | style: {
41 | textTransform: 'uppercase'
42 | }
43 | },
44 | labels: {
45 | style: {
46 | fontSize: '12px'
47 | }
48 | }
49 | },
50 | plotOptions: {
51 | candlestick: {
52 | lineColor: '#404048'
53 | }
54 | }
55 | };
56 | // Apply the theme
57 | Highcharts.setOptions(Highcharts.theme);
--------------------------------------------------------------------------------
/src/js/map/plugins/leaflet/leaflet-wmts/leaflet-tilelayer-wmts.js:
--------------------------------------------------------------------------------
1 | L.TileLayer.WMTS=L.TileLayer.extend({defaultWmtsParams:{service:"WMTS",request:"GetTile",version:"1.0.0",layer:"",style:"",tilematrixset:"",format:"image/jpeg"},initialize:function(a,b){this._url=a;var c={},d=Object.keys(b);d.forEach(a=>{c[a.toLowerCase()]=b[a]});var e=L.extend({},this.defaultWmtsParams),f=c.tileSize||this.options.tileSize;for(var g in e.width=c.detectRetina&&L.Browser.retina?e.height=2*f:e.height=f,c)e.hasOwnProperty(g)&&"matrixIds"!=g&&(e[g]=c[g]);this.wmtsParams=e,this.matrixIds=b.matrixIds||this.getDefaultMatrix(),L.setOptions(this,b)},onAdd:function(a){this._crs=this.options.crs||a.options.crs,L.TileLayer.prototype.onAdd.call(this,a)},getTileUrl:function(a){var b=this.options.tileSize,c=a.multiplyBy(b);c.x+=1,c.y-=1;var d=c.add(new L.Point(b,b)),e=this._tileZoom,f=this._crs.project(this._map.unproject(c,e)),g=this._crs.project(this._map.unproject(d,e));tilewidth=g.x-f.x;var h=this.matrixIds[e].identifier,i=this.wmtsParams.tilematrixset+":"+h,j=this.matrixIds[e].topLeftCorner.lng,k=this.matrixIds[e].topLeftCorner.lat,l=Math.floor((f.x-j)/tilewidth),m=-Math.floor((f.y-k)/tilewidth),n=L.Util.template(this._url,{s:this._getSubdomain(a)});return n+L.Util.getParamString(this.wmtsParams,n)+"&tilematrix="+i+"&tilerow="+m+"&tilecol="+l},setParams:function(a,b){return L.extend(this.wmtsParams,a),b||this.redraw(),this},getDefaultMatrix:function(){for(var a=Array(22),b=0;22>b;b++)a[b]={identifier:""+b,topLeftCorner:new L.LatLng(20037508.3428,-20037508.3428)};return a}}),L.tileLayer.wmts=function(a,b){return new L.TileLayer.WMTS(a,b)};
--------------------------------------------------------------------------------
/src/config/default/styles/images/legends/Edificio de salud.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
17 |
--------------------------------------------------------------------------------
/src/config/default/styles/images/legends/Helipuerto.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
20 |
--------------------------------------------------------------------------------
/src/config/default/styles/images/legends/Departamento.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
22 |
--------------------------------------------------------------------------------
/src/config/default/styles/images/legends/Provincia.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
22 |
--------------------------------------------------------------------------------
/src/config/default/styles/images/legends/Zona de Frontera Area.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
22 |
--------------------------------------------------------------------------------
/src/config/default/styles/images/legends/Antena.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
23 |
--------------------------------------------------------------------------------
/src/config/default/styles/images/legends/Edificio educativo.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
17 |
--------------------------------------------------------------------------------
/src/styles/css/dashboard.css:
--------------------------------------------------------------------------------
1 | /*
2 | * Top navigation
3 | * Hide default border to remove 1px line.
4 | */
5 | .navbar-fixed-top {
6 | /* position: sticky; */
7 | margin: 0;
8 | border: 0;
9 | height: 50px;
10 | margin: 10px 10px 0;
11 | border-radius: 6px;
12 | min-width: 380px;
13 | width: fit-content;
14 | ;
15 | /* max-width: 550px; */
16 | }
17 |
18 | @media (max-width: 915px) {
19 | .navbar-fixed-top {
20 | /* max-width: fit-content; */
21 | width: auto;
22 | min-width: fit-content;
23 | }
24 | }
25 |
26 | .navbar-sticky {
27 | position: sticky;
28 | height: 60px;
29 | background-color: transparent;
30 | }
31 |
32 | /*
33 | * Sidebar
34 | */
35 | .sidebar {
36 | display: none;
37 | padding: 0;
38 | }
39 |
40 | .panel-heading {
41 | padding: 10px 5px;
42 | }
43 |
44 | .panel-title {
45 | padding: 0 15px;
46 | }
47 |
48 | /* Hide for mobile, show later */
49 | @media (min-width: 768px) {
50 | .sidebar {
51 | display: block;
52 | overflow-x: hidden;
53 | overflow-y: auto;
54 | /* Scrollable contents if viewport is shorter than content. */
55 | background-color: #f5f5f5;
56 | border-right: 1px solid #eee;
57 | }
58 | }
59 |
60 | /* Sidebar navigation */
61 | .nav-sidebar>li>a {
62 | padding-right: 20px;
63 | padding-left: 20px;
64 | }
65 |
66 | .nav-sidebar>.active>a,
67 | .nav-sidebar>.active>a:hover,
68 | .nav-sidebar>.active>a:focus {
69 | color: #fff;
70 | background-color: #428bca;
71 | }
72 |
73 | /* Placeholder dashboard ideas */
74 | .placeholders {
75 | margin-bottom: 30px;
76 | text-align: center;
77 | }
78 |
79 | .placeholders h4 {
80 | margin-bottom: 0;
81 | }
82 |
83 | .placeholder {
84 | margin-bottom: 20px;
85 | }
86 |
87 | .placeholder img {
88 | display: inline-block;
89 | border-radius: 50%;
90 | }
--------------------------------------------------------------------------------
/src/js/components/table/table.js:
--------------------------------------------------------------------------------
1 | let datatable = [];
2 | let tableData = [];//Contains the last geojson entered from map.js
3 | let tableArray = [];//Contains all entered geojson from map.js.
4 | let eventGeojson = [];//Contains the element with the necessary id to find the geojson in tableArray
5 | let activeGeojson = 1;//Position of actual geojson
6 | let table;
7 | let activedata = 0;
8 | let ui = new UI
9 | let ISlandscape = window.matchMedia("(orientation: landscape)").matches
10 | let ISportrait = window.matchMedia("(orientation: portrait)").matches
11 | let ISmaxwidth = window.matchMedia("(max-width: 415px)").matches
12 | let ISmaxheight = window.matchMedia("(max-height: 415px)").matches
13 | let ISCelular = (ISportrait && ISmaxwidth) || (ISlandscape && ISmaxheight)
14 |
15 | function createTabulator(tableD, layername) {
16 | if (tableD.data.features.length != 0) {
17 | tableData = tableD.data;
18 | tableArray.push(tableData)
19 | let datos = tableD.getDataForTabulator();
20 | datatable[datatable.length] = datos
21 |
22 | if (document.getElementById("ContainerTable") !== null) {
23 | ui.addTabs(layername)
24 | } else {
25 | ui.createModal(!tableData.hasOwnProperty('crs'))
26 | ui.createTable(datos)
27 | ui.createFilters(datos)
28 | ui.addTabs(layername)
29 |
30 | if (!ISCelular) {
31 | $("#ContainerTable").draggable({
32 | containment: "body",
33 | scroll: false
34 | }
35 | );
36 |
37 | $("#ContainerTable").resizable({
38 | containment: "body",
39 | minHeight: 65,
40 | maxHeight: 475,
41 | minWidth: 450,
42 | scroll: true,
43 | });
44 | }
45 |
46 | }
47 | }
48 | }
49 |
50 | function newTable(data) {
51 | ui.cleanTable()
52 | ui.createTable(data)
53 | ui.createFilters(data)
54 | }
--------------------------------------------------------------------------------
/src/config/default/styles/images/legends/Areas de fabricación y procesamiento.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
25 |
--------------------------------------------------------------------------------
/src/config/default/styles/images/legends/Áreas de fabricación y procesamiento.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
25 |
--------------------------------------------------------------------------------
/src/config/default/styles/images/legends/Edificio de cultura.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
19 |
--------------------------------------------------------------------------------
/src/js/components/login/form.html:
--------------------------------------------------------------------------------
1 |