Me preguntaba cómo implementar una dirigida (o de una cara) Hausdorff función de distancia en PostGIS?
Miré en la PostGIS 2.3.3 código fuente, y parece que ST_HausdorffDistance se implementa como un simple contenedor C de la función que llama a la correspondiente a los GEÓLOGOS una función como la siguiente:
PG_FUNCTION_INFO_V1(hausdorffdistance);
Datum hausdorffdistance(PG_FUNCTION_ARGS)
{
GSERIALIZED *geom1;
GSERIALIZED *geom2;
GEOSGeometry *g1;
GEOSGeometry *g2;
double result;
int retcode;
POSTGIS_DEBUG(2, "hausdorff_distance called");
geom1 = PG_GETARG_GSERIALIZED_P(0);
geom2 = PG_GETARG_GSERIALIZED_P(1);
if ( gserialized_is_empty(geom1) || gserialized_is_empty(geom2) )
PG_RETURN_NULL();
initGEOS(lwpgnotice, lwgeom_geos_error);
g1 = (GEOSGeometry *)POSTGIS2GEOS(geom1);
if ( 0 == g1 ) /* exception thrown at construction */
{
HANDLE_GEOS_ERROR("First argument geometry could not be converted to GEOS");
PG_RETURN_NULL();
}
g2 = (GEOSGeometry *)POSTGIS2GEOS(geom2);
if ( 0 == g2 ) /* exception thrown */
{
HANDLE_GEOS_ERROR("Second argument geometry could not be converted to GEOS");
GEOSGeom_destroy(g1);
PG_RETURN_NULL();
}
retcode = GEOSHausdorffDistance(g1, g2, &result);
GEOSGeom_destroy(g1);
GEOSGeom_destroy(g2);
if (retcode == 0)
{
HANDLE_GEOS_ERROR("GEOSHausdorffDistance");
PG_RETURN_NULL(); /*never get here */
}
PG_FREE_IF_COPY(geom1, 0);
PG_FREE_IF_COPY(geom2, 1);
PG_RETURN_FLOAT8(result);
}
Yo no tengo mucha experiencia con los GEOS o interfaz con PostGIS. La única cosa que he encontrado en GEOS es que en que en geos::algoritmo::distancia::DiscreteHausdorffDistance, se dice que hay un double orientedDistance ()
función miembro. No estoy seguro de si la documentación es aún actual.
Puede que algunos con el conocimiento sugieren cómo adaptar el código anterior para obtener las instrucciones de uso (o de una cara) de la distancia de Hausdorff de GEOS?
--EDIT--
El PostGIS la info de la SELECT postgis_full_version();'
es la siguiente (Ubuntu 16.04).
POSTGIS="2.3.3 r15473" GEOS="3.5.1-CAPI-1.9.1 r4246" SFCGAL="1.2.2" PROJ="Rel. 4.9.2, 08 de septiembre de 2015" GDAL="GDAL 1.11.3, publicado 2015/09/16" LIBXML="2.9.3" LIBJSON="0.11.99" (core procs de "2.3.2 r15302" la necesidad de actualización) TOPOLOGY (topología de los procs de "2.3.2 r15302" necesidad de actualización) de TRAMA (raster procs de "2.3.2 r15302" la necesidad de actualización) (sfcgal los procs de "2.3.2 r15302" la necesidad de actualización)