meta { title: "Colombia specific rules"; icon: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAQAAAAEACAYAAABccqhmAAAACXBIWXMAAA7EAAAOxAGVKw4bAAACrklEQVR42u3ZMUoDQRiG4T9mIOtKSq29gUUu4E20srS2FTyI3sMiV/AGaQTRIgF14+KusRVZHOvZ5ymHVB/My5CNAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAQkx+H3QPR2cRcWwaKM4qnTzf/TxIAz86j4hTW0FxlhGRDQAwEgIAAgAIACAAgAAAAgAIACAAgAAAAgAIACAAgAAAAgAIACAAgAAAAgAIACAAgAAAAgAIACAAgAAAAgAIACAAgAAAAgAIACAAgAAAAgAIACAAgACAAJgABAAQAEAAAAEABAAQAEAAAAEABAAQAEAAAAEABAAQAEAAAAEABAAQAEAAAAEABAAQAEAAAAEABAAQAEAAAAEABAAQAEAAAAEABAAQAEAAAAEAAQAEABAAQACAUQagaVPUs84yUJimTfkAbLZV1LM3a0FhNtsqH4DFzUW8vB5YCwpzOH+PiKvMC6CpLAUlvgCaf7wAPvuppaBAQ3fbVwAYMQEAAQAEABAAQAAAAQAEABAAQAAAAQAEABAAQAAAAQAEABAAQAAAAQAEABAAQAAAAQAEABAAQAAAAQAEABAAQAAAAQAEABAAQAAAAQAEAPg7AGnXRzeZWgZKu+y7PrpcAOZ9G+tUWwsKM+/bWOcCcP10H9VXZy0ozMdeistcABbNY+zvBABKs52k/H8ALj+Uaehu+woAIyYAIACAAAACAAgAIACAAAACAAgAIACAAAACAAgAIACAAAACAAgAIACAAAACAAgAIACAAAACAAgAIACAAAACAAgAIACAAAACAAgAIACAAAACAAgACMDA2W1ELE0DxVmZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAYn0D8fk8qwS1ctwAAAAASUVORK5CYII="; version: "2021-11-29"; description: "Validation rules for the most common issues found in Colombia. Messages are in Spanish, with suggestion and fixes. This is based on the Colombian Guide for Mapping which can be found in the OSM Wiki."; author: "Andres Gomez (AngocA) - Maptime Bogota"; link: "https://github.com/MaptimeBogota/ColombianJosmValidator"; } /***** CUERPOS DE AGUA *****/ /* Nombres de ríos. Deben comenzar con la palabra Río, Quebrada u otro nombre de la expresión regular. */ *["waterway"="river"]["name"]["name" !~ /^(Río|Quebrada|Arroyo|Brazo|Cañada|Caño|Chorro|Canal|Estero|Nacimiento|Zanja|Zanjón) /][inside("CO")] { throwWarning: "En los cuerpos de agua de tipo \"river\" o \"stream\", la etiqueta name debe comenzar con: Río, Quebrada, Arroyo, Caño, Chorro, Cañada, Canal, Estero, Nacimiento, Zanjón seguido del nombre como tal"; fixAdd: "name=Río {1.value}"; suggestAlternative: "name=\"Río {1.value}\""; group: "Colombia - Cuerpos de agua"; /* Assertions for unit tests */ assertMatch: "way waterway=river name=Magdalena"; assertMatch: "way waterway=river name=\"Rio Magdalena\""; assertMatch: "way waterway=river name=\"La Vieja\""; assertNoMatch: "way waterway=river name=\"Río Magdalena\""; assertNoMatch: "way waterway=river name=\"Quebrada La Vieja\""; } /* Nombres de quebradas. Deben comenzar con la palabra Quebrada, Río u otro nombre de la expresión regular. */ *["waterway"="stream"]["name"]["name" !~ /^(Río|Quebrada|Acequía|Arroyo|Brazo|Cañada|Caño|Chorro|Canal|Estero|Nacimiento|Zanja|Zanjón) /][inside("CO")] { throwWarning: "En los cuerpos de agua de tipo \"stream\" o \"river\", la etiqueta name debe comenzar con: Río, Quebrada, Arroyo, Caño, Chorro, Cañada, Canal, Estero, Nacimiento, Zanjón seguido del nombre como tal"; fixAdd: "name=Quebrada {1.value}"; suggestAlternative: "name=\"Quebrada {1.value}\""; group: "Colombia - Cuerpos de agua"; /* Assertions for unit tests */ assertMatch: "way waterway=stream name=Magdalena"; assertMatch: "way waterway=stream name=\"Rio Magdalena\""; assertMatch: "way waterway=stream name=\"La Vieja\""; assertNoMatch: "way waterway=stream name=\"Río Magdalena\""; assertNoMatch: "way waterway=stream name=\"Quebrada La Vieja\""; } /***** VIAS *****/ /* No hay autopistas - motorway en Colombia. */ *["highway"="motorway"][inside("CO")] { throwWarning: "En Colombia no hay autopistas como tal, inclusive si se llaman así"; fixAdd: "highway=trunk"; suggestAlternative: "highway=trunk"; group: "Colombia - Vías"; /* Assertions for unit tests */ assertMatch: "way highway=motorway"; assertNoMatch: "way highway=trunk"; assertNoMatch: "way highway=primary"; } /* No hay living streets en Colombia. Hay vías residenciales (Cuando tienen nombre). */ *["highway"="living_street"]["name"][inside("CO")] { throwWarning: "En Colombia no hay como tal living streets, en cambio hay residential o pedestrian"; fixAdd: "highway=residential"; suggestAlternative: "highway=residential o highway=pedestrian"; group: "Colombia - Vías"; /* Assertions for unit tests */ assertMatch: "way highway=living_street name=\"Calle 1\""; assertNoMatch: "way highway=residential"; assertNoMatch: "way highway=pedestrian"; } /* No hay living streets en Colombia. Hay vías peatonales (Cuando no tienen nombre). */ *["highway"="living_street"][!"name"][inside("CO")] { throwWarning: "En Colombia no hay como tal living streets, en cambio hay service o pedestrian"; fixAdd: "highway=service"; suggestAlternative: "highway=service o highway=pedestrian"; group: "Colombia - Vías"; /* Assertions for unit tests */ assertMatch: "way highway=living_street"; assertNoMatch: "way highway=service"; assertNoMatch: "way highway=pedestrian"; } /* Las vías desconocidas no se deben mapear como unclassified, sino como road. */ *["highway"="unclassified"][inside("CO")] { throwWarning: "Mapear una vía de tipo desconocido como unclassified es incorrecto. Una vía de tipo 'unclassified' es una vía pequeña para automóviles"; fixAdd: "highway=road"; suggestAlternative: "highway=road, highway=service, highway=track o highway=path"; group: "Colombia - Vías"; /* Assertions for unit tests */ assertMatch: "way highway=unclassified"; assertNoMatch: "way highway=road"; assertNoMatch: "way highway=track"; assertNoMatch: "way highway=path"; } /* Las vías en Colombia deben indicar el tipo de vía en su nombre seguido de su numeración. */ *["highway" =~ /trunk|primary|secondary|tertiary|residential|link/]["name"]["name" !~ /^((Calle|Avenida Calle|Carrera|Avenida Carrera|Transversal|Avenida Transversal|Diagonal|Avenida Diagonal) [0-9]{1,3}[A-Z]{0,1}( Bis( [A-Z]){0,1}){0,1}( Este| Sur| Oeste| Norte){0,1}|(Vía|Ruta) .*)$/][inside("CO")] { throwWarning: "Los nombres de vías no deben contener abreviaturas, y deben seguir la estructura de nombre"; group: "Colombia - Vías"; /* Assertions for unit tests */ assertMatch: "way highway=primary name=Rotonda"; assertNoMatch: "way highway=secondary"; assertNoMatch: "way highway=tertiary name=\"Calle 1\""; assertNoMatch: "way highway=service"; } /* Los nombres alternos de las vías no deben tener el nombre numérico. */ *["highway" =~ /trunk|primary|secondary|tertiary|residential|link/]["alt_name"]["alt_name" =~ /^(Calle|Avenida Calle|Carrera|Avenida Carrera|Transversal|Avenida Transversal|Diagonal|Avenida Diagonal) [0-9]{1,3}[A-Z]{0,1}( Bis( [A-Z]){0,1}){0,1}( Este| Sur| Oeste| Norte){0,1}$/][inside("CO")] { throwWarning: "El nombre alterno no puede ser el nombre numérico. Puede que lo tengas que invertir con name"; group: "Colombia - Vías"; /* Assertions for unit tests */ assertMatch: "way highway=tertiary alt_name=\"Calle 1\""; assertNoMatch: "way highway=primary name=Rotonda"; assertNoMatch: "way highway=secondary"; assertNoMatch: "way highway=service"; } /***** DIRECCIONES *****/ /* Las direcciones en Colombia, en el nombre de vía solo deben indicar el tipo y número. */ *["addr:street"]["addr:street" !~ /^(Calle|Avenida Calle|Carrera|Avenida Carrera|Transversal|Avenida Transversal|Diagonal|Avenida Diagonal) [0-9]{1,3}[A-Z]{0,1}( Bis( [A-Z]){0,1}){0,1}( Este| Sur| Oeste| Norte){0,1}$/][inside("CO")] { throwWarning: "En las direcciones, los nombres de vías no deben contener abreviaturas, ni deben tener el número del complemento, ni espacios extras"; group: "Colombia - Direcciones"; /* Assertions for unit tests */ assertMatch: "way addr:street=Rotonda"; assertNoMatch: "way addr:street=\"Calle 1\""; } /* El número de casa en la dirección tiene 2 componentes no más. */ *["addr:housenumber"]["addr:housenumber" !~ /^[0-9]{1,3}[A-Z]{0,1}( Bis( [A-Z]){0,1}){0,1}( Este| Sur| Oeste| Norte){0,1}-[1-9][0-9]{0,2}$/][inside("CO")] { throwWarning: "En las direcciones, los números de immueble tienen 2 números separados por guíon, donde el primer número hace referencia a la vía con que hace el cruce, y el segundo es la distancia desde la esquina"; group: "Colombia - Direcciones"; /* Assertions for unit tests */ assertMatch: "way addr:housenumber=56"; assertMatch: "way addr:housenumber=\"61 - 31\""; assertNoMatch: "way addr:housenumber=61-31"; } *["addr:postcode"]["addr:postcode" !~ /^[0-9]{6}$/][inside("CO")] { throwWarning: "Los códigos postales deben ser de 6 dígitos. Para consultarlo ver el visor de códigos postales de 7-24"; group: "Colombia - Direcciones"; fixRemove: "addr:postcode"; /* Assertions for unit tests */ assertMatch: "way addr:postcode=57"; assertMatch: "way addr:postcode=11001"; assertMatch: "way addr:postcode=111111321"; assertNoMatch: "way addr:postcode=111111"; } /***** TELÉFONOS *****/ /* Los número de teléfono de Colombia deben seguir el estándar internacional, no considerarse como llamadas locales. Los números que pueden asignar los operadores son: Claro: 310, 311, 312, 313, 314, 320, 321, 322, 323 Movistar: 315, 316, 317, 318 ETB: 305 VirginMobile: 319 Avantel: 350, 351 Tigo: 300, 301, 302, 324 Tomado de: https://ayuda.tigo.com.co/hc/es/articles/115012920068-Indicativos-telef%C3%B3nicos-Colombia-General Sin embargo, los números pueden cambiar de operador por portabilidad numérica. */ *[/^(phone|phone:mobile|fax|contact:phone|contact:mobile|contact:fax|emergency:phone)$/][/^(phone|phone:mobile|fax|contact:phone|contact:mobile|contact:fax|emergency:phone)$/ !~ /^\+57 (601|602|604|605|606|607|608|300|301|302|305|310|311|312|313|314|315|316|317|318|319|320|321|322|323|324|350|351) [0-9]{7}(;\+57 (601|602|604|605|606|607|608|300|301|302|305|310|311|312|313|314|315|316|317|318|319|320|321|322|323|350|351) [0-9]{7})*$/][inside("CO")] { throwWarning: "Los números de Colombia comienzan con +57, después 3 dígitos de código de área, y finalmente el número como tal"; group: "Colombia - Teléfonos"; /* Assertions for unit tests */ assertNoMatch: "node phone:mobile=\"+57 316 6214030\""; assertMatch: "node phone=\"+57 1 2219872\""; assertMatch: "node emergency:phone=\"+57 1 2222252\""; assertMatch: "node phone=\"316 6214032\""; assertMatch: "node phone=00573166214032"; } /***** LÍMITES *****/ /* Los códigos postales en Colombia a nivel de área tiene 6 dígitos. A nivel de ciudad o municipio tienen 5 dígitos, y a nivel de manzana (código postal ampliado) tienen 9 dígitos. El código postal ampliado no se mapea. */ /* Los límites de códigos postales que no se comparten por admin boundaries, deben contener los números de ambos códigos postales.*/ way["boundary"="postal_code"]["name"]["name" !~ /^[0-9]{6}-[0-9]{6}$/][inside("CO")] { throwWarning: "Los límites entre 2 códigos postales deben contener los códigos postales de cada área, separados por guión"; group: "Colombia - Límites"; /* Assertions for unit tests */ assertNoMatch: "way boundary=postal_code name=111111-111321"; assertMatch: "way boundary=postal_code name=57"; assertMatch: "way boundary=postal_code name=11001"; assertMatch: "way boundary=postal_code name=11001-111112"; assertMatch: "way boundary=postal_code name=11111112"; } /* Los límites de los códigos postales no deben contener la etiqueta postal_code, ya que el límite es usado por 2 códigos. */ way["boundary"="postal_code"]["postal_code"][inside("CO")] { throwWarning: "Los límites de código postal no deben tener la etiqueta postal_code (es solo para la relación)"; group: "Colombia - Límites"; fixRemove: "postal_code"; /* Assertions for unit tests */ assertNoMatch: "way boundary=postal_code name=111111-111321"; assertMatch: "way boundary=postal_code postal_code=57"; assertMatch: "way boundary=postal_code postal_code=11001"; assertMatch: "way boundary=postal_code postal_code=111321-111113"; assertMatch: "way boundary=postal_code postal_code=11111113"; } /* Las relaciones que definen los códigos postales que no son los códigos postales de todo el municipio, tienen un valor de 6 dígitos. */ relation["postal_code"][!"admin_level"]["postal_code" !~ /^[0-9]{6}$/][inside("CO")] { throwWarning: "Los códigos postales en Colombia tienen 6 dígitos (etiqueta postal_code)"; group: "Colombia - Límites"; /* Assertions for unit tests */ assertNoMatch: "relation postal_code=111114"; assertMatch: "relation postal_code=57"; assertMatch: "relation postal_code=11001"; assertMatch: "relation postal_code=11111114"; } /* Las relaciones que definen los códigos postales que son los códigos postales de todo el municipio, tienen un valor de 5 dígitos. */ relation["postal_code"]["admin_level"]["postal_code" !~ /^[0-9]{5}$/][inside("CO")] { throwWarning: "Los códigos postales en Colombia para municipios tienen 5 dígitos (etiqueta postal_code)"; group: "Colombia - Límites"; /* Assertions for unit tests */ assertNoMatch: "relation admin_level=7 postal_code=11001"; assertMatch: "relation admin_level=7 postal_code=57"; assertMatch: "relation admin_level=7 postal_code=111321"; assertMatch: "relation admin_level=7 postal_code=11111114"; } /* Las relaciones que definen las áreas de los códigos postales deben tener 6 dígitos, y el campo name comienza con "Código postal ". */ relation["boundary"="postal_code"]["name"]["name" !~ /^Código postal [0-9]{6}$/]["postal_code"][inside("CO")] { throwWarning: "Los códigos postales en Colombia tienen etiqueta name con el prefijo \"Código postal\""; group: "Colombia - Límites"; /*ToDo fixAdd: "name=Código postal {1.value}";*/ suggestAlternative: "name=\"Código postal {1.value}\""; /* Assertions for unit tests */ assertNoMatch: "relation boundary=postal_code name=\"Código postal 111115\" postal_code=111115"; assertMatch: "relation boundary=postal_code name=57 postal_code=57"; assertMatch: "relation boundary=postal_code name=11001 postal_code=11001"; assertMatch: "relation boundary=postal_code name=11111115 postal_code=11111115"; } /* Las relaciones que definen las áreas de los códigos postales deben tener el mismo código en postal_code y name="Código postal ". */ relation["boundary"="postal_code"]["name"]["postal_code"][substring(tag("name"),14) != tag("postal_code")][inside("CO")] { throwWarning: "El código postal en la etiqueta postal_code debe ser el mismo al final de la etiqueta name"; group: "Colombia - Límites"; /* Assertions for unit tests */ assertNoMatch: "relation boundary=postal_code postal_code=111115 name=\"Código postal 111115\""; assertMatch: "relation boundary=postal_code postal_code=111116 name=\"Código postal 111115\""; } /* No puede haber nodos con código postal. */ node["postal_code"][inside("CO")] { throwWarning: "Un nodo no debe tener un código postal. Esto es para una relación o usar addr:postcode"; group: "Colombia - Límites"; /* Assertions for unit tests */ assertNoMatch: "node name=111116"; assertMatch: "node postal_code=57"; assertMatch: "node postal_code=11001"; assertMatch: "node postal_code=11111116"; }