#javascript #xml
Вопрос:
Я взаимодействую с сервером (Геосервер), отправляя запрос на получение некоторых данных.
Данные представляют собой географическую информацию о некоторых объектах.
Вот как я это делаю :
function filter() {
var demande = new XMLHttpRequest();
var url ='http://localhost:8080/geoserver/wfs?request=GetFeatureamp;version=1.1.0amp;typeName=topp:refer_22amp;propertyName=Name,matichaamp;outputFormat=GML2amp;FILTER=topp:maticha45005000'
demande.open("GET", url);
demande.onload=() => {
console.log(demande.response);
}
demande.send();
}
Запрос заключается в получении данных, соответствующих условию ( x <данные
У меня есть кнопка, когда я нажимаю на нее, функция filter() запускается для отправки и получения ответа на запрос xmlhttprequest.
Все работает нормально, за исключением того, что результат, который я получаю в консоли, длинный :
<wfs:FeatureCollection
xmlns="http://www.opengis.net/wfs"
xmlns:wfs="http://www.opengis.net/wfs"
xmlns:gml="http://www.opengis.net/gml"
xmlns:topp="http://www.openplans.org/topp"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.opengis.net/wfs http://localhost:8080/geoserver/schemas/wfs/1.0.0/WFS-basic.xsd http://www.openplans.org/topp http://localhost:8080/geoserver/wfs?service=WFSamp;amp;version=1.0.0amp;amp;request=DescribeFeatureTypeamp;amp;typeName=topp:refer_22,topp:refer_22">
<gml:boundedBy>
<gml:null>unknown</gml:null>
</gml:boundedBy>
<gml:featureMember>
<topp:refer_22 fid="refer_22.9">
<topp:the_geom>
<gml:MultiPolygon srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
<gml:polygonMember>
<gml:Polygon>
<gml:outerBoundaryIs>
<gml:LinearRing>
<gml:coordinates
xmlns:gml="http://www.opengis.net/gml" decimal="." cs="," ts=" ">34.69647,-1.919276 34.69651,-1.918997 34.697229,-1.919003 34.697317,-1.918058 34.697418,-1.91713 34.697462,-1.91653 34.697568,-1.915618 34.697837,-1.914641 34.698261,-1.913174 34.698614,-1.912023 34.699005,-1.910633 34.697456,-1.909919 34.696871,-1.909666 34.695711,-1.90917 34.694404,-1.908606 34.693794,-1.908351 34.69322,-1.908068 34.69202,-1.907558 34.691892,-1.908461 34.691702,-1.909658 34.69146,-1.910865 34.691429,-1.911192 34.691252,-1.912179 34.691063,-1.913338 34.690979,-1.913724 34.690851,-1.914132 34.690772,-1.914518 34.690644,-1.915205 34.690489,-1.915998 34.690145,-1.91764 34.690017,-1.918244 34.689918,-1.918702 34.689845,-1.919067 34.6897,-1.919978 34.689386,-1.92124 34.689422,-1.923584 34.69097,-1.923686 34.692518,-1.923552 34.6928,-1.923519 34.69329,-1.923428 34.693444,-1.923401 34.694662,-1.923037 34.695372,-1.922404 34.695663,-1.922034 34.695943,-1.921564 34.696161,-1.921111 34.696298,-1.920569 34.696399,-1.920022 34.696444,-1.91966 34.69647,-1.919276
</gml:coordinates>
</gml:LinearRing>
</gml:outerBoundaryIs>
</gml:Polygon>
</gml:polygonMember>
</gml:MultiPolygon>
</topp:the_geom>
<topp:Name>OUJ-DK9</topp:Name>
<topp:maticha>4500</topp:maticha>
</topp:refer_22>
</gml:featureMember>
</wfs:FeatureCollection>
Как вы можете видеть, приведенное выше является результатом в строковом формате. Существует поле «Геометрия» (the_geom), поле «имя» и поле под названием «матика» (используется для фильтрации данных).
Это хорошо, но я бы предпочел получить формат SON для данных или какой-то массив, в котором я могу получить к ним доступ.
Например, я хочу уметь писать :
var geometry = response[..]
чтобы получить список координат возвращаемого результата.
Есть ли к этому какой-нибудь способ ??
Комментарии:
Ответ №1:
Geoserver поддерживает различные форматы результатов с помощью этого outputFormat
параметра. В вашем запросе задается значение GML2
, которое является XML. Также поддерживается вывод JSON.
Поскольку URL-адрес вашего запроса действительно трудно читать и манипулировать, я рекомендую вам использовать UrlSearchParams
объект вместо того, чтобы пытаться управлять параметрами URL вручную в одной огромной запутанной строке.
Вот как я бы реализовал вашу filter()
функцию.
function filter(lowerBoundary, upperBoundary, onSuccess) {
var params = new URLSearchParams();
params.append('request', 'GetFeature');
params.append('version', '1.1.0');
params.append('typeName', 'topp:refer_22');
params.append('propertyName', 'Name,maticha');
params.append('outputFormat', 'application/json');
params.append('filter', `<Filter xmlns="http://www.opengis.net/ogc">
<PropertyIsBetween>
<PropertyName>topp:maticha</PropertyName>
<LowerBoundary><Literal>${lowerBoundary}</Literal></LowerBoundary>
<UpperBoundary><Literal>${upperBoundary}</Literal></UpperBoundary>
</PropertyIsBetween>
</Filter>`);
var demande = new XmlHttpRequest();
demande.open("GET", 'http://localhost:8080/geoserver/wfs?' params.toString());
demande.onload = () => onSuccess(JSON.parse(demande.response));
demande.send();
}
// later ...
filter(4000, 5000, (data) => {
console.log(data):
});
Также, по-видимому, доступен более простой синтаксис фильтра, см. ECQL.