In c, get points of a GEOSGeometry polygon
To get the points (vertices) of a GEOSGeometry
polygon in C, you typically use the GEOS (Geometry Engine - Open Source) library. GEOS is a C++ port of the Java Topology Suite (JTS) and provides spatial functionality for geographic information systems (GIS).
Here's a step-by-step guide to extract the points of a GEOSGeometry
polygon:
Include the necessary headers: Make sure to include the GEOS headers in your C program.
#include <geos_c.h>
Initialize the GEOS library: Before using any GEOS functions, you need to initialize the library.
initGEOS(NULL, NULL);
Create or read a GEOSGeometry
polygon:
You can create a GEOSGeometry
object from WKT (Well-Known Text) or other means. For example:
const char* wkt = "POLYGON((30 10, 40 40, 20 40, 10 20, 30 10))";
GEOSWKTReader* reader = GEOSWKTReader_create();
GEOSGeometry* geom = GEOSWKTReader_read(reader, wkt);
GEOSWKTReader_destroy(reader);
Extract the exterior ring of the polygon:
Use GEOSGetExteriorRing
to get the exterior ring of the polygon.
const GEOSGeometry* exteriorRing = GEOSGetExteriorRing(geom);
Get the number of points in the exterior ring:
Use GEOSGeomGetNumPoints
to get the number of points in the ring.
int numPoints = GEOSGeomGetNumPoints(exteriorRing);
Extract the coordinates of each point:
Use GEOSGeomGetPointN
to get each point and GEOSGeomGetX
and GEOSGeomGetY
to get the coordinates.
for (int i = 0; i < numPoints; i++) {
const GEOSGeometry* point = GEOSGeomGetPointN(exteriorRing, i);
double x, y;
GEOSGeomGetX(point, &x);
GEOSGeomGetY(point, &y);
printf("Point %d: (%f, %f)\n", i, x, y);
}
Clean up:
Destroy the GEOSGeometry
object and finish the GEOS library.
GEOSGeom_destroy(geom);
finishGEOS();
Here is the complete example:
#include <stdio.h>
#include <geos_c.h>
int main() {
// Initialize GEOS
initGEOS(NULL, NULL);
// Create a GEOSGeometry polygon from WKT
const char* wkt = "POLYGON((30 10, 40 40, 20 40, 10 20, 30 10))";
GEOSWKTReader* reader = GEOSWKTReader_create();
GEOSGeometry* geom = GEOSWKTReader_read(reader, wkt);
GEOSWKTReader_destroy(reader);
if (geom == NULL) {
fprintf(stderr, "Failed to create geometry from WKT\n");
finishGEOS();
return 1;
}
// Get the exterior ring of the polygon
const GEOSGeometry* exteriorRing = GEOSGetExteriorRing(geom);
if (exteriorRing == NULL) {
fprintf(stderr, "Failed to get exterior ring\n");
GEOSGeom_destroy(geom);
finishGEOS();
return 1;
}
// Get the number of points in the exterior ring
int numPoints = GEOSGeomGetNumPoints(exteriorRing);
// Extract and print the coordinates of each point
for (int i = 0; i < numPoints; i++) {
const GEOSGeometry* point = GEOSGeomGetPointN(exteriorRing, i);
double x, y;
GEOSGeomGetX(point, &x);
GEOSGeomGetY(point, &y);
printf("Point %d: (%f, %f)\n", i, x, y);
}
// Clean up
GEOSGeom_destroy(geom);
finishGEOS();
return 0;
}
This example demonstrates how to read a polygon from WKT, extract its exterior ring, and print the coordinates of each point in the ring. Make sure you have the GEOS library installed and properly linked when compiling this code.