¿No crees que nuestros funcionarios están algo divorciados de la realidad? ¿Qué no es suficiente para mirar el territorio controlado exclusivamente desde la ventana de la oficina en el centro de la ciudad? ¿Sería bueno para el alcalde de la ciudad caminar por la ciudad en persona de vez en cuando, comunicarse con la gente y responder preguntas en modo en vivo?
Bueno, el conocido bloguero Ilya Varlamov también lo pensó, así que lanzó el proyecto más genial con el desafiante nombre BDSM y específicamente "Big Road With the Mayor" ( enlace al anuncio):
Deja de caminar solo en las ciudades rusas: es hora de invitar a alcaldes, gobernadores y gerentes de ciudades.
Las reglas son simples.
La computadora selecciona aleatoriamente dos direcciones en su ciudad. Después de eso salimos a caminar de una dirección a otra. Una condición: no puedes usar el coche. Solo piernas, una bicicleta, transporte público, un scooter, un equipo de perros. Sin preparación, sin aprobaciones de ruta. A veces los paseos serán largos, a través de toda la ciudad, a veces tendrás que ir solo unas pocas cuadras en el centro. Esta es la condición principal: sin escaparatismo, sin preparación.
Durante la caminata, nosotros, junto con el jefe de la ciudad, estudiamos la infraestructura, nos comunicamos con los residentes. ¡El funcionario tendrá una oportunidad única para contarle a toda Rusia sobre su ciudad, explicarle las complejidades de la gobernanza urbana y acercarse a la gente!

Marco del primer video del proyecto, con la participación de mi servicio para elegir puntos aleatorios
¿Qué tiene que ver Habr con eso? Y la cosa está en la frase sobre elegir al azar la dirección del comienzo y el final de la ruta. Esta no es una tarea tan simple si no desea terminar en la naturaleza de alguna zona industrial o perderse entre las vallas interminables del sector privado. ¡Solo tocar la tarjeta con los ojos vendados no funcionará aquí!
Sobre cómo resolví este problema y qué descubrimientos me presentaron ciudades como Ivanovo o Kirov, debajo del corte.
Dio la casualidad de que ya tenía la experiencia necesaria con mapas y navegación gracias a mi servicio para construir rutas turísticas. Fue a través de un artículo sobre él en el centro que me encontraron y me propusieron desarrollar un sistema que seleccione los puntos de inicio y finalización de la ruta en un mapa de la ciudad.
Idea
Según la idea del equipo de Varlamov, debería haber sido así: los marcadores de los puntos de inicio y finalización saltan de un lado a otro en el mapa de la ciudad, lo que demuestra claramente la aleatoriedad del proceso. El propio alcalde en cualquier momento presiona el botón y detiene la búsqueda. Después de lo cual eligen una ruta (es una pena que, a mano, mi servicio de ruta peatonal pueda ofrecerles algo interesante) y salgan a caminar por la ciudad.
Inicialmente, los requisitos para los puntos fueron los siguientes:
- La distancia entre puntos no es inferior a 3 kilómetros.
- Los puntos no están en la zona industrial ni en el sector privado.
- Los puntos deben ubicarse en diferentes partes de la ciudad, de modo que la ruta entre ellos conduzca a través del centro
Luego, durante el desarrollo, se agregó otro requisito: el servicio debería poder interactuar con el botón rojo grande del hardware, de esta manera:

