创建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
4OGRErr 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
9char* 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
5OGRErr 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
10unsigned 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
2OGRGeometry* OGRGeometryFactory::createFromGeoJson(const char* pszJson);
参数:
- pszJson:输入参数,指向一个包含GeoJSON格式数据的字符串。 
 返回值:
- 如果操作成功,则返回一个新创建的 OGRGeometry 对象的指针。该对象应由调用者负责删除。 
- 如果操作失败,则返回NULL。 
用法示例:1
2
3
4
5
6const char* geoJson = "{\"type\":\"Point\",\"coordinates\":[30,10]}";
OGRGeometry *poGeometry = OGRGeometryFactory::createFromGeoJson(geoJson);
if (poGeometry == NULL) {
    // Handle error
}
这个例子创建了一个表示点(30, 10)的 OGRGeometry 对象。
注意:
- 该方法可以处理GeoJSON字符串中的任何几何对象类型,例如 Point, LineString, Polygon, MultiPoint, MultiLineString, MultiPolygon, 和 GeometryCollection。 
- GeoJSON格式的字符串必须是UTF-8编码的。 
- 由于该方法返回一个新创建的 OGRGeometry 对象的指针,因此调用者需要负责删除该对象以释放内存。 
创建Polygon
| 1 |  | 
ROS的Polygonstamped转化成GDAL需要的geoJson
在ROS(Robot Operating System)和GDAL(Geospatial Data Abstraction Library)之间进行数据转换时,可以手动构建一个GeoJSON字符串来表示ROS的PolygonStamped消息。
以下是一些步骤和代码示例,以展示如何从ROS的PolygonStamped消息转换到一个GDAL所需的GeoJSON字符串。
- 首先,确保安装了ROS和GDAL的相关包,并在代码中包含它们。1 
 2
 3
 4#include <ros/ros.h>
 #include <geometry_msgs/PolygonStamped.h>
 #include <json/json.h> // 或者使用其他JSON库
- 订阅PolygonStamped消息或者从某个已知的PolygonStamped对象开始。 
- 手动构建一个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函数。