创建GDAL几何对象

创建GDAL几何对象

GDAL (Geospatial Data Abstraction Library) 是一个开源的用于读取和写入矢量和栅格地理空间数据格式的库。OGR是GDAL库的一个部分,专门用于处理矢量数据

createFromWkt

OGRGeometryFactory是OGR库中的一个类,用于创建OGRGeometry对象。OGRGeometry是一个表示地理空间几何对象(如点、线、多边形等)的抽象基类。

OGRGeometryFactory::createFromWkt是OGRGeometryFactory类的一个静态方法,用于从WKT (Well-Known Text) 字符串创建一个OGRGeometry对象。

函数原型:

1
2
3
4
OGRErr OGRGeometryFactory::createFromWkt(char ** ppszInput, 
OGRSpatialReference * poSR,
OGRGeometry ** ppoReturn );


参数:

  • ppszInput:输入参数,指向一个指针,该指针指向WKT字符串。该函数会修改该指针,使其指向WKT字符串中未处理的下一个字符。

  • poSR:输入参数,指向一个OGRSpatialReference对象,该对象定义了要创建的几何对象的空间参考系。如果输入为NULL,则假定WKT字符串中包含了空间参考系信息。

  • ppoReturn:输出参数,指向一个OGRGeometry对象的指针。如果函数成功,该指针将指向一个新创建的OGRGeometry对象。该对象应当由调用者负责删除。

返回值:

  • OGRERR_NONE:操作成功。

  • OGRERR_NOT_ENOUGH_DATA:WKT字符串中的数据不足以创建一个几何对象。

  • OGRERR_UNSUPPORTED_GEOMETRY_TYPE:WKT字符串中的几何类型不受支持。

  • OGRERR_CORRUPT_DATA:WKT字符串包含错误的数据。

用法示例:

1
2
3
4
5
6
7
8
9
char* wkt = "POINT (30 10)";
OGRGeometry *poGeometry;
char *pszWKT = wkt;
OGRSpatialReference* poSRS = NULL;
OGRErr eErr = OGRGeometryFactory::createFromWkt(&pszWKT, poSRS, &poGeometry);
if (eErr != OGRERR_NONE) {
// Handle error
}


这个例子创建了一个表示点(30, 10)的OGRGeometry对象。注意,createFromWkt函数会修改pszWKT指针。如果需要保留原始的WKT字符串,应当先将其复制到另一个字符串,然后传递复制的字符串的地址给createFromWkt函数。

createFromWkb

在GDAL(Geospatial Data Abstraction Library)的OGR部分中,OGRGeometryFactory::createFromWkb 函数用于从WKB(Well-Known Binary)格式的二进制数据创建一个 OGRGeometry 对象。WKB是一种用于序列化地理空间几何对象的标准格式。

函数原型通常如下

1
2
3
4
5
OGRErr OGRGeometryFactory::createFromWkb( unsigned char * pabyData,
OGRSpatialReference * poSR,
OGRGeometry ** ppoReturn,
int nSize );


参数:

  • pabyData:输入参数,指向包含WKB数据的无符号字符数组。

  • poSR:输入参数,指向一个 OGRSpatialReference 对象,该对象定义了几何对象的空间参考系。如果为 NULL,则假定WKB数据中包含了空间参考系信息。

  • ppoReturn:输出参数,指向一个 OGRGeometry 对象的指针。如果函数成功,则这个指针会指向一个新创建的 OGRGeometry 对象。

  • nSize:输入参数,定义了 pabyData 数组的大小。这是为了防止数组越界。

返回值:

  • OGRERR_NONE:操作成功。

  • OGRERR_NOT_ENOUGH_DATA:WKB数据不足以创建一个几何对象。

  • OGRERR_UNSUPPORTED_GEOMETRY_TYPE:WKB数据中的几何类型不受支持。

  • OGRERR_CORRUPT_DATA:WKB数据包含错误或损坏的数据。

用法示例:

1
2
3
4
5
6
7
8
9
10
unsigned char wkb[] = {...}; // 一些WKB格式的二进制数据
int nSize = sizeof(wkb);
OGRSpatialReference* poSRS = NULL;
OGRGeometry *poGeometry;

OGRErr eErr = OGRGeometryFactory::createFromWkb(wkb, poSRS, &poGeometry, nSize);
if (eErr != OGRERR_NONE) {
// 错误处理
}


这个例子创建了一个由WKB数据表示的 OGRGeometry 对象。请注意,成功创建几何对象后,你需要负责最终删除该对象以释放内存。

这个函数非常有用,当你需要从二进制流或者文件中读取地理信息,并将其转换为可以用于进一步处理或转换的 OGRGeometry 对象时。它是一个与 createFromWkt 函数(用于从WKT格式字符串创建 OGRGeometry 对象)相对应的函数。

createFromGeoJson

在GDAL的OGR库中,OGRGeometryFactory 类提供了一组方法用于创建 OGRGeometry 对象。OGRGeometry 是一个表示地理空间几何对象(如点、线、多边形等)的抽象基类。

