Merge branch 'fixf'
[wrf-fire-matlab.git] / cycling / kml2struct.m
bloba5b9725e5aa55d22cbf5982c05852d5e3c896edb
1 function kmlStruct = kml2struct(kmlFile)
2 % kmlStruct = kml2struct(kmlFile)
4 % Import a .kml file as a vector array of shapefile structs, with Geometry, Name,
5 % Description, Lon, Lat, and BoundaryBox fields.  Structs may contain a mix
6 % of points, lines, and polygons.
8 % .kml files with folder structure will not be presented as such, but will
9 % appear as a single vector array of structs.
11 %  downloaded from https://www.mathworks.com/matlabcentral/fileexchange/35642-kml2struct
12 %  author james slegers
14 [FID msg] = fopen(kmlFile,'rt');
15 if FID<0
16     error(msg)
17 end
18 txt = fread(FID,'uint8=>char')';
19 fclose(FID);
20 expr = '<Placemark.+?>.+?</Placemark>';
21 objectStrings = regexp(txt,expr,'match');
22 Nos = length(objectStrings);
23 for ii = 1:Nos
24     % Find Object Name Field
25     bucket = regexp(objectStrings{ii},'<name.*?>.+?</name>','match');
26     if isempty(bucket)
27         name = 'undefined';
28     else
29         % Clip off flags
30         name = regexprep(bucket{1},'<name.*?>\s*','');
31         name = regexprep(name,'\s*</name>','');
32     end
33     
34     % Find Object Description Field
35     bucket = regexp(objectStrings{ii},'<description.*?>.+?</description>','match');
36     if isempty(bucket)
37         desc = '';
38     else
39         % Clip off flags
40         desc = regexprep(bucket{1},'<description.*?>\s*','');
41         desc = regexprep(desc,'\s*</description>','');
42     end
43     
44     geom = 0;
45     % Identify Object Type
46     if ~isempty(regexp(objectStrings{ii},'<Point', 'once'))
47         geom = 1;
48     elseif ~isempty(regexp(objectStrings{ii},'<LineString', 'once'))
49         geom = 2;
50     elseif ~isempty(regexp(objectStrings{ii},'<Polygon', 'once'))
51         geom = 3;
52     end
53     
54     switch geom
55         case 1
56             geometry = 'Point';
57         case 2
58             geometry = 'Line';
59         case 3
60             geometry = 'Polygon';
61         otherwise
62             geometry = '';
63     end
64     
65     % Find Coordinate Field
66     bucket = regexp(objectStrings{ii},'<coordinates.*?>.+?</coordinates>','match');
67     % Clip off flags
68     coordStr = regexprep(bucket{1},'<coordinates.*?>(\s+)*','');
69     coordStr = regexprep(coordStr,'(\s+)*</coordinates>','');
70     % Split coordinate string by commas or white spaces, and convert string
71     % to doubles
72     coordMat = str2double(regexp(coordStr,'[,\s]+','split'));
73     % Rearrange coordinates to form an x-by-3 matrix
74     [m,n] = size(coordMat);
75     coordMat = reshape(coordMat,3,m*n/3)';
76     
77     % define polygon in clockwise direction, and terminate
78     [Lat, Lon] = poly2ccw(coordMat(:,2),coordMat(:,1));
79     if geom==3
80         Lon = [Lon;NaN];
81         Lat = [Lat;NaN];
82     end
83     
84     % Create structure
85     kmlStruct(ii).Geometry = geometry;
86     kmlStruct(ii).Name = name;
87     kmlStruct(ii).Description = desc;
88     kmlStruct(ii).Lon = Lon;
89     kmlStruct(ii).Lat = Lat;
90     kmlStruct(ii).BoundingBox = [[min(Lon) min(Lat);max(Lon) max(Lat)]];
91 end