gpt4 book ai didi

c - 在 C 中解析 GML 文件(来自 shp 文件)

转载 作者:太空宇宙 更新时间:2023-11-04 04:49:12 25 4
gpt4 key购买 nike

我的问题是,使用 ogr2ogr,我将 shp 文件解析为 gml 文件。

然后我想在我的 C 函数中解析这个文件。

sprintf(buffer, "PATH=/Library/Frameworks/GDAL.framework/Programs:$PATH:/usr/local/bin ogr2ogr -f \"GML\" files/Extraction/coord.gml %s", lectureFichier);
system(buffer);

sprintf(buff, "sed \"2s/.*/\\<ogr:FeatureCollection\\>/\" files/Extraction/coord.gml | sed '3,6d' > files/Extraction/temp.xml");
system(buff);

FILE *fichier = NULL;
FILE *final = NULL;
fichier = fopen("files/Extraction/temporaire.csv", "w+");

xmlDocPtr doc;
xmlChar *xpath = (xmlChar*) "//keyword";
xmlNodeSetPtr nodeset;
xmlXPathContextPtr context;
xmlXPathObjectPtr result;
int i;

doc = xmlParseFile("files/Extraction/temp.xml");

当我执行程序时,由于未定义命名空间前缀(gml 或 ogr),每一行都会出错)

temp.xml 示例

<ogr:FeatureCollection>
<gml:boundedBy>
<gml:Box>
<gml:coord><gml:X>847001.4933830451</gml:X><gml:Y>6298087.567566251</gml:Y></gml:coord>
<gml:coord><gml:X>859036.8755179688</gml:X><gml:Y>6309720.622619263</gml:Y></gml:coord>
</gml:Box>
</gml:boundedBy>
<gml:featureMember>

你知道如何让程序知道这些新命名空间吗?

编辑:

xmlDocPtr doc;
xmlChar *xpath = (xmlChar*) "//keyword";
xmlNodeSetPtr nodeset;
xmlXPathContextPtr context;
xmlXPathRegisterNs(context, "ogr", "http://ogr.maptools.org/");
xmlXPathRegisterNs(context, "gml", "http://www.opengis.net/gml");
xmlXPathObjectPtr result;
int i;
doc = xmlParseFile("files/Extraction/temp.xml");
if (doc == NULL ) {
fprintf(stderr,"Document not parsed successfully. \n");
return 0;
}

context = xmlXPathNewContext(doc);
if (context == NULL) {
printf("Error in xmlXPathNewContext\n");
return 0;
}

xpath = "//gml:coordinates/text()";
result = xmlXPathEvalExpression(xpath, context);
xmlXPathFreeContext(context);
if (result == NULL) {
printf("Error in xmlXPathEvalExpression\n");
return 0;
}

if(xmlXPathNodeSetIsEmpty(result->nodesetval)){
xmlXPathFreeObject(result);
printf("No result\n");
return 0;
}

`

当添加你给我的内容时,我遇到了段错误,我真的不知道它来自哪里,但似乎我越来越接近答案了。

你知道我哪里错了吗?

最佳答案

我认为您只需要将命名空间声明添加到 FeatureCollection 元素中,所以它看起来像这样:

<ogr:FeatureCollection
xmlns:ogr="http://ogr.maptools.org/"
xmlns:gml="http://www.opengis.net/gml">

假设您可以在 sed 脚本中执行此操作。

当尝试使用 xpath 查询命名空间元素时,您需要先注册您的命名空间。所以你可能需要做这样的事情:

xmlXPathRegisterNs(context, "ogr", "http://ogr.maptools.org/")
xmlXPathRegisterNs(context, "gml", "http://www.opengis.net/gml")

然后,当您尝试查询 gml 或 ogr 元素时,您可以这样做:

xpath = "//gml:coordinates/text()"; 
xmlXPathEvalExpression(xpath, context);

关于c - 在 C 中解析 GML 文件(来自 shp 文件),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17567712/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com