Java Access Example
Java Example
Here is a simple java example how to access either the openstreetmap API or the overpass API from within Java. Note: The OSMNode class is missing getters and setters in order to shorten this example and they MUST BE CREATED BY YOU.
/**
* (c) Jens Kübler
* This software is public domain
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
*/
package org.osm.lights.extraction.osm;
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.net.Authenticator;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
import java.text.DecimalFormat;
import java.text.DecimalFormatSymbols;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.osm.lights.diff.OSMNode;
import org.osm.lights.upload.BasicAuthenticator;
import org.w3c.dom.Document;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
/**
*
*/
public class OSMWrapperAPI {
private static final String OVERPASS_API = "http://www.overpass-api.de/api/interpreter";
private static final String OPENSTREETMAP_API_06 = "http://www.openstreetmap.org/api/0.6/";
public static OSMNode getNode(String nodeId) throws IOException, ParserConfigurationException, SAXException {
String string = "http://www.openstreetmap.org/api/0.6/node/" + nodeId;
URL osm = new URL(string);
HttpURLConnection connection = (HttpURLConnection) osm.openConnection();
DocumentBuilderFactory dbfac = DocumentBuilderFactory.newInstance();
DocumentBuilder docBuilder = dbfac.newDocumentBuilder();
Document document = docBuilder.parse(connection.getInputStream());
List<OSMNode> nodes = getNodes(document);
if (!nodes.isEmpty()) {
return nodes.iterator().next();
}
return null;
}
/**
*
* @param lon the longitude
* @param lat the latitude
* @param vicinityRange bounding box in this range
* @return the xml document containing the queries nodes
* @throws IOException
* @throws SAXException
* @throws ParserConfigurationException
*/
@SuppressWarnings("nls")
private static Document getXML(double lon, double lat, double vicinityRange) throws IOException, SAXException,
ParserConfigurationException {
DecimalFormat format = new DecimalFormat("##0.0000000", DecimalFormatSymbols.getInstance(Locale.ENGLISH)); //$NON-NLS-1$
String left = format.format(lat - vicinityRange);
String bottom = format.format(lon - vicinityRange);
String right = format.format(lat + vicinityRange);
String top = format.format(lon + vicinityRange);
String string = OPENSTREETMAP_API_06 + "map?bbox=" + left + "," + bottom + "," + right + ","
+ top;
URL osm = new URL(string);
HttpURLConnection connection = (HttpURLConnection) osm.openConnection();
DocumentBuilderFactory dbfac = DocumentBuilderFactory.newInstance();
DocumentBuilder docBuilder = dbfac.newDocumentBuilder();
return docBuilder.parse(connection.getInputStream());
}
public static Document getXMLFile(String location) throws ParserConfigurationException, SAXException, IOException {
DocumentBuilderFactory dbfac = DocumentBuilderFactory.newInstance();
DocumentBuilder docBuilder = dbfac.newDocumentBuilder();
return docBuilder.parse(location);
}
/**
*
* @param xmlDocument
* @return a list of openseamap nodes extracted from xml
*/
@SuppressWarnings("nls")
public static List<OSMNode> getNodes(Document xmlDocument) {
List<OSMNode> osmNodes = new ArrayList<OSMNode>();
// Document xml = getXML(8.32, 49.001);
Node osmRoot = xmlDocument.getFirstChild();
NodeList osmXMLNodes = osmRoot.getChildNodes();
for (int i = 1; i < osmXMLNodes.getLength(); i++) {
Node item = osmXMLNodes.item(i);
if (item.getNodeName().equals("node")) {
NamedNodeMap attributes = item.getAttributes();
NodeList tagXMLNodes = item.getChildNodes();
Map<String, String> tags = new HashMap<String, String>();
for (int j = 1; j < tagXMLNodes.getLength(); j++) {
Node tagItem = tagXMLNodes.item(j);
NamedNodeMap tagAttributes = tagItem.getAttributes();
if (tagAttributes != null) {
tags.put(tagAttributes.getNamedItem("k").getNodeValue(), tagAttributes.getNamedItem("v")
.getNodeValue());
}
}
Node namedItemID = attributes.getNamedItem("id");
Node namedItemLat = attributes.getNamedItem("lat");
Node namedItemLon = attributes.getNamedItem("lon");
Node namedItemVersion = attributes.getNamedItem("version");
String id = namedItemID.getNodeValue();
String latitude = namedItemLat.getNodeValue();
String longitude = namedItemLon.getNodeValue();
String version = "0";
if (namedItemVersion != null) {
version = namedItemVersion.getNodeValue();
}
osmNodes.add(new OSMNode(id, latitude, longitude, version, tags));
}
}
return osmNodes;
}
public static List<OSMNode> getOSMNodesInVicinity(double lat, double lon, double vicinityRange) throws IOException,
SAXException, ParserConfigurationException {
return OSMWrapperAPI.getNodes(getXML(lon, lat, vicinityRange));
}
/**
*
* @param query the overpass query
* @return the nodes in the formulated query
* @throws IOException
* @throws ParserConfigurationException
* @throws SAXException
*/
public static Document getNodesViaOverpass(String query) throws IOException, ParserConfigurationException, SAXException {
String hostname = OVERPASS_API;
String queryString = readFileAsString(query);
URL osm = new URL(hostname);
HttpURLConnection connection = (HttpURLConnection) osm.openConnection();
connection.setDoInput(true);
connection.setDoOutput(true);
connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
DataOutputStream printout = new DataOutputStream(connection.getOutputStream());
printout.writeBytes("data=" + URLEncoder.encode(queryString, "utf-8"));
printout.flush();
printout.close();
DocumentBuilderFactory dbfac = DocumentBuilderFactory.newInstance();
DocumentBuilder docBuilder = dbfac.newDocumentBuilder();
return docBuilder.parse(connection.getInputStream());
}
/**
*
* @param filePath
* @return
* @throws java.io.IOException
*/
private static String readFileAsString(String filePath) throws java.io.IOException {
StringBuffer fileData = new StringBuffer(1000);
BufferedReader reader = new BufferedReader(new FileReader(filePath));
char[] buf = new char[1024];
int numRead = 0;
while ((numRead = reader.read(buf)) != -1) {
String readData = String.valueOf(buf, 0, numRead);
fileData.append(readData);
buf = new char[1024];
}
reader.close();
return fileData.toString();
}
/**
* main method that simply reads some nodes
*
* @param args
* @throws IOException
* @throws SAXException
* @throws ParserConfigurationException
*/
public static void main(String[] args) throws IOException, SAXException, ParserConfigurationException {
Authenticator.setDefault(new BasicAuthenticator("youruser", "yourpassword"));
List<OSMNode> osmNodesInVicinity = getOSMNodesInVicinity(49, 8.3, 0.005);
for (OSMNode osmNode : osmNodesInVicinity) {
System.out.println(osmNode.getId() + ":" + osmNode.getLat() + ":" + osmNode.getLon());
}
}
}
public class OSMNode {
private String id;
private String lat;
private String lon;
private final Map<String, String> tags;
private String version;
}
This article is issued from Openstreetmap. The text is licensed under Creative Commons - Attribution - Sharealike. Additional terms may apply for the media files.