El botón simplemente envía una señal de clic a la computadora conectada
Toda la dificultad consistía en cómo componer esta ruta de tal manera que se evite la naturaleza salvaje, por un lado, y por otro lado, para cubrir con posibles puntos todos los distritos de la ciudad, y no solo algunos barrios "decentes" en el centro. Al mismo tiempo, inicialmente tenía un cierto conjunto de estereotipos en mi cabeza, que son consecuencia del hecho de que yo mismo vivo en San Petersburgo, además, en ciudades rusas más o menos grandes, solo había unos pocos millones de ciudades como Moscú y Kazan. Pero el proyecto se concentró principalmente en ciudades con una población de 200-500k personas (aparentemente los alcaldes de las ciudades más grandes están demasiado ocupados para caminar por las calles). En general, una vez más recibí confirmación de la tesis de que "Moscú no es Rusia". Todas las consideraciones a continuación son incorrectas:
1) Edificios de gran altura en el centro y zonas industriales y casas particulares en las afueras.
2) Al menos hay una división en cuartos: en un cuarto solo hay edificios de gran altura, en el otro, solo casas privadas. Bueno, ¿quién construirá Jruschov entre las cabañas de madera?
3) El territorio de la ciudad es un polígono simple en el mapa, dentro del cual se encuentran todos los edificios.
4) Bien, puede haber agujeros en el vertedero, pero al menos uno
5) Bueno, no una, pero al menos no más de dos piezas no relacionadas
6) Las ciudades en los datos de OSM están marcadas con las etiquetas apropiadas de uso del suelo y será fácil elegir áreas residenciales
En general, tuve que caminar sobre un rastrillo.
Algoritmo de selección de puntos
Primero, tenía que decidir cómo se elegirían exactamente los puntos de inicio y finalización. Rechacé la idea de lanzar un punto al azar en coordenadas arbitrarias dentro de los límites de la ciudad casi de inmediato. La mayor parte de la ciudad en el mapa es todo tipo de territorios intransitables: polígonos de casas, ríos, simplemente territorios sin marcar en los que no está claro qué se encuentra. Un punto honestamente aleatorio muy a menudo caerá en ellos, tendrá que cambiarlo (lo que afectará bastante la aleatoriedad como resultado) o transferirlo hasta llegar a un lugar adecuado (y esto afectará la velocidad del trabajo).
Como la caminata no necesita un punto arbitrario, sino uno que se pueda alcanzar a pie, decidí tomar puntos solo a lo largo de las carreteras. Como resultado, mi algoritmo toma todos los caminos OSM (Camino con una etiqueta de carretera y valores correspondientes a caminos peatonales y aceras), rompe bordes demasiado largos agregando puntos intermedios (de modo que los puntos vecinos en un borde no estén a más de cien metros entre sí) ), luego elimina puntos que están demasiado cerca el uno del otro (más de 50 metros), por ejemplo, en varias carreteras paralelas.

Se cortaron puntos marcados para Yaroslavl, cuartos de casas privadas y zona industrial a lo largo del ferrocarril
El resultado es una cuadrícula más o menos uniforme que cubre toda la ciudad. Además, al solicitar el siguiente punto, ya no es necesario tirar y hacer cálculos geométricos pesados muchas veces, solo seleccione el par aleatorio apropiado de un conjunto de puntos precalculado.
¿Cómo elegirlos? Tenemos dos requisitos para esto: no más cerca de tres kilómetros el uno del otro y en diferentes partes de la ciudad, por lo que la ruta debe pasar por el centro. Si la primera condición es simple de cumplir, entonces para la segunda necesito determinar el centro real. No extraerá dicha información de los mapas (el centro geométrico de la ciudad no es en absoluto un hecho de que sea su centro histórico).
Para hacer esto, decidí seguir el camino simple y simplemente marcar el centro de la ciudad manualmente. Se agregó la carga de polígonos a GeoJSON, que edité usando el muy conveniente sitio web geojson.io (en serio, si necesita trabajar con geometría 2D simple en su proyecto, geojson.io le permite hacer todo muy rápido y no preocuparse por crear sus propios editores o con utilizando todo tipo de aplicaciones SIG de peso pesado).

Kirov marcado, con un centro marcado (amarillo), áreas eliminadas manualmente (rojo) y un segmento agregado (verde)
Por lo tanto, la primera versión del algoritmo estuvo lista en dos días y comenzó el tiempo de prueba. Y aquí subieron las trampas.
Sector privado
Según las condiciones de la tarea, no se suponía que la ruta comenzara y terminara en el sector privado. Por mi ingenuidad, un residente de una gran ciudad nunca podría haber pensado que las casas privadas de madera podrían estar en una calle vecina de la plaza central de la ciudad. Y no un par de monumentos antiguos como el nuestro, sino, naturalmente, bloques enteros.
La lucha contra estos barrios ocupaba la mayor parte del tiempo. Al principio intenté sobrevivir con datos OSM puros. Hay un significado especial para la etiqueta residencial = rural para áreas rurales y uso de la tierra = asignaciones para todo tipo de jardinería.

