# Introducción

MobilityDB es una extensión de PostgreSQL y PostGIS que proporciona tipos temporales. Dichos tipos de datos representan la evolución en el tiempo de los valores de algún tipo de elemento, llamado tipo base del tipo temporal. Por ejemplo, se pueden usar enteros temporales para representar la evolución en el tiempo de la marchar utilizada por un automóvil en movimiento. En este caso, el tipo de datos es entero temporal y el tipo base es entero. Del mismo modo, se puede utilizar un número flotante temporal para representar la evolución en el tiempo de la velocidad de un automóvil. Como otro ejemplo, se puede usar un punto temporal para representar la evolución en el tiempo de la ubicación de un automóvil, como lo reportan los dispositivos GPS. Los tipos temporales son útiles porque representar valores que evolucionan en el tiempo es esencial en muchas aplicaciones, por ejemplo, en aplicaciones de movilidad. Además, los operadores de los tipos base (como los operadores aritméticos y la agregación para números enteros y flotantes, las relaciones topológicas y la distancia para las geometrías) se pueden generalizar intuitivamente cuando los valores evolucionan en el tiempo.

MobilityDB proporciona los siguientes tipos temporales: `tbool`, `tint`, `tfloat`, `ttext`, `tgeometry`, `tgeography`, `tgeompoint` y `tgeogpoint`. Estos tipos temporales se basan, respectivamente, en los tipos de base `bool`, `integer`, `float` y `text` proporcionados por PostgreSQL, y en los tipos base de `geometry` y `geography` proporcionados por PostGIS, donde `tgeometry` y `tgeography` aceptan geometrías/geografías arbitrarias, mientras que `tgeompoint` y `tgeogpoint` solo aceptan puntos 2D o 3D.

Aunque los puntos temporales 4D se pueden representar, la dimensión M actualmente no se tiene en cuenta.

Además, MobilityDB proporciona los tipos de plantilla set, span y span set para representar, respectivamente, un conjunto de valores, un rango de valores y un conjunto de rangos de valores de tipos de base o tipos de tiempo. Ejemplos de valores de tipos de conjunto son `intset`, `floatset` y `tstzset`, donde el último representa un conjunto de valores `timestamptz`. Ejemplos de valores de tipos de rango son `intspan`, `floatspan` y `tstzspan`. Ejemplos de valores de tipos de conjuntos de rangos son `intspanset`, `floatspanset` y `tstzspanset`.

## Comité directivo del proyecto

El comité directivo del proyecto MobilityDB (Project Steering Committee o PSC) coordina la dirección general, los ciclos de publicación, la documentación y los esfuerzos de divulgación para el proyecto MobilityDB. Además, el PSC proporciona soporte general al usuario, acepta y aprueba parches de la comunidad general de MobilityDB y vota sobre diversos problemas relacionados con MobilityDB, como el acceso de commit de los desarrolladores, nuevos miembros del PSC o cambios significativos en la interfaz de programación de aplicaciones (Application Programming Interface o API).

A continuación se detallan los miembros actuales en orden alfabético y sus principales responsabilidades:

- Mohamed Bakli: MobilityDB-docker, versiones distribuidas y en la nube, integración con Citus

- Krishna Chaitanya Bommakanti: MEOS (Mobility Engine Open Source), pyMEOS

- Anita Graser: integración con Moving Pandas y el ecosistema de Python, integración con QGIS

- Darafei Praliaskouski: integración con PostGIS

- Mahmoud Sakr: cofundador del proyecto MobilityDB, MobilityDB workshop, copresidente del OGC Moving Feature Standard Working Group (MF-SWG)

- Vicky Vergara: integración con pgRouting, enlace con OSGeo

- Esteban Zimányi (chair): cofundador del proyecto MobilityDB, coordinación general del proyecto, principal contribuidor del código de backend, BerlinMOD generator

## Otros colaboradores del código

- Arthur Lesuisse

- Xinyiang Li

- Maxime Schoemans

## Patrocinadores

Estas son organizaciones de financiación de investigación (en orden alfabético) que han contribuido con financiación monetaria al proyecto MobilityDB.

- European Commission

- Fonds de la Recherche Scientifique (FNRS), Belgium

- Innoviris, Belgium

Estas son entidades corporativas (en orden alfabético) que han contribuido con tiempo de desarrollador o financiación monetaria al proyecto MobilityDB.

- Adonmo, India

- Georepublic, Germany

- Université libre de Bruxelles, Belgium

## Licencias

Las siguientes licencias se pueden encontrar en MobilityDB:

