Skip to content
Prev 12709 / 29559 Next

Setting FID values when saving GML files with writeOGR

Roger Bivand wrote:

            
Thanks. I should have mentioned that I actually had read that page (and 
that was the reason I adding ?fid? and ?gml_id? columns), but couldn?t 
get the solution mentioned there to work.

Now I have actually managed to get it to work, on Linux. The Windows build 
of rgdal apparently uses a version of rgdal < 1.8.0. Is there a way to 
get information on which version (from inside R)?

My Linux system has OGR 1.8.1, which doesn?t support writing FID values 
(this will come in OGR 1.9.0), but *does* support writing gml:id values,
which is used in GML 3. GML 2 is the default, which means that to specifiy 
the feature ID, you have to:

1. Add a column called ?gml_id? to your spatial object.
2. Add the argument ?dataset_options="FORMAT=GML3"? to the writeOGR call.

This creates a GML 3 document with features identified by the values in the 
?gml_id? column (in the GML file they?re named ?gml:id?).

Note that neither RGDAL nor GDAL does any validation on the values in the 
?gml_id? column. To ensure that they?re valid, you can use the following 
?Name? regexp:

NameStartChar=":_A-Za-
z\uC0-\uD6\uD8-\uF6\uF8-\u2FF\u370-\u37D\u37F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD"
NameChar=paste(NameStartChar,"0-9\uB7\u0300-\u036F\u203F-\u2040F.-", sep="")
Name=paste("^[", NameStartChar, "][", NameChar, "]*$", sep="")

Example:
  grepl(Name,c("F23","23F","F","",":ABC","-ABC","A-B.","-AB","_.-",".-_","\u200C","\u200E"))

Note that the regexp is missing the character range \u10000-\uEFFFF, which I
couldn?t get R to recognise on my (UTF-8 Linux) system. But if R doesn?t
recognize the characters, they won?t appear in any strings, so this shouldn?t
be a problem ? :)

You also need to run ?anyDuplicated? to check that all the values are unique.