Datum LWGEOM_recv(PG_FUNCTION_ARGS) { StringInfo buf = (StringInfo) PG_GETARG_POINTER(0); int32 geom_typmod = -1; GSERIALIZED *geom; LWGEOM *lwgeom; if ( (PG_NARGS()>2) && (!PG_ARGISNULL(2)) ) { geom_typmod = PG_GETARG_INT32(2); } lwgeom = lwgeom_from_wkb((uint8_t*)buf->data, buf->len, LW_PARSER_CHECK_ALL); if ( lwgeom_needs_bbox(lwgeom) ) lwgeom_add_bbox(lwgeom); /* Set cursor to the end of buffer (so the backend is happy) */ buf->cursor = buf->len; geom = geometry_serialize(lwgeom); lwgeom_free(lwgeom); if ( geom_typmod >= 0 ) { postgis_valid_typmod(geom, geom_typmod); POSTGIS_DEBUG(3, "typmod and geometry were consistent"); } else { POSTGIS_DEBUG(3, "typmod was -1"); } PG_RETURN_POINTER(geom); }
Datum geography_recv(PG_FUNCTION_ARGS) { StringInfo buf = (StringInfo) PG_GETARG_POINTER(0); int32 geog_typmod = -1; LWGEOM *lwgeom = NULL; GSERIALIZED *g_ser = NULL; if ( (PG_NARGS()>2) && (!PG_ARGISNULL(2)) ) { geog_typmod = PG_GETARG_INT32(2); } lwgeom = lwgeom_from_wkb((uint8_t*)buf->data, buf->len, LW_PARSER_CHECK_ALL); /* Error on any SRID != default */ srid_is_latlong(fcinfo, lwgeom->srid); g_ser = gserialized_geography_from_lwgeom(lwgeom, geog_typmod); /* Clean up temporary object */ lwgeom_free(lwgeom); /* Set cursor to the end of buffer (so the backend is happy) */ buf->cursor = buf->len; PG_RETURN_POINTER(g_ser); }
Datum LWGEOM_from_WKB(PG_FUNCTION_ARGS) { bytea *bytea_wkb = (bytea*)PG_GETARG_BYTEA_P(0); int32 srid = 0; GSERIALIZED *geom; LWGEOM *lwgeom; uint8_t *wkb = (uint8_t*)VARDATA(bytea_wkb); lwgeom = lwgeom_from_wkb(wkb, VARSIZE(bytea_wkb)-VARHDRSZ, LW_PARSER_CHECK_ALL); if ( lwgeom_needs_bbox(lwgeom) ) lwgeom_add_bbox(lwgeom); geom = geometry_serialize(lwgeom); lwgeom_free(lwgeom); PG_FREE_IF_COPY(bytea_wkb, 0); if ( gserialized_get_srid(geom) != SRID_UNKNOWN ) { elog(WARNING, "OGC WKB expected, EWKB provided - use GeometryFromEWKB() for this"); } if ( PG_NARGS() > 1 ) { srid = PG_GETARG_INT32(1); if ( srid != gserialized_get_srid(geom) ) gserialized_set_srid(geom, srid); } PG_RETURN_POINTER(geom); }
static VALUE get_length_from_wkb(VALUE self, VALUE geom_wkb) { int wkb_size_a; wkb_size_a = RSTRING_LEN(geom_wkb); lwg = lwgeom_from_wkb(RSTRING_PTR(geom_wkb), wkb_size_a, 0); double area = get_length_for_lwg(); return rb_float_new(area); }
Datum geography_from_binary(PG_FUNCTION_ARGS) { char *wkb_bytea = (char*)PG_DETOAST_DATUM(PG_GETARG_DATUM(0)); GSERIALIZED *gser = NULL; size_t wkb_size = VARSIZE(wkb_bytea); uint8_t *wkb = (uint8_t*)VARDATA(wkb_bytea); LWGEOM *lwgeom = lwgeom_from_wkb(wkb, wkb_size, LW_PARSER_CHECK_NONE); if ( ! lwgeom ) lwerror("Unable to parse WKB"); gser = gserialized_geography_from_lwgeom(lwgeom, 0); lwgeom_free(lwgeom); PG_RETURN_POINTER(gser); }
LWGEOM* lwgeom_from_hexwkb(const char *hexwkb, const char check) { int hexwkb_len; uint8_t *wkb; LWGEOM *lwgeom; if ( ! hexwkb ) { lwerror("lwgeom_from_hexwkb: null input"); return NULL; } hexwkb_len = strlen(hexwkb); wkb = bytes_from_hexbytes(hexwkb, hexwkb_len); lwgeom = lwgeom_from_wkb(wkb, hexwkb_len/2, check); lwfree(wkb); return lwgeom; }
// trying to make polygon to be valid // accept only string-polygon in wkb format static VALUE make_valid(VALUE self, VALUE geom_wkb) { VALUE result; LWGEOM *valid_lwg; int wkb_size_a; wkb_size_a = RSTRING_LEN(geom_wkb); lwg = lwgeom_from_wkb(RSTRING_PTR(geom_wkb), wkb_size_a, 0); valid_lwg = lwgeom_make_valid(lwg); //make multi valid_lwg = lwgeom_as_multi(valid_lwg); char *wkb_str = (char*)lwgeom_to_wkb(valid_lwg, WKB_HEX, NULL); return rb_str_new2(wkb_str); }
static void cu_wkb_in(char *wkt) { LWGEOM_PARSER_RESULT pr; LWGEOM *g_a, *g_b; uint8_t *wkb_a, *wkb_b; size_t wkb_size_a, wkb_size_b; /* int i; char *hex; */ if ( hex_a ) free(hex_a); if ( hex_b ) free(hex_b); /* Turn WKT into geom */ lwgeom_parse_wkt(&pr, wkt, LW_PARSER_CHECK_NONE); if ( pr.errcode ) { printf("ERROR: %s\n", pr.message); printf("POSITION: %d\n", pr.errlocation); exit(0); } /* Get the geom */ g_a = pr.geom; /* Turn geom into WKB */ wkb_a = lwgeom_to_wkb(g_a, WKB_NDR | WKB_EXTENDED, &wkb_size_a); /* Turn WKB back into geom */ g_b = lwgeom_from_wkb(wkb_a, wkb_size_a, LW_PARSER_CHECK_NONE); /* Turn geom to WKB again */ wkb_b = lwgeom_to_wkb(g_b, WKB_NDR | WKB_EXTENDED, &wkb_size_b); /* Turn geoms into WKB for comparisons */ hex_a = hexbytes_from_bytes(wkb_a, wkb_size_a); hex_b = hexbytes_from_bytes(wkb_b, wkb_size_b); /* Clean up */ lwfree(wkb_a); lwfree(wkb_b); lwgeom_parser_result_free(&pr); lwgeom_free(g_b); }
Datum LWGEOMFromWKB(PG_FUNCTION_ARGS) { bytea *bytea_wkb = (bytea*)PG_GETARG_BYTEA_P(0); int32 srid = 0; GSERIALIZED *geom; LWGEOM *lwgeom; uint8_t *wkb = (uint8_t*)VARDATA(bytea_wkb); lwgeom = lwgeom_from_wkb(wkb, VARSIZE(bytea_wkb)-VARHDRSZ, LW_PARSER_CHECK_ALL); if ( ( PG_NARGS()>1) && ( ! PG_ARGISNULL(1) )) { srid = PG_GETARG_INT32(1); lwgeom_set_srid(lwgeom, srid); } if ( lwgeom_needs_bbox(lwgeom) ) lwgeom_add_bbox(lwgeom); geom = geometry_serialize(lwgeom); lwgeom_free(lwgeom); PG_FREE_IF_COPY(bytea_wkb, 0); PG_RETURN_POINTER(geom); }
Datum LWGEOM_in(PG_FUNCTION_ARGS) { char *input = PG_GETARG_CSTRING(0); int32 geom_typmod = -1; char *str = input; LWGEOM_PARSER_RESULT lwg_parser_result; LWGEOM *lwgeom; GSERIALIZED *ret; int srid = 0; if ( (PG_NARGS()>2) && (!PG_ARGISNULL(2)) ) { geom_typmod = PG_GETARG_INT32(2); } lwgeom_parser_result_init(&lwg_parser_result); /* Empty string. */ if ( str[0] == '\0' ) ereport(ERROR,(errmsg("parse error - invalid geometry"))); /* Starts with "SRID=" */ if( strncasecmp(str,"SRID=",5) == 0 ) { /* Roll forward to semi-colon */ char *tmp = str; while ( tmp && *tmp != ';' ) tmp++; /* Check next character to see if we have WKB */ if ( tmp && *(tmp+1) == '0' ) { /* Null terminate the SRID= string */ *tmp = '\0'; /* Set str to the start of the real WKB */ str = tmp + 1; /* Move tmp to the start of the numeric part */ tmp = input + 5; /* Parse out the SRID number */ srid = atoi(tmp); } } /* WKB? Let's find out. */ if ( str[0] == '0' ) { size_t hexsize = strlen(str); unsigned char *wkb = bytes_from_hexbytes(str, hexsize); /* TODO: 20101206: No parser checks! This is inline with current 1.5 behavior, but needs discussion */ lwgeom = lwgeom_from_wkb(wkb, hexsize/2, LW_PARSER_CHECK_NONE); /* If we picked up an SRID at the head of the WKB set it manually */ if ( srid ) lwgeom_set_srid(lwgeom, srid); /* Add a bbox if necessary */ if ( lwgeom_needs_bbox(lwgeom) ) lwgeom_add_bbox(lwgeom); pfree(wkb); ret = geometry_serialize(lwgeom); lwgeom_free(lwgeom); } /* WKT then. */ else { if ( lwgeom_parse_wkt(&lwg_parser_result, str, LW_PARSER_CHECK_ALL) == LW_FAILURE ) { PG_PARSER_ERROR(lwg_parser_result); } lwgeom = lwg_parser_result.geom; if ( lwgeom_needs_bbox(lwgeom) ) lwgeom_add_bbox(lwgeom); ret = geometry_serialize(lwgeom); lwgeom_parser_result_free(&lwg_parser_result); } if ( geom_typmod >= 0 ) { postgis_valid_typmod(ret, geom_typmod); POSTGIS_DEBUG(3, "typmod and geometry were consistent"); } else { POSTGIS_DEBUG(3, "typmod was -1"); } /* Don't free the parser result (and hence lwgeom) until we have done */ /* the typemod check with lwgeom */ PG_RETURN_POINTER(ret); }