Recurso | Licencia
Código MobilityDB | Licencia PostgreSQL
Documentación MobilityDB | Licencia Creative Commons Attribution-Share Alike 3.0

## Instalación a partir de las fuentes

### Versión corta

Para compilar asumiendo que tiene todas las dependencias en su ruta de búsqueda

    git clone https://github.com/MobilityDB/MobilityDB
    mkdir MobilityDB/build
    cd MobilityDB/build
    cmake  ..
    make
    sudo make install

Los comandos anteriores instalan la rama `master`. Si desea instalar otra rama, por ejemplo, `develop`, puede reemplazar el primer comando anterior de la siguiente manera:

    git clone --branch develop https://github.com/MobilityDB/MobilityDB

También debe configurar lo siguiente en el archivo `postgresql.conf` según la versión de PostGIS que haya instalado (a continuación usamos PostGIS 3):

    shared_preload_libraries = 'postgis-3'
    max_locks_per_transaction = 128

Si no carga previamente la biblioteca PostGIS con la configuración anterior, no podrá cargar la biblioteca MobilityDB y obtendrá un mensaje de error como el siguiente:

    ERROR:  could not load library "/usr/local/pgsql/lib/libMobilityDB-1.1.so":
      undefined symbol: ST_Distance

Puede encontrar la ubicación del archivo `postgresql.conf` de la manera siguiente.

    $ which postgres
    /usr/local/pgsql/bin/postgres
    $ ls /usr/local/pgsql/data/postgresql.conf
    /usr/local/pgsql/data/postgresql.conf

Como puede verse, los binarios de PostgreSQL están en el subdirectorio `bin` mientras que el archivo `postgresql.conf` está en el subdirectorio `data`.

Una vez que MobilityDB está instalado, debe habilitarse en cada base de datos en la que desee usarlo. En el siguiente ejemplo, usamos una base de datos llamada `mobility`.

    createdb mobility
    psql mobility -c "CREATE EXTENSION PostGIS"
    psql mobility -c "CREATE EXTENSION MobilityDB"

Las dos extensiones PostGIS y MobilityDB también se pueden crear en un solo comando.

    psql mobility -c "CREATE EXTENSION MobilityDB cascade"

### Obtener las fuentes

La última versión de MobilityDB se puede encontrar en

wget

Para descargar esta versión:

    wget -O mobilitydb-1.3.tar.gz https://github.com/MobilityDB/MobilityDB/archive/v1.3.tar.gz

Ir a la short_version para las instrucciones de extracción y compilación.

git

Para descargar el repositorio

    git clone https://github.com/MobilityDB/MobilityDB.git
    cd MobilityDB
    git checkout v1.3

Ir a la short_version para las instrucciones de compilación (no hay tar ball).

### Habilitación de la base de datos

MobilityDB es una extensión que depende de PostGIS. Habilitar PostGIS antes de habilitar MobilityDB en la base de datos se puede hacer de la siguiente manera

    CREATE EXTENSION postgis;
    CREATE EXTENSION mobilitydb;

Alternativamente, esto se puede hacer con un solo comando usando `CASCADE`, que instala la extensión PostGIS requerida antes de instalar la extensión MobilityDB

    CREATE EXTENSION mobilitydb CASCADE;

### Dependencias

Dependencias de compilación

Para poder compilar MobilityDB, asegúrese de que se cumplan las siguientes dependencias:

- Sistema de compilación multiplataforma `CMake`.

- Compilador C `gcc` o `clang`. Se pueden usar otros compiladores ANSI C, pero pueden causar problemas al compilar algunas dependencias.

- GNU Make (`gmake` o `make`) versión 3.1 o superior. Para muchos sistemas, GNU make es la versión predeterminada de make. Verifique la versión invocando `make -v`.

- PostgreSQL versión 12 o superior. PostgreSQL está disponible en http://www.postgresql.org.

- PostGIS versión 3 o superior. PostGIS está disponible en https://postgis.net/.

- Biblioteca científica GNU (GSL). GSL está disponible en https://www.gnu.org/software/gsl/. GSL se utiliza para los generadores de números aleatorios.

Nótese que PostGIS tiene sus propias dependencias, como Proj, GEOS, LibXML2 o JSON-C y estas bibliotecas también se utilizan en MobilityDB. Consulte http://trac.osgeo.org/postgis/wiki/UsersWikiPostgreSQLPostGIS para obtener una matriz de compatibilidad de PostGIS con PostgreSQL, GEOS y Proj.

Dependencias opcionales

Para la documentación del usuario

