From f4c207b85653efc53e41dcf329e0e3efe9c68bf3 Mon Sep 17 00:00:00 2001 From: Regina Obe Date: Fri, 3 May 2013 04:12:36 +0000 Subject: [PATCH] #1818: geohash one more file forgot to commit. git-svn-id: http://svn.osgeo.org/postgis/trunk@11343 b70326c6-7e19-0410-871a-916f4a2858ee --- postgis/lwgeom_in_geohash.c | 121 ++++++++++++++++++++++++++++++++++++ 1 file changed, 121 insertions(+) create mode 100644 postgis/lwgeom_in_geohash.c diff --git a/postgis/lwgeom_in_geohash.c b/postgis/lwgeom_in_geohash.c new file mode 100644 index 000000000..c1163a8cc --- /dev/null +++ b/postgis/lwgeom_in_geohash.c @@ -0,0 +1,121 @@ +/********************************************************************** + * + * PostGIS - Spatial Types for PostgreSQL + * Copyright 2012 J Smith + * + * This is free software; you can redistribute and/or modify it under + * the terms of the GNU General Public Licence. See the COPYING file. + * + **********************************************************************/ + +#include + +#include "postgres.h" + +#include "../postgis_config.h" +#include "lwgeom_pg.h" +#include "liblwgeom.h" + +Datum box2d_from_geohash(PG_FUNCTION_ARGS); +Datum point_from_geohash(PG_FUNCTION_ARGS); + +static void geohash_lwerror(char *msg, int error_code) +{ + POSTGIS_DEBUGF(3, "ST_Box2dFromGeoHash ERROR %i", error_code); + lwerror("%s", msg); +} + +#include "lwgeom_export.h" + +GBOX* +parse_geohash(char *geohash, int precision) +{ + GBOX *box = NULL; + double lat[2], lon[2]; + + POSTGIS_DEBUG(2, "parse_geohash called."); + + if (NULL == geohash) + { + geohash_lwerror("invalid GeoHash representation", 2); + } + + decode_geohash_bbox(geohash, lat, lon, precision); + + POSTGIS_DEBUGF(2, "ST_Box2dFromGeoHash sw: %.20f, %.20f", lon[0], lat[0]); + POSTGIS_DEBUGF(2, "ST_Box2dFromGeoHash ne: %.20f, %.20f", lon[1], lat[1]); + + box = gbox_new(gflags(0, 0, 1)); + + box->xmin = lon[0]; + box->ymin = lat[0]; + + box->xmax = lon[1]; + box->ymax = lat[1]; + + POSTGIS_DEBUG(2, "parse_geohash finished."); + return box; +} + +PG_FUNCTION_INFO_V1(box2d_from_geohash); +Datum box2d_from_geohash(PG_FUNCTION_ARGS) +{ + GBOX *box = NULL; + text *geohash_input = NULL; + char *geohash = NULL; + int precision = -1; + + if (PG_ARGISNULL(0)) + { + PG_RETURN_NULL(); + } + + if (!PG_ARGISNULL(1)) + { + precision = PG_GETARG_INT32(1); + } + + geohash_input = PG_GETARG_TEXT_P(0); + geohash = text2cstring(geohash_input); + + box = parse_geohash(geohash, precision); + + PG_RETURN_POINTER(box); +} + +PG_FUNCTION_INFO_V1(point_from_geohash); +Datum point_from_geohash(PG_FUNCTION_ARGS) +{ + GBOX *box = NULL; + LWPOINT *point = NULL; + GSERIALIZED *result = NULL; + text *geohash_input = NULL; + char *geohash = NULL; + double lon, lat; + int precision = -1; + + if (PG_ARGISNULL(0)) + { + PG_RETURN_NULL(); + } + + if (!PG_ARGISNULL(1)) + { + precision = PG_GETARG_INT32(1); + } + + geohash_input = PG_GETARG_TEXT_P(0); + geohash = text2cstring(geohash_input); + + box = parse_geohash(geohash, precision); + + lon = box->xmin + (box->xmax - box->xmin) / 2; + lat = box->ymin + (box->ymax - box->ymin) / 2; + + point = lwpoint_make2d(SRID_UNKNOWN, lon, lat); + result = geometry_serialize((LWGEOM *) point); + + lwfree(box); + + PG_RETURN_POINTER(result); +} -- 2.40.0