Sí, incluso en San Petersburgo hay jardinería incorporada en la ciudad.
Sin embargo, rápidamente se hizo evidente que estas etiquetas se colocan con bastante poca frecuencia, y generalmente se satisfacen solo con el uso más común de la tierra = residencial (área residencial).
El siguiente paso fue un intento de eliminar esos barrios manualmente. Al archivo geojson con el centro de la ciudad, agregué soporte para eliminar áreas manualmente. Desafortunadamente, rápidamente se hizo evidente que muchas iteraciones del ciclo "descargaron el mapa, lo miraron, encontraron el sector privado, lo recortaron en geojson.io, lo descargaron nuevamente" toma mucho tiempo, especialmente en ciudades donde las casas privadas se mezclan con varios pisos y se dispersan en pequeños grupos allí. y aqui Por ejemplo, en Ivanovo.

Los edificios privados y de apartamentos están densamente mezclados entre sí a solo un par de cuadras del centro.
Tuve que idear un algoritmo empírico. Tomé un cuarto (landuse = región residencial, aunque no hay un requisito directo para su uso, generalmente no está marcado por toda la ciudad o región, sino por cuartos separados), tomé todos los edificios dentro de él (polígonos con la etiqueta de edificio) y calculé el área promedio de dicho polígono. Si salía a menos de 400 m2 (la cifra se tomó del techo, con la condición de que las marcas y los cálculos fueran groseros y se encontraran casas largas individuales en tales bloques), entonces el bloque se consideraba un sector privado y se descartaba de los cálculos.
Como resultado, la combinación de estos tres métodos permitió filtrar más o menos eficientemente las áreas indeseables, aunque no sin la participación de mano de obra.
Pero, por supuesto, las excepciones se encontraron más tarde. Por ejemplo Yevpatoriya, donde en general todo el centro histórico es esencialmente las calles estrechas del sector privado. Si lo tiras todo, no quedará nada de la ciudad.

Paisaje típico de Evpatoria a unos cientos de metros del mar.
Especialmente para tales casos, era necesario agregar no solo sectores eliminados manualmente de la ciudad a GeoJSON, sino también agregarlos manualmente. Es decir incluso si el trimestre no cayó en otras condiciones, aún se incluyó en la lista de puntos disponibles para la búsqueda.
Zonas industriales y locales comerciales.
Con las zonas industriales, todo es mucho más simple que con el sector privado. Como regla, ya están marcados con la etiqueta landuse = industrial y no hay problemas con ellos. A menos que haya algunas excepciones cuando no todos los bloques estén marcados, sino edificios separados. Pero como utilicé el código listo para trabajar con mapas de Sight Safari en el proyecto, esto ya se tuvo en cuenta allí.
Landuse = retail tuvo que manipular manualmente los sitios comerciales. Dado que en la mitad de los casos, los grandes mercados o centros comerciales están marcados de esta manera, y en la segunda mitad, los almacenes mayoristas se encuentran en algún lugar en las afueras, o en terminales de carga en general, donde la entrada está prohibida a los extranjeros. La estandarización, como siempre, es poco convincente. Afortunadamente, hay bastantes zonas de este tipo, esta etiqueta no es muy popular, por lo que no fue difícil tratarlas manualmente.
Al mismo tiempo, agregó a su lista de topónimos divertidos que a menudo se encuentran en zonas industriales. Por ejemplo, en Yaroslavl hay Brake Street. Si viviera allí, definitivamente habría establecido una oficina allí para mi oficina de TI.
Sorpresas cartográficas
Aunque ya tenía algo de experiencia con OSM, siempre aparecía algo nuevo.
Por ejemplo, Yaroslavl resultó tener un circuito externo abierto. Visualmente, parece cerrado, pero se refiere a nodos y líneas faltantes. Puede haber un problema de exportación.
Se encontró mucha adicción dentro de los límites de las ciudades. En mi ingenuidad, pensé que la frontera de una ciudad siempre es una simple línea discontinua cerrada. Pero no
Hay ciudades con agujeros. Por ejemplo, Obninsk. Es decir, aquí realmente una pieza dentro de la ciudad no le pertenece administrativamente.

Obninsk con un agujero
Hay ciudades que consisten en varias áreas no relacionadas, como Kirov. Además, si en la parte central de Kirov hay varios barrios, a la izquierda, el más pequeño generalmente es solo un pedazo de la carretera que conduce al aeropuerto, y cuatro casas. ¿Cuál fue la sal para cortar una pieza y unirla a la ciudad?

