/*******************************************************************************
* Copyright (c) 2012 Hallvard Tr�tteberg.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Hallvard Tr�tteberg - initial API and implementation
******************************************************************************/
package org.eclipse.nebula.widgets.geomap.jface;
import java.util.Stack;
import org.xml.sax.Attributes;
/**
* A SearchServer using Open Street Map
* @since 3.3
*
*/
public class OsmSearchServer extends SearchServer {
/**
* Initializes the OsmSearchServer
*/
public OsmSearchServer() {
super("http://nominatim.openstreetmap.org/search?format=xml&", "q={0}"); //$NON-NLS-1$ //$NON-NLS-2$
}
/*
<searchresults timestamp="Mon, 11 Jun 12 21:58:47 +0100" attribution="Data Copyright OpenStreetMap Contributors, Some Rights Reserved. CC-BY-SA 2.0." querystring="Trondheim" polygon="false" exclude_place_ids="128891033,184917,69612272,69623905,51503057,7140200" more_url="http://nominatim.openstreetmap.org/search?format=xml&exclude_place_ids=128891033,184917,69612272,69623905,51503057,7140200&accept-language=en-us,en;q=0.5&q=Trondheim">
<place place_id="128891033" osm_type="relation" osm_id="406549" place_rank="14"
boundingbox="63.3037910461426,63.5188484191895,10.0044040679932,10.7260761260986" lat="63.4091124566799" lon="10.3442806402932"
display_name="Trondheim, S�r-Tr�ndelag, Norway"
class="boundary" type="administrative" icon="http://nominatim.openstreetmap.org/images/mapicons/poi_boundary_administrative.p.20.png"/>
<place place_id="184917" osm_type="node" osm_id="31264142" place_rank="16"
boundingbox="63.416322937012,63.436326751709,10.385802497864,10.405803451538" lat="63.4263262" lon="10.3958034"
display_name="Trondheim, S�r-Tr�ndelag, Norway"
class="place" type="city" icon="http://nominatim.openstreetmap.org/images/mapicons/poi_place_city.p.20.png"/>
<place place_id="69612272" osm_type="way" osm_id="70724671" place_rank="26"
boundingbox="56.0665512084961,56.0667915344238,-3.42122840881348,-3.4209291934967" lat="56.066629370311" lon="-3.42103396739874"
display_name="Trondheim, Halbeath, Fife, Scotland, KY11, United Kingdom"
class="highway" type="residential"/>
<place place_id="51503057" osm_type="way" osm_id="46275499" place_rank="26"
boundingbox="51.8508987426758,51.8515129089355,4.50965213775635,4.51104021072388" lat="51.8511993825579" lon="4.51021507633146"
display_name="Trondheim, Vaan Park, Barendrecht, Stadsregio Rotterdam, South Holland, 2993 LL, The Netherlands"
class="highway" type="unclassified"/>
<place place_id="7140200" osm_type="node" osm_id="671401968" place_rank="30"
boundingbox="50.963022460938,50.983026275635,11.017996063232,11.037997016907" lat="50.9730261" lon="11.0279965"
display_name="Trondheim, Neuwerkstra�e, Altstadt, Erfurt, Thuringia, 99084, Federal Republic of Germany (land mass), Europe"
class="shop" type="clothes" icon="http://nominatim.openstreetmap.org/images/mapicons/shopping_clothes.p.20.png"/>
</searchresults>
*/
@Override
protected Object startElement(String qName, Stack<String> path, Attributes attributes, Stack<Object> objects) {
if ("place".equals(qName)) { //$NON-NLS-1$
SearchResult result = new SearchResult();
result.setLon(attributes.getValue("lon")); //$NON-NLS-1$
result.setLat(attributes.getValue("lat")); //$NON-NLS-1$
if (result.getLonLat() == null) {
return null;
}
String displayName = attributes.getValue("display_name"); //$NON-NLS-1$
result.setText(displayName);
int pos = displayName.indexOf(","); //$NON-NLS-1$
result.setName(pos > 0 ? displayName.substring(0, pos) : displayName);
result.category = attributes.getValue("class"); //$NON-NLS-1$
result.type = attributes.getValue("type"); //$NON-NLS-1$
return result;
}
return null;
}
/**
* The SearchResult returned from the OsmSearchServer
* @since 3.3
*
*/
public static final class SearchResult extends Result {
private String type;
private String category;
/**
* Gets the result type
* @return the result type
*/
public String getType() {
return type;
}
/**
* Gets the result category
* @return the result category
*/
public String getCategory() {
return category;
}
@SuppressWarnings("nls")
public String toString() {
return "SearchResult [text=" + getText() + ", location=" + getLonLat() + ", type=" + type + ", category=" + category + "]";
}
}
}