- Los archivos DocBook DTD y XSL son necesarios para crear la documentación. Para Ubuntu, son proporcionados por los paquetes `docbook` y `docbook-xsl`.

- El validador XML `xmllint` es necesario para validar los archivos XML de la documentación. Para Ubuntu, lo proporciona el paquete `libxml2`.

- El procesador XSLT `xsltproc` es necesario para crear la documentación en formato HTML. Para Ubuntu, lo proporciona el paquete `libxslt`.

- El programa `dblatex` es necesario para crear la documentación en formato PDF. Para Ubuntu, lo proporciona el paquete `dblatex`.

- El programa `dbtoepub` es necesario para construir la documentación en formato EPUB. Para Ubuntu, lo proporciona el paquete `dbtoepub`.

Para la documentación de los desarrolladores

- El programa `doxygen` es necesario para construir la documentación. Para Ubuntu, lo proporciona el paquete `doxygen`.

Ejemplo: instalar dependencias en Linux

Dependencias de base de datos

    sudo apt-get install postgresql-16 postgresql-server-dev-16 postgresql-16-postgis

Dependencias de construcción

    sudo apt-get install cmake gcc libgsl-dev

### Configuración

MobilityDB usa el sistema `cmake` para realizar la configuración. El directorio de compilación deber ser diferente del directorio de origen.

Para crear el directorio de compilación

    mkdir build

Para ver las variables que se pueden configurar

    cd build
    cmake -L ..

### Construir e instalar

Nótese que la versión actual de MobilityDB solo se ha probado en sistemas Linux, MacOS y Windows. Puede funcionar en otros sistemas similares a Unix, pero no se ha probado. Buscamos voluntarios que nos ayuden a probar MobilityDB en múltiples plataformas.

Las siguientes instrucciones comienzan desde `path/to/MobilityDB` en un sistema Linux

    mkdir build
    cd build
    cmake ..
    make
    sudo make install

Cuando cambia la configuración

    rm -rf build

e inicie el proceso de construcción como se mencionó anteriormente.

### Pruebas

MobilityDB utiliza `ctest`, el programa controlador de pruebas de CMake, para realizar pruebas. Este programa ejecutará las pruebas e informará los resultados.

Para ejecutar todas las pruebas

    ctest

Para ejecutar un archivo de prueba dado

    ctest -R '021_tbox'

Para ejecutar un conjunto de archivos de prueba determinados se pueden utilizar comodines

    ctest -R '022_*'

### Documentación

La documentación del usuario de MobilityDB se puede generar en formato HTML, PDF y EPUB. Además, la documentación está disponible en inglés y en otros idiomas (actualmente, solo en español). La documentación del usuario se puede generar en todos los formatos y en todos los idiomas, o se pueden especificar formatos y/o idiomas específicos. La documentación del desarrollador de MobilityDB solo se puede generar en formato HTML y en inglés.

Las variables utilizadas para generar la documentación del usuario y del desarrollador son las siguientes:

### Variables para la documentación del usuario y del desarrollador

Variable | Valor por defecto | Comentario
`DOC_ALL` | `BOOL=OFF` | La documentación del usuario se genera en formatos HTML, PDF y EPUB.
`DOC_HTML` | `BOOL=OFF` | La documentación del usuario se genera en formato HTML.
`DOC_PDF` | `BOOL=OFF` | La documentación del usuario se genera en formato PDF.
`DOC_EPUB` | `BOOL=OFF` | La documentación del usuario se genera en formato EPUB.
`LANG_ALL` | `BOOL=OFF` | La documentación del usuario se genera en inglés y en todas las traducciones disponibles.
`ES` | `BOOL=OFF` | La documentación del usuario se genera en inglés y en español.
`DOC_DEV` | `BOOL=OFF` | La documentación del desarrollador en inglés se genera en formato HTML

Generar la documentación del usuario y del desarrollador en todos los formatos y en todos los idiomas.

    cmake -D DOC_ALL=ON -D LANG_ALL=ON -D DOC_DEV=ON ..
    make doc
    make doc_dev

Generar la documentación del usuario en formato HTML y en todos los idiomas.

    cmake -D DOC_HTML=ON -D LANG_ALL=ON ..
    make doc

Generar la documentación del usuario en inglés en todos los formatos.

    cmake -D DOC_ALL=ON ..
    make doc

Generar la documentación del usuario en formato PDF en inglés y en español.

    cmake -D DOC_PDF=ON -D ES=ON ..
    make doc

## Instalación a partir de binarios