Kirov consta de tres áreas no relacionadas
Seguramente, si el programa BDSM continúa y sigo participando en él, me familiarizaré con algunas situaciones cartográficas no triviales que no puedo imaginar de inmediato.
Problemas de diseño del mapa
Algunas palabras sobre el marcado OSM.
En las últimas ciudades que procesé, me enfrenté al hecho de que la gente no pone etiquetas de uso de la tierra, o las pone de alguna manera. De hecho, para una persona que está lejos de TI, el significado profundo de estas etiquetas puede no ser muy claro. Bueno, piense que cambian el color del mapa (áreas residenciales grises, áreas industriales rosadas, etc.), parecería sin principios. Y por lo tanto, muchos se relacionan con ellos de manera bastante informal.
Sin embargo, en mi opinión, la fortaleza de OSM radica en la capacidad de mecanizar grandes volúmenes de datos, como lo que hice aquí o en Sight Safari. Simplemente hay muchas tarjetas en Internet, pero no conozco más tarjetas con la capacidad de desinflar toda la geometría y etiquetas y usarlas libremente en mis algoritmos. Y solo para tales fines, estas etiquetas comienzan a jugar un papel importante. Dado que las tareas casi siempre se ven como "encontrar algo allí en áreas de cierto tipo", y la etiqueta de uso del suelo es la primera y más fácil forma de identificar y encontrar las áreas que necesita.
Lo mismo, pero en menor medida, se aplica a un montón de otras etiquetas, por ejemplo, especificando el tipo de uso (bueno, esto no es solo un área residencial, sino un edificio de poca altura). A menudo no se cuecen al vapor, probablemente porque no ven mucho beneficio en ellos. Y, de hecho, si usa solo navegadores y mapas en línea, entonces no son visibles allí. Pero es precisamente para el procesamiento automático de datos cartográficos que pueden proporcionar sugerencias valiosas y simplificar algoritmos.
En general, poner etiquetas, caballeros! Pues por favor!
Y sí, sobre la base de los problemas que encontré, revisé las tarjetas yo mismo y puse algunas etiquetas. Entonces, el beneficio para la comunidad de este proyecto también se obtuvo.
Entonces, ¿a dónde envié al alcalde?
Como no participé en la filmación en sí, y la mayor parte de mi trabajo se completó antes de la filmación del primer episodio, me vi obligado a contentarme con la misma información fragmentaria de fuentes públicas que todos los demás.
En general, era un poco tonto si mi algoritmo los condujera completamente a un desierto. Se volvió especialmente tonto cuando leí esto en una publicación sobre Ivanovo:
Vladimir Sharypov, el alcalde de la ciudad, dejó una buena impresión. Persona abierta y franca. Diría que demasiado franco para un funcionario. La conversación fue interesante. Fuimos a Sort, donde tuvo lugar espontáneamente una reunión con algunos votantes.

Todo estaría bien, pero a las 14 en punto no hay sobrio en Sort. Según los términos del programa, el alcalde debe caminar sin seguridad. Incluso en algún momento pensé que habría una pelea, ya que algunos ciudadanos estaban claramente en una condición inadecuada. Pero no pasó nada.
Y finalmente, se lanzó la primera serie del canal, puedes verla.
Cuando el algoritmo eligió Commodity Lane en el mapa de Yevpatoriya, Ilya también parecía tener dudas, en cualquier caso, preguntó si el alcalde tenía miedo. El nombre es tal que inmediatamente evoca pensamientos de algunas fábricas abandonadas sombrías, caminos sucios y personas oscuras con una mirada dura (perdóname a los habitantes de Eupatoria, si esto no es así).
Conclusión
El trabajo en este proyecto resultó ser interesante. Sin salir de casa, realicé un breve viaje a las ciudades de mi país, las subí con una lupa en todos los mapas posibles y me familiaricé con el sabor cartográfico local. En el camino, también finalicé el código de Sight Safari.
Como puede ver, no es una tarea tan trivial profundizar en los mapas y elegir puntos aleatorios. Y para cada algoritmo obvio, la vida está lista para darle una docena de ciudades donde no funciona.
Como anuncio: actualmente estoy haciendo todo esto en el Instituto de Diseño y Estudios Urbanos de ITMO. Hacemos muchas cosas interesantes relacionadas con TI y datos de la ciudad, si alguien está interesado en este tema, venga a estudiar a la magistratura o al trabajo.
Durante la preparación del proyecto, se utilizó activamente el código y la experiencia del proyecto Sight Safari , un navegador para buscar rutas turísticas.
Y finalmente: ¿crees que esta iniciativa es útil, tales caminatas con alcaldes? ¿Cambiarán algo? ¿Qué preguntas le harías al alcalde de tu ciudad?