OGRGeometryFactory::createFromGeoJson 方法用于从GeoJSON格式的字符串创建一个 OGRGeometry 对象。

GeoJSON是一种基于JSON格式的地理空间数据交换格式。它可以用于表示几何对象、特征和特征集合。

函数原型:

1
2
OGRGeometry* OGRGeometryFactory::createFromGeoJson(const char* pszJson);


参数:

  • pszJson:输入参数,指向一个包含GeoJSON格式数据的字符串。
    返回值:

  • 如果操作成功,则返回一个新创建的 OGRGeometry 对象的指针。该对象应由调用者负责删除。

  • 如果操作失败,则返回NULL。

用法示例:

1
2
3
4
5
6
const char* geoJson = "{\"type\":\"Point\",\"coordinates\":[30,10]}";
OGRGeometry *poGeometry = OGRGeometryFactory::createFromGeoJson(geoJson);
if (poGeometry == NULL) {
// Handle error
}


这个例子创建了一个表示点(30, 10)的 OGRGeometry 对象。

注意:

  1. 该方法可以处理GeoJSON字符串中的任何几何对象类型,例如 Point, LineString, Polygon, MultiPoint, MultiLineString, MultiPolygon, 和 GeometryCollection。

  2. GeoJSON格式的字符串必须是UTF-8编码的。

  3. 由于该方法返回一个新创建的 OGRGeometry 对象的指针,因此调用者需要负责删除该对象以释放内存。

创建Polygon

1
2
3
4
5
6
const char* geoJson = "{\"type\":\"Polygon\",\"coordinates\":[[[30,10],[40,40],[20,40],[10,20],[30,10]]]}";
OGRGeometry *poGeometry = OGRGeometryFactory::createFromGeoJson(geoJson);
if (poGeometry == NULL) {
// Handle error
}

ROS的Polygonstamped转化成GDAL需要的geoJson

在ROS(Robot Operating System)和GDAL(Geospatial Data Abstraction Library)之间进行数据转换时,可以手动构建一个GeoJSON字符串来表示ROS的PolygonStamped消息。

以下是一些步骤和代码示例,以展示如何从ROS的PolygonStamped消息转换到一个GDAL所需的GeoJSON字符串。

  1. 首先,确保安装了ROS和GDAL的相关包,并在代码中包含它们。
    1
    2
    3
    4
    #include <ros/ros.h>
    #include <geometry_msgs/PolygonStamped.h>
    #include <json/json.h> // 或者使用其他JSON库

  2. 订阅PolygonStamped消息或者从某个已知的PolygonStamped对象开始。

  3. 手动构建一个GeoJSON字符串。

代码示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
#include <ros/ros.h>
#include <geometry_msgs/PolygonStamped.h>
#include <json/json.h> // 使用JsonCpp库

std::string convertPolygonStampedToGeoJson(const geometry_msgs::PolygonStamped& polygonStamped) {
Json::Value root;
root["type"] = "Polygon";

Json::Value coordinates(Json::arrayValue);
Json::Value ring(Json::arrayValue);

for (const auto& point : polygonStamped.polygon.points) {
Json::Value vertex(Json::arrayValue);
vertex.append(point.x);
vertex.append(point.y);
ring.append(vertex);
}

// 确保首尾点相同以满足GeoJSON格式的要求
if (!(polygonStamped.polygon.points.front().x == polygonStamped.polygon.points.back().x &&
polygonStamped.polygon.points.front().y == polygonStamped.polygon.points.back().y)) {
Json::Value vertex(Json::arrayValue);
vertex.append(polygonStamped.polygon.points.front().x);
vertex.append(polygonStamped.polygon.points.front().y);
ring.append(vertex);
}

coordinates.append(ring);
root["coordinates"] = coordinates;

Json::StreamWriterBuilder writer;
std::string geoJsonString = Json::writeString(writer, root);

return geoJsonString;
}

int main(int argc, char** argv) {
ros::init(argc, argv, "polygon_to_geojson_converter");
ros::NodeHandle nh;

// 以某种方式获取PolygonStamped对象,例如通过订阅
geometry_msgs::PolygonStamped polygonStamped;

// 填充polygonStamped对象...

// 转换到GeoJSON
std::string geoJsonString = convertPolygonStampedToGeoJson(polygonStamped);

// 现在,你可以使用geoJsonString进行GDAL相关操作

return 0;
}


在这个例子中,我使用了JsonCpp库来创建GeoJSON字符串,但你也可以使用任何其他JSON处理库或直接手动构建这个字符串。然后,你可以将生成的GeoJSON字符串用于GDAL的OGRGeometryFactory::createFromGeoJson函数。


创建GDAL几何对象
https://qiangsun89.github.io/2023/09/01/创建GDAL几何对象/
作者
Qiang Sun
发布于
2023年9月1日
许可协议