Geolocalizando tweets

en tiempo real

Disclaimers

El objetivo de este experimento no consistía en buscar formas precisas de inferir la geolocalización de los tweets.

 

Los objetivos eran más bien:

  • Experimentar y entender las posibilidades de la tecnología.

  • Entender mejor la complejidad, limitaciones y posibles aplicaciones de geolocalizar información en tiempo real. 

Todo el código que vamos a ver hoy está publicado en github.com/esri-es y cualquiera puede hacer uso libre de él.

Consideramos que el código JavaScript que vamos a ver es bastante avanzado, para poder seguirlo es recomendable estar familiarizado con conceptos de:

 

NodeJS, debbuging, asincronía/promesas, websockets, node-streams, ES6, expresiones regulares, consola de comandos, etc.

Para poder ejecutar este proyecto es suficiente con disponer de una cuenta gratuita para desarrolladores de ArcGIS que puede crearse en developers.arcgis.com/sign-up.

Todo lo que vas a ver ha sido desarrollado por @ntkog y @hhkaos desde el departamento de Tecnología e Innovación de Esri España con fines puramente didácticos y experimentales.

Bocetos del experimento

Resultado del experimento

Pasos para lanzar el proyecto

Vas a necesitar cinco terminales

Terminal 1

$ websocat -E -t ws-l:127.0.0.1:8888 broadcast:mirror:

Instala websocat y ejecuta:

Terminal 2

$ git clone git@github.com:esri-es/twitter-rt-service.git
$ cd twitter-rt-service && npm install
$ open https://developer.twitter.com/en/apps
$ touch config/twitter_credentials.json 
$ echo '{\n "consumer_key": "YOUR_CONSUMER_KEY",\n "consumer_secret": "YOUR_CONSUMER_SECRET",\n "token": "YOUR_TOKEN",\n "token_secret": "YOUR_TOKEN_SECRET"\n}' >> ./config/twitter_credentials.json
$ node emitter.js "PP,PSOE,CIUDADANOS,PODEMOS,VOX"

Descarga, configura y ejecuta twitter-rt-service 
(necesitarás tener instalado
NodeJS)

Terminal 3

$ ngrok http 9000

Instala ngrok y ejecuta:

Terminal 4

$ git clone git@github.com:esri-es/arcgis_websocket_server.git
$ cd arcgis_websocket_server && git checkout develop && npm install
$ NGROK=<TU_ID>.ngrok.io node init.js "ws://localhost:8888" "4.11"

Descarga arcgis_websocket_server y ejecuta

Terminal 5

$ npm install http-server -g
$ http-server -p 9090

Desde la carpeta de arcgis_websocket_server/example: lanzamos un servidor estático usando http-server.

Demos

Debugging (opcional)

$ NGROK=<TU_ID>.ngrok.io node --inspect-brk init.js "ws://localhost:8888" "4.11"
$ node --inspect-brk emitter.js "PP,PSOE,CIUDADANOS,PODEMOS,VOX"

Abrir interfaz de debugging: chrome://inspect

Procesamiento por tweet: twitter-rt-service | PDF

Estructura de ficheros del proyecto: twitter-rt-service

- config
    - elections.js                  // Parámetros de configuración
- data
    - db.json                       // Caché ubicaciones encontradas
    - notFoundLocations.json        // Caché de ubicaciones no encontradas
    - spain-boundaries.json         // Límites territoriales de España
    - spanish-ccaa-boundaries.json  // Límites por CCAA
- lib
    - helpers
        - elections.js (~40)        // Método: mapping_parties
        - ws_client_stream.js (~10) // Conexión para enviar el tweet al ws
    - batch_geocoder.js (~40)       // Método: tryGeocoders
    - elections_stream.js (~180)    // Flujo principal de la app
    - twitter_stream.js (~40)       // Conexión a la Stream API de twitter
- src
    - external_geocoders.js (~140)  // Métodos: arcgis, osm, arcgisGlobal, etc
    - geocoder_utils.js (~80)       // Método: normalize (niveles administrativos)
    - geocoders.js (~60)            // Método: find (para geocodificar)
    - locationUtils.js (~70)        // Métodos: randomize y findCCAA
emmiter.js (~10)                    // Punto de entrada de la app
  • Configurar preferencias en la geocodificación
    Por ej: poder descartar o priorizar niveles administrativos
     
  • Guardar en el CSV todos los enriquecimientos
    CCAA, mapping_parties, etc
     
  • Seguir enriqueciendo los tweets:
    • Rating para distinguir twitteros veteranos de bots
    • Info sobre el tamaño de la extensión del randomize
    • Análisis de sentimiento
    • etc.
       
  • Enriquecer notFoundLocations.json

Mejoras pendientes | Github issues

Funcionamiento: arcgis_websocket_server | PDF

Estructura de ficheros del proyecto: arcgis_websocket_server

- example
    - index.html (~220)               // Página HTML para probar el stream service
- streamserver
    - pipelines
        - custom.js (~60)             // Método: adaptPayload (proyectar WGS84 a Web Mercator)
        - default.js (~30)            // Filtros genéricos + llamada a adaptPayload
    - utils
        - esri_types.js (~60)         // Método: convertToEsriFields (inferir tipos del payload)
        - filter_utils.js (~115)      // Método: evaluateQuery (adaptar filtro a regex)
    - streamserver_simple.js (~210)   // Flujo principal de la aplicación
- templates
    - service.json (~50)              // Esquema de respuesta de un StreamLayer de ArcGIS
- utils
    - websocket_utils.js (~45)        // Comprueba la conexión al cliente de websocket
init.js (~30)                         // Punto de entrada de la app
  • Soportar autenticación para securizar servicios
     
  • Soportar filtros espaciales
     
  • Generalizar el comportamiento para que no sea necesario indicar qué versión de la API JS se está conectado
     
  • Bugs:
    • Resolver problema con los filtros (where)
    • Resolver problema con la carga en web maps

Mejoras pendientes | Github issues

¿Preguntas?

bit.ly/geotweets19

Geolocalizando Tweets en tiempo real

By Raul Jimenez Ortega

Geolocalizando Tweets en tiempo real

  • 1,720