### Distribuciones de Linux basadas en Debian

Se está desarrollando soporte para sistemas Linux basados en Debian, como Ubuntu y Arch Linux.

### Windows

Desde la versión 3.3.3 de PostGIS, MobilityDB se distribuye en el PostGIS Bundle para Windows, que está disponible en application stackbuilder y en el sitio web de OSGeo. Para más information refiérase a la documentación PostGIS.

## Soporte

El soporte de la comunidad de MobilityDB está disponible a través de la página github de MobilityDB, documentación, tutoriales, listas de correo y otros.

### Reporte de problemas

Los errores son registrados y manejados en un issue tracker. Por favor siga los siguientes pasos:

1. Busque las entradas para ver si su problema ya ha sido informado. Si es así, agregue cualquier contexto adicional que haya encontrado, o al menos indique que usted también está teniendo el problema. Esto nos ayudará a priorizar los problemas comunes.

2. Si su problema no se ha informado, cree un nuevo asunto para ello.

3. En su informe, incluya instrucciones explícitas para replicar su problema. Las mejores etradas incluyen consultas SQL exactas que se necesitan para reproducir un problema. Reporte también el sistema operativo y las versiones de MobilityDB, PostGIS y PostgreSQL.

4. Se recomienda utilizar el siguiente envoltorio en su problema para determinar el paso que está causando el problema.

       SET client_min_messages TO debug;
       <your code>
       SET client_min_messages TO notice;

### Listas de correo

Hay dos listas de correo para MobilityDB alojadas en el servidor de listas de correo OSGeo:

- Lista de correo de usuarios: http://lists.osgeo.org/mailman/listinfo/mobilitydb-users

- Lista de distribución de desarrolladores: http://lists.osgeo.org/mailman/listinfo/mobilitydb-dev

Para preguntas generales y temas sobre cómo usar MobilityDB, escriba a la lista de correo de usuarios.

## Migración de la versión 1.0 a la versión 1.1

MobilityDB 1.1 es una revisión importante con respecto a la versión inicial 1.0. El cambio más significativo en la version 1.1 fue extraer la funcionalidad central para la gestión de datos temporales y espaciotemporales de MobilityDB en la bibilioteca C Mobility Engine Open Source (MEOS). De esta forma, la misma funcionalidad que proporciona MobilityDB en un entorno de base de datos está disponible en un programa C para ser utilizada, por ejemplo, en un entorno de streaming. La biblioteca MEOS para la gestión de la movilidad proporciona una funcionalidad similar a la biblioteca C/C++ Geometry Engine Open Source (GEOS) para geometría computacional. Además, están disponibles contenedores para la biblioteca MEOS en otros lenguajes de programación, en particular para Python con PyMEOS. Además, contenedores para C#, Java y Javascript, están en desarrollando.

Fueron necesarios varios cambios con respecto a la versión 1.0 de MobilityDB para habilitar lo anterior. Uno importante fue la definición de nuevos tipos de datos `span` y `spanset`, que brindan una funcionalidad similar a los tipos de datos de PostgreSQL `range` y `multirange` pero también se puede usar en varios lenguajes de programación independientemente de PostgreSQL. Estos son tipos de plantilla, lo que significa que son contenedores de otros tipos, de forma similar a como las listas y matrices contienen valores de otros tipos. Además, también se agregó un nuevo tipo de datos de plantilla `set`. Por lo tanto, los tipos `timestampset`, `period` y `periodset` en la versión 1.0 se reemplazan por los tipos `tstzset`, `tstzspan` y `tstzspanset` en la versión 1.1. El nombre de las funciones constructoras para estos tipos se modificó en consecuencia.

Finalmente, se simplificó la API de MEOS y MobilityDB para mejorar la usabilidad. Detallamos a continuación los cambios más importantes en la API.

- Las funciones `atTimestamp`, `atTimestampSet`, `atPeriod`, and `atPeriodSet` fueron renombradas a `atTime`.

- Las funciones `minusTimestamp`, `minusTimestampSet`, `minusPeriod` y `minusPeriodSet` fueron renombradas a `minusTime`.

- Las funciones `atValue`, `atValues`, `atRange` y `atRanges` fueron renombradas a `atValues`.

- Las funciones `minusValue`, `minusValues`, `minusRange` y `minusRanges` fueron renombradas a `minusValues`.

- Las funciones `contains`, `disjoint`, `dwithin`, `intersects` y `touches` fueron renombradas, respectivamente, a `eContains`, `eDisjoint`, `eDwithin`, `eIntersects` y `eTouches`.