LWGEOM* wkt_parser_triangle_new(POINTARRAY *pa, char *dimensionality) { uint8_t flags = wkt_dimensionality(dimensionality); LWDEBUG(4,"entered"); /* No pointarray means it is empty */ if( ! pa ) return lwtriangle_as_lwgeom(lwtriangle_construct_empty(SRID_UNKNOWN, FLAGS_GET_Z(flags), FLAGS_GET_M(flags))); /* If the number of dimensions is not consistent, we have a problem. */ if( wkt_pointarray_dimensionality(pa, flags) == LW_FALSE ) { ptarray_free(pa); SET_PARSER_ERROR(PARSER_ERROR_MIXDIMS); return NULL; } /* Triangles need four points. */ if( (pa->npoints != 4) ) { ptarray_free(pa); SET_PARSER_ERROR(PARSER_ERROR_TRIANGLEPOINTS); return NULL; } /* Triangles need closure. */ if( ! ptarray_isclosed(pa) ) { ptarray_free(pa); SET_PARSER_ERROR(PARSER_ERROR_UNCLOSED); return NULL; } return lwtriangle_as_lwgeom(lwtriangle_construct(SRID_UNKNOWN, NULL, pa)); }
/* * Construct a triangle from a LWLINE being * the shell * Pointarray from intput geom are cloned. * Input line must have 4 points, and be closed. */ LWTRIANGLE * lwtriangle_from_lwline(const LWLINE *shell) { LWTRIANGLE *ret; POINTARRAY *pa; if ( shell->points->npoints != 4 ) lwerror("lwtriangle_from_lwline: shell must have exactly 4 points"); if ( (!FLAGS_GET_Z(shell->flags) && !ptarray_is_closed_2d(shell->points)) || (FLAGS_GET_Z(shell->flags) && !ptarray_is_closed_3d(shell->points)) ) lwerror("lwtriangle_from_lwline: shell must be closed"); pa = ptarray_clone_deep(shell->points); ret = lwtriangle_construct(shell->srid, NULL, pa); if (lwtriangle_is_repeated_points(ret)) lwerror("lwtriangle_from_lwline: some points are repeated in triangle"); return ret; }
/* * Return a LWGEOM pointer from an TGEOM struct * Geometries are NOT copied */ LWGEOM* lwgeom_from_tgeom(TGEOM *tgeom) { int i, j, k; LWGEOM *geom; POINTARRAY *dpa; POINTARRAY **ppa; int hasz, hasm, edge_id; int dims=0; assert(tgeom); hasz=FLAGS_GET_Z(tgeom->flags); hasm=FLAGS_GET_M(tgeom->flags); geom = (LWGEOM *)lwcollection_construct_empty(COLLECTIONTYPE, tgeom->srid, hasz, hasm); switch (tgeom->type) { case TINTYPE: geom->type = TINTYPE; for (i=0 ; i < tgeom->nfaces ; i++) { FLAGS_SET_Z(dims, hasz?1:0); FLAGS_SET_M(dims, hasm?1:0); dpa = ptarray_construct_empty(hasz, hasm, 4); for (j=0 ; j < tgeom->faces[i]->nedges ; j++) { edge_id = tgeom->faces[i]->edges[j]; LWDEBUGF(3, "TIN edge_id: %i\n", edge_id); assert(edge_id); if (edge_id > 0) ptarray_append_point(dpa, tgeom->edges[edge_id]->s, LW_TRUE); else ptarray_append_point(dpa, tgeom->edges[-edge_id]->e, LW_TRUE); } edge_id = tgeom->faces[i]->edges[0]; LWDEBUGF(3, "TIN edge_id: %i\n", edge_id); if (edge_id > 0) ptarray_append_point(dpa, tgeom->edges[edge_id]->s, LW_TRUE); else ptarray_append_point(dpa, tgeom->edges[-edge_id]->e, LW_TRUE); geom = (LWGEOM *) lwtin_add_lwtriangle((LWTIN *) geom, lwtriangle_construct(tgeom->srid, NULL, dpa)); } break; case POLYHEDRALSURFACETYPE: geom->type = POLYHEDRALSURFACETYPE; for (i=0 ; i < tgeom->nfaces ; i++) { FLAGS_SET_Z(dims, hasz?1:0); FLAGS_SET_M(dims, hasm?1:0);; dpa = ptarray_construct_empty(hasz, hasm, 4); for (j=0 ; j < tgeom->faces[i]->nedges ; j++) { edge_id = tgeom->faces[i]->edges[j]; assert(edge_id); LWDEBUGF(3, "POLYHEDRALSURFACE edge_id: %i\n", edge_id); if (edge_id > 0) ptarray_append_point(dpa, tgeom->edges[edge_id]->s, LW_TRUE); else ptarray_append_point(dpa, tgeom->edges[-edge_id]->e, LW_TRUE); } edge_id = tgeom->faces[i]->edges[0]; LWDEBUGF(3, "POLYHEDRALSURFACE edge_id: %i\n", edge_id); if (edge_id > 0) ptarray_append_point(dpa, tgeom->edges[edge_id]->s, LW_TRUE); else ptarray_append_point(dpa, tgeom->edges[-edge_id]->e, LW_TRUE); ppa = lwalloc(sizeof(POINTARRAY*) * (tgeom->faces[i]->nrings + 1)); ppa[0] = dpa; for (k=0; k < tgeom->faces[i]->nrings ; k++) ppa[k+1] = tgeom->faces[i]->rings[k]; geom = (LWGEOM *) lwpsurface_add_lwpoly((LWPSURFACE *) geom, lwpoly_construct(tgeom->srid, NULL, k + 1, ppa)); } break; default: lwerror("lwgeom_from_tgeom: Unkwnown type %i - %s\n", tgeom->type, lwtype_name(tgeom->type)); } if (geom->srid == 0) geom->srid = SRID_UNKNOWN; return geom; }