Revision 8732 trunk/applications/appCatalogYNomenclatorClient/src/es/gva/cit/gazetteer/wfsg/parsers/WfsgFeatureParser.java
WfsgFeatureParser.java | ||
---|---|---|
59 | 59 |
* |
60 | 60 |
*/ |
61 | 61 |
private String geomType = null; |
62 |
private String namespace = null; |
|
62 | 63 |
|
63 | 64 |
/** |
64 | 65 |
* It parses the answer |
... | ... | |
71 | 72 |
*/ |
72 | 73 |
public Feature[] parse(XMLNode node, ThesaurusName thesaurus, String attribute) { |
73 | 74 |
XMLNode[] nodeFeatures = XMLTree.searchMultipleNode(node,"gml:featureMember"); |
75 |
namespace = ""; |
|
76 |
String geomField = ""; |
|
74 | 77 |
|
75 |
String prefix = thesaurus.getName().split(":")[0]; |
|
76 |
String geomField = getGeomField(prefix,thesaurus); |
|
77 |
|
|
78 |
if ((nodeFeatures != null) && (nodeFeatures.length > 0)){ |
|
79 |
if (nodeFeatures[0].getSubnodes().length > 0){ |
|
80 |
String nodeName = nodeFeatures[0].getSubnodes()[0].getName(); |
|
81 |
if (nodeName.split(":").length == 2){ |
|
82 |
namespace = nodeName.split(":")[0] + ":"; |
|
83 |
} |
|
84 |
geomField = getGeomField(nodeFeatures[0].getSubNode(0),namespace,thesaurus); |
|
85 |
} |
|
86 |
} |
|
87 |
|
|
78 | 88 |
if ((node.getName().equals("ResultCollection")) || |
79 | 89 |
(node.getName().equals("feature_collection"))){ |
90 |
geomField = "position->gml:Point->gml:coordinates"; |
|
91 |
geomType = "Point"; |
|
80 | 92 |
return parseWFS(nodeFeatures,thesaurus,"geographicIdentifier",geomField); |
81 | 93 |
}else{ |
82 |
return parseWFS(nodeFeatures,thesaurus,prefix + ":" + attribute,geomField);
|
|
94 |
return parseWFS(nodeFeatures,thesaurus,namespace + attribute,geomField);
|
|
83 | 95 |
} |
84 | 96 |
} |
85 | 97 |
|
... | ... | |
95 | 107 |
*/ |
96 | 108 |
public Feature[] parseWFS(XMLNode[] nodeFeatures, ThesaurusName thesaurusName, String attribute, String geomField) { |
97 | 109 |
Feature[] features = new Feature[nodeFeatures.length]; |
98 |
|
|
110 |
|
|
99 | 111 |
for (int i=0 ; i<nodeFeatures.length ; i++){ |
100 |
String id = XMLTree.searchNodeAtribute(nodeFeatures[i],thesaurusName.getName(),"fid"); |
|
101 |
|
|
102 | 112 |
XMLNode nodeName = XMLTree.searchNode(nodeFeatures[i],thesaurusName.getName() + "->" + attribute); |
103 | 113 |
String name = ""; |
104 | 114 |
|
115 |
if (nodeName == null){ |
|
116 |
if (thesaurusName.getName().split(":").length == 1){ |
|
117 |
thesaurusName.setName(namespace + thesaurusName.getName()); |
|
118 |
nodeName = XMLTree.searchNode(nodeFeatures[i],thesaurusName.getName() + "->" + attribute); |
|
119 |
} |
|
120 |
} |
|
121 |
|
|
105 | 122 |
if (nodeName != null){ |
106 |
if ((nodeName.getText() != null) && (!(nodeName.getText().equals("")))){ |
|
107 |
name = nodeName.getText(); |
|
108 |
} else if ((nodeName.getCdata() != null) && (!(nodeName.getCdata().equals("")))){ |
|
109 |
name = nodeName.getCdata(); |
|
110 |
} |
|
111 |
} |
|
123 |
if ((nodeName.getText() != null) && (!(nodeName.getText().equals("")))){ |
|
124 |
name = nodeName.getText(); |
|
125 |
} else if ((nodeName.getCdata() != null) && (!(nodeName.getCdata().equals("")))){ |
|
126 |
name = nodeName.getCdata(); |
|
127 |
} |
|
128 |
} |
|
129 |
|
|
130 |
String id = XMLTree.searchNodeAtribute(nodeFeatures[i],thesaurusName.getName(),"fid"); |
|
112 | 131 |
String description = name; |
132 |
System.out.println(thesaurusName.getName() + "->" + geomField); |
|
113 | 133 |
Point2D point = getCoordinates(XMLTree.searchNodeValue(nodeFeatures[i], |
114 |
geomField));
|
|
134 |
thesaurusName.getName() + "->" + geomField));
|
|
115 | 135 |
|
116 | 136 |
features[i] = new Feature(id,name,description,point); |
117 | 137 |
} |
... | ... | |
128 | 148 |
* @param prefix Typename |
129 | 149 |
* @param thesaurus Feature selected in the thesaurus list |
130 | 150 |
*/ |
131 |
private String getGeomField(String prefix, ThesaurusName thesaurus) { |
|
132 |
if ((thesaurus.getFields() == null) || (thesaurus.getFields().length == 0)){
|
|
133 |
geomType = "Point";
|
|
134 |
return thesaurus.getName() + "->" + "position->gml:Point->gml:coordinates";
|
|
135 |
}
|
|
136 |
|
|
151 |
private String getGeomField(XMLNode node, String prefix, ThesaurusName thesaurus) {
|
|
152 |
String geometryFieldName = "";
|
|
153 |
XMLNode geometryNode = null;
|
|
154 |
if (node == null){
|
|
155 |
return null;
|
|
156 |
} |
|
137 | 157 |
for (int i=0 ; i<thesaurus.getFields().length ; i++){ |
138 |
if (thesaurus.getFields()[i].getType().equals("gml:MultiLineStringPropertyType")){ |
|
139 |
prefix = thesaurus.getName() + "->" + prefix + ":" + thesaurus.getFields()[i].getName(); |
|
140 |
geomType = "MultiLine"; |
|
141 |
return prefix + |
|
142 |
"->gml:MultiLineString->gml:lineStringMember->gml:LineString->" + |
|
143 |
"gml:coordinates"; |
|
144 |
} |
|
145 |
|
|
146 |
if (thesaurus.getFields()[i].getType().equals("gml:MultiPolygonPropertyType")){ |
|
147 |
prefix = thesaurus.getName() + "->" + prefix + ":" + thesaurus.getFields()[i].getName(); |
|
148 |
geomType = "MultiPolygon"; |
|
149 |
return prefix + |
|
150 |
"->gml:MultiPolygon->gml:polygonMember->gml:Polygon->gml:outerBoundaryIs->" + |
|
151 |
"gml:LinearRing->gml:coordinates"; |
|
152 |
} |
|
153 |
|
|
154 |
if (thesaurus.getFields()[i].getType().equals("gml:PointPropertyType")){ |
|
155 |
prefix = thesaurus.getName() + "->" + prefix + ":" + thesaurus.getFields()[i].getName(); |
|
156 |
geomType = "Point"; |
|
157 |
return prefix + |
|
158 |
"->gml:Point->gml:coordinates"; |
|
159 |
} |
|
160 |
} |
|
161 |
return ""; |
|
162 |
} |
|
158 |
if (isGeometry(thesaurus.getFields()[i].getType())){ |
|
159 |
geometryFieldName = thesaurus.getFields()[i].getName(); |
|
160 |
} |
|
161 |
} |
|
162 |
for (int i=0 ; i<node.getNumSubNodes() ; i++){ |
|
163 |
if (node.getSubNode(i).getName().endsWith(geometryFieldName)){ |
|
164 |
geometryFieldName = node.getSubNode(i).getName(); |
|
165 |
geometryNode = node.getSubNode(i); |
|
166 |
} |
|
167 |
} |
|
168 |
return getGeometryField(geometryNode,geometryNode.getName()); |
|
169 |
} |
|
170 |
|
|
171 |
private String getGeometryField(XMLNode node,String parentNode){ |
|
172 |
if (node == null){ |
|
173 |
return ""; |
|
174 |
} |
|
175 |
for (int i=0 ; i<node.getNumSubNodes() ; i++){ |
|
176 |
if (node.getSubNode(i).getName().compareTo("gml:coordinates") == 0){ |
|
177 |
return parentNode + "->" + node.getSubNode(i).getName(); |
|
178 |
}else{ |
|
179 |
return parentNode + "->" + getGeometryField(node.getSubNode(i),node.getSubNode(i).getName()); |
|
180 |
} |
|
181 |
} |
|
182 |
return node.getName(); |
|
183 |
} |
|
163 | 184 |
|
185 |
private boolean isGeometry(String tagName){ |
|
186 |
if (tagName.compareTo("gml:MultiLineStringPropertyType") == 0){ |
|
187 |
geomType = "MultiLine"; |
|
188 |
return true; |
|
189 |
}else if(tagName.compareTo("gml:LineString") == 0){ |
|
190 |
geomType = "MultiLine"; |
|
191 |
return true; |
|
192 |
}else if(tagName.compareTo("gml:MultiPolygonPropertyType") == 0){ |
|
193 |
geomType = "MultiPolygon"; |
|
194 |
return true; |
|
195 |
}else if(tagName.compareTo("gml:PointPropertyType") == 0){ |
|
196 |
geomType = "Point"; |
|
197 |
return true; |
|
198 |
}else if(tagName.compareTo("gml:GeometryPropertyType") == 0){ |
|
199 |
geomType = "Point"; |
|
200 |
return true; |
|
201 |
} |
|
202 |
return false; |
|
203 |
} |
|
204 |
|
|
164 | 205 |
/** |
165 | 206 |
* It returns a pair of coordinates of the Feature |
166 | 207 |
* |
Also available in: Unified diff