创建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函数。