Add support for parsing and serializing OpenStreetMap data. Includes

tests, examples, modification to proxy.cgi, etc. This should allow one
to build an OpenLayers based OpenStreetMap editor with some effort, and 
makes it trivially simple to drop OpenStreetMap data from the API into 
your OpenLayers application. r=ahocevar,elemoine (Closes #1271)


git-svn-id: http://svn.openlayers.org/trunk/openlayers@5902 dc9f47b5-9b13-0410-9fdd-eb0c1a62fdaf
This commit is contained in:
crschmidt
2008-01-26 14:41:41 +00:00
parent 4159d1b1e8
commit bd7eaeb167
8 changed files with 1345 additions and 1 deletions

117
examples/osm-layer.html Normal file
View File

@@ -0,0 +1,117 @@
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<style type="text/css">
#map {
width: 70%;
height: 475px;
border: 1px solid black;
}
</style>
<script src="../lib/OpenLayers.js"></script>
<script type="text/javascript">
var lon = 5;
var lat = 40;
var zoom = 5;
var map, layer, gml;
function export_vectors() {
var x = new OpenLayers.Format.XML();
var content = x.write(gml.renderer.rendererRoot);
$("vectors").value = content;
$("vectors").style.display = "block";
$("vectorlink").href = "data:image/svg+xml," + escape(content);
$("vectorlink").style.display="block";
}
function on_feature_hover(feature) {
var text ="<ul>";
var type ="way";
if (feature.geometry.CLASS_NAME == "OpenLayers.Geometry.Point") {
type = "node";
}
text += "<li>" + feature.fid + ": <a href='http://crschmidt.net/osm/attributes.html?type="+type+"&id="+feature.fid+"'>Edit</a>, <a href='http://www.openstreetmap.org/api/0.5/"+type + "/" + feature.fid + "'>API</a></li>";
for (var key in feature.attributes) {
text += "<li>" + key + ": " + feature.attributes[key] + "</li>";
}
text += "</ul>";
$("status").innerHTML = text;
}
function clear_data() {
gml.destroyFeatures();
}
function new_data() {
if (!check_zoom()) { return; }
clear_data();
gml.loaded = false;
gml.url = "http://www.openstreetmap.org/api/0.5/map?bbox=" + map.getExtent().toBBOX();
$("status").innerHTML = "Loading more data...";
gml.loadGML();
}
function style_osm_feature(feature) {
feature.style.fill = "black";
if (feature.attributes.highway == "motorway") {
feature.style.strokeColor = "blue";
feature.style.strokeWidth = 5;
} else if (feature.attributes.highway == "primary") {
feature.style.strokeColor = "red";
} else if (feature.attributes.highway == "secondary") {
feature.style.strokeColor = "orange";
} else if (feature.attributes.highway) {
feature.style.strokeColor = "black";
}
}
function check_zoom() {
var zoom = map.getZoom();
if (zoom >= 11) { return true; }
if (zoom >= 9) { return confirm("Loading this amount of data may slow your browser. Are you sure you want to do this?"); }
$("status").innerHTML = "Area too large. Zoom in to load data. (Current zoom level: "+ zoom + ". Must be at zoom 9+.)";
return false;
}
function init(){
OpenLayers.ProxyHost = "proxy.cgi?url=";
OpenLayers.Feature.Vector.style['default'].strokeWidth = 4;
OpenLayers.Feature.Vector.style['default'].cursor = 'pointer';
map = new OpenLayers.Map('map', {'maxResolution': 360/512/16, 'numZoomLevels':15, controls: [ new OpenLayers.Control.Navigation(), new OpenLayers.Control.PanZoomBar() ]});
map.addControl(new OpenLayers.Control.LayerSwitcher());
map.addControl(new OpenLayers.Control.Permalink());
layer = new OpenLayers.Layer.WMS( "OSM",
[
"http://t1.hypercube.telascience.org/tiles?",
"http://t2.hypercube.telascience.org/tiles?",
"http://t3.hypercube.telascience.org/tiles?",
"http://t4.hypercube.telascience.org/tiles?"
],
{layers: 'osm-4326', format: 'image/png' } );
map.addLayer(layer);
if (!map.getCenter()) {
gml = new OpenLayers.Layer.GML("OSM", "osm/sutton_coldfield.osm", {format: OpenLayers.Format.OSM});
map.zoomToExtent(new OpenLayers.Bounds(-1.819072,52.549034,-1.814341,52.551582));
} else {
if (map.getZoom() >= 11) {
gml = new OpenLayers.Layer.GML("OSM", "http://www.openstreetmap.org/api/0.5/map?bbox=" + map.getExtent().toBBOX(), {format: OpenLayers.Format.OSM});
} else {
gml = new OpenLayers.Layer.GML("OSM", "xml/cambridgeport.osm", {format: OpenLayers.Format.OSM});
}
}
gml.events.register("loadstart", null, function() { $("status").innerHTML = "Loading..."; })
gml.events.register("loadend", null, function() { $("status").innerHTML = ""; })
map.addLayer(gml);
gml.preFeatureInsert = style_osm_feature;
var sf = new OpenLayers.Control.SelectFeature(gml, {'onSelect': on_feature_hover});
map.addControl(sf);
sf.activate();
}
</script>
</head>
<body onload="init()">
<div style="width:28%; float:right" id="download">
<ul>
<li><a href="javascript:new_data();">Download current view</a></li>
<li><a href="javascript:clear_data();">Clear current data</a></li>
<li><a href="javascript:export_vectors();">Export Vector Data</a></li>
</ul>
<div id="status">Loading...</div>
</div>
<div id="map"></div>
<a id="vectorlink" href="" style="display:none">Display via data: URL (FF Only)</a>
<textarea id="vectors" style="display:none;width:100%" rows="10"></textarea>
</body>
</html>

View File

@@ -0,0 +1,662 @@
<?xml version="1.0" encoding="UTF-8"?>
<osm version="0.5" generator="OpenStreetMap server">
<node id="200545" lat="52.5503033" lon="-1.8166417" user="blackadder" visible="true" timestamp="2006-03-22T16:33:41+00:00"/>
<node id="200546" lat="52.5501965" lon="-1.8168261" user="blackadder" visible="true" timestamp="2006-03-22T16:33:43+00:00"/>
<node id="200547" lat="52.5501645" lon="-1.8169929" user="blackadder" visible="true" timestamp="2006-03-22T16:33:45+00:00"/>
<node id="200548" lat="52.5501805" lon="-1.8172475" user="blackadder" visible="true" timestamp="2006-03-22T16:33:47+00:00"/>
<node id="200549" lat="52.5502392" lon="-1.8175372" user="blackadder" visible="true" timestamp="2006-03-22T16:33:50+00:00"/>
<node id="200627" lat="52.5499115" lon="-1.8161012" user="blackadder" visible="true" timestamp="2007-11-22T17:33:32+00:00"/>
<node id="200628" lat="52.5497408" lon="-1.81586" user="blackadder" visible="true" timestamp="2007-11-22T17:33:31+00:00"/>
<node id="200752" lat="52.5505598" lon="-1.8140051" user="blackadder" visible="true" timestamp="2006-03-22T16:36:20+00:00"/>
<node id="200758" lat="52.5501087" lon="-1.8142773" user="blackadder" visible="true" timestamp="2006-03-22T16:36:32+00:00"/>
<node id="645729" lat="52.5504008" lon="-1.8169154" user="blackadder" visible="true" timestamp="2006-07-24T23:21:42+01:00">
<tag k="place_name" v="Sutton Coldfield"/>
<tag k="ref" v="B72 1162"/>
<tag k="amenity" v="post_box"/>
<tag k="created_by" v="JOSM"/>
</node>
<node id="653121" lat="52.5506073" lon="-1.8137881" user="blackadder" visible="true" timestamp="2006-03-25T18:08:29+00:00">
<tag k="created_by" v="JOSM"/>
</node>
<node id="29783468" lat="52.5506446" lon="-1.8141177" user="blackadder" visible="true" timestamp="2007-05-30T14:22:33+01:00">
<tag k="created_by" v="JOSM"/>
</node>
<node id="29783470" lat="52.5501275" lon="-1.8151451" user="blackadder" visible="true" timestamp="2007-05-30T14:22:33+01:00">
<tag k="created_by" v="JOSM"/>
</node>
<node id="29783471" lat="52.5505521" lon="-1.8157703" user="blackadder" visible="true" timestamp="2007-12-18T15:33:59+00:00">
<tag k="created_by" v="JOSM"/>
</node>
<node id="29783472" lat="52.5501836" lon="-1.8164007" user="blackadder" visible="true" timestamp="2007-12-18T15:33:59+00:00">
<tag k="created_by" v="JOSM"/>
</node>
<node id="29783473" lat="52.5506035" lon="-1.8170311" user="blackadder" visible="true" timestamp="2007-05-30T14:21:32+01:00">
<tag k="created_by" v="JOSM"/>
</node>
<node id="29783474" lat="52.5509559" lon="-1.8164092" user="blackadder" visible="true" timestamp="2007-05-30T14:21:33+01:00">
<tag k="created_by" v="JOSM"/>
</node>
<node id="29783571" lat="52.5506331" lon="-1.813672" user="blackadder" visible="true" timestamp="2007-05-30T14:25:11+01:00">
<tag k="created_by" v="JOSM"/>
</node>
<node id="175922968" lat="52.5508635" lon="-1.8167837" user="blackadder" visible="true" timestamp="2007-12-18T16:12:50+00:00">
<tag k="created_by" v="JOSM"/>
</node>
<node id="175922970" lat="52.5507591" lon="-1.8169628" user="blackadder" visible="true" timestamp="2007-12-17T23:10:46+00:00">
<tag k="created_by" v="JOSM"/>
</node>
<node id="175923086" lat="52.5506787" lon="-1.8175799" user="blackadder" visible="true" timestamp="2007-12-17T23:10:50+00:00">
<tag k="created_by" v="JOSM"/>
</node>
<node id="175923089" lat="52.5505886" lon="-1.8177227" user="blackadder" visible="true" timestamp="2007-12-18T16:12:51+00:00">
<tag k="created_by" v="JOSM"/>
</node>
<node id="177128255" lat="52.5504144" lon="-1.8171548" user="blackadder" visible="true" timestamp="2007-12-18T16:12:52+00:00">
<tag k="created_by" v="JOSM"/>
</node>
<node id="177128257" lat="52.5506497" lon="-1.8175392" user="blackadder" visible="true" timestamp="2007-12-18T16:12:52+00:00">
<tag k="created_by" v="JOSM"/>
</node>
<node id="177128259" lat="52.550557" lon="-1.8176871" user="blackadder" visible="true" timestamp="2007-12-18T16:12:52+00:00">
<tag k="created_by" v="JOSM"/>
</node>
<node id="177128262" lat="52.5503122" lon="-1.8173195" user="blackadder" visible="true" timestamp="2007-12-18T16:12:52+00:00">
<tag k="created_by" v="JOSM"/>
</node>
<node id="177128265" lat="52.5499209" lon="-1.8164147" user="blackadder" visible="true" timestamp="2007-12-18T15:33:55+00:00">
<tag k="created_by" v="JOSM"/>
</node>
<node id="177128266" lat="52.550178" lon="-1.8175708" user="blackadder" visible="true" timestamp="2007-12-18T15:33:55+00:00">
<tag k="created_by" v="JOSM"/>
</node>
<node id="177128268" lat="52.550066" lon="-1.8176374" user="blackadder" visible="true" timestamp="2007-12-19T17:06:34+00:00">
<tag k="created_by" v="JOSM"/>
</node>
<node id="177128270" lat="52.5498069" lon="-1.8164854" user="blackadder" visible="true" timestamp="2007-12-19T17:06:34+00:00">
<tag k="created_by" v="JOSM"/>
</node>
<node id="177128273" lat="52.5498629" lon="-1.8162923" user="blackadder" visible="true" timestamp="2007-12-18T15:33:55+00:00">
<tag k="created_by" v="JOSM"/>
</node>
<node id="177128275" lat="52.5497909" lon="-1.8164134" user="blackadder" visible="true" timestamp="2007-12-19T17:06:34+00:00">
<tag k="created_by" v="JOSM"/>
</node>
<node id="177128278" lat="52.5502519" lon="-1.8173348" user="blackadder" visible="true" timestamp="2007-12-18T15:33:55+00:00">
<tag k="created_by" v="JOSM"/>
</node>
<node id="177128280" lat="52.5504396" lon="-1.817036" user="blackadder" visible="true" timestamp="2007-12-18T15:33:55+00:00">
<tag k="created_by" v="JOSM"/>
</node>
<node id="177128281" lat="52.5503051" lon="-1.816799" user="blackadder" visible="true" timestamp="2007-12-18T15:33:55+00:00">
<tag k="created_by" v="JOSM"/>
</node>
<node id="177128283" lat="52.5502337" lon="-1.8169643" user="blackadder" visible="true" timestamp="2007-12-18T15:33:55+00:00">
<tag k="created_by" v="JOSM"/>
</node>
<node id="177128286" lat="52.5503168" lon="-1.8170397" user="blackadder" visible="true" timestamp="2007-12-18T15:33:55+00:00">
<tag k="created_by" v="JOSM"/>
<tag k="amenity" v="parking"/>
</node>
<node id="177177218" lat="52.5501201" lon="-1.8175441" user="blackadder" visible="true" timestamp="2007-12-18T16:53:50+00:00">
<tag k="created_by" v="JOSM"/>
<tag k="ref" v="28"/>
<tag k="building" v="residential"/>
</node>
<node id="177177220" lat="52.5498859" lon="-1.8164918" user="blackadder" visible="true" timestamp="2007-12-18T16:53:50+00:00">
<tag k="created_by" v="JOSM"/>
<tag k="ref" v="2"/>
<tag k="building" v="residential"/>
</node>
<node id="177177222" lat="52.5498106" lon="-1.8162993" user="blackadder" visible="true" timestamp="2007-12-18T16:53:50+00:00">
<tag k="created_by" v="JOSM"/>
<tag k="ref" v="160"/>
<tag k="building" v="residential"/>
</node>
<node id="177230961" lat="52.550392" lon="-1.8172751" user="blackadder" visible="true" timestamp="2007-12-18T16:53:44+00:00">
<tag k="created_by" v="JOSM"/>
<tag k="ref" v="158"/>
<tag k="building" v="residential"/>
</node>
<node id="177230963" lat="52.5501893" lon="-1.8162725" user="blackadder" visible="true" timestamp="2007-12-18T16:53:44+00:00">
<tag k="created_by" v="JOSM"/>
</node>
<node id="177230965" lat="52.5502522" lon="-1.8161638" user="blackadder" visible="true" timestamp="2007-12-18T16:53:45+00:00">
<tag k="created_by" v="JOSM"/>
</node>
<node id="177230968" lat="52.5498311" lon="-1.8155709" user="blackadder" visible="true" timestamp="2007-12-18T16:53:45+00:00">
<tag k="created_by" v="JOSM"/>
</node>
<node id="177231022" lat="52.5497724" lon="-1.8156875" user="blackadder" visible="true" timestamp="2007-12-18T16:53:47+00:00">
<tag k="created_by" v="JOSM"/>
</node>
<node id="177231024" lat="52.5501922" lon="-1.8161729" user="blackadder" visible="true" timestamp="2007-12-18T16:53:47+00:00">
<tag k="created_by" v="JOSM"/>
<tag k="ref" v="145"/>
<tag k="building" v="residential"/>
</node>
<node id="200551" lat="52.5520062" lon="-1.8172738" user="blackadder" visible="true" timestamp="2006-03-22T16:33:54+00:00"/>
<node id="200552" lat="52.5520649" lon="-1.8171246" user="blackadder" visible="true" timestamp="2006-03-22T16:33:55+00:00"/>
<node id="200553" lat="52.5520008" lon="-1.8172124" user="blackadder" visible="true" timestamp="2006-03-22T16:33:59+00:00"/>
<node id="200554" lat="52.5517927" lon="-1.8169666" user="blackadder" visible="true" timestamp="2006-03-22T16:34:01+00:00"/>
<node id="200555" lat="52.5517499" lon="-1.8168788" user="blackadder" visible="true" timestamp="2006-03-22T16:34:03+00:00"/>
<node id="200556" lat="52.5517248" lon="-1.8167286" user="blackadder" visible="true" timestamp="2007-11-22T17:33:33+00:00"/>
<node id="200557" lat="52.5518792" lon="-1.8163956" user="blackadder" visible="true" timestamp="2007-11-22T17:33:33+00:00"/>
<node id="200558" lat="52.5519665" lon="-1.8163705" user="blackadder" visible="true" timestamp="2007-11-22T17:33:32+00:00"/>
<node id="200562" lat="52.5519848" lon="-1.815281" user="blackadder" visible="true" timestamp="2006-03-22T16:34:21+00:00"/>
<node id="200573" lat="52.5520736" lon="-1.8145054" user="blackadder" visible="true" timestamp="2006-03-22T16:34:49+00:00"/>
<node id="200751" lat="52.5511951" lon="-1.8142246" user="blackadder" visible="true" timestamp="2006-03-22T16:36:18+00:00"/>
<node id="29783476" lat="52.5513103" lon="-1.8169385" user="blackadder" visible="true" timestamp="2007-05-30T14:21:33+01:00">
<tag k="created_by" v="JOSM"/>
</node>
<node id="29783477" lat="52.5517893" lon="-1.8159626" user="blackadder" visible="true" timestamp="2007-05-30T14:21:33+01:00">
<tag k="created_by" v="JOSM"/>
</node>
<node id="29783478" lat="52.5518461" lon="-1.8145067" user="blackadder" visible="true" timestamp="2007-05-30T14:21:33+01:00">
<tag k="created_by" v="JOSM"/>
</node>
<node id="29783479" lat="52.5511883" lon="-1.8143197" user="blackadder" visible="true" timestamp="2007-05-30T14:21:33+01:00">
<tag k="created_by" v="JOSM"/>
</node>
<node id="200511" lat="52.5558034" lon="-1.8267378" user="blackadder" visible="true" timestamp="2006-03-22T16:32:25+00:00"/>
<node id="200512" lat="52.5550357" lon="-1.8249151" user="blackadder" visible="true" timestamp="2007-11-22T17:33:32+00:00"/>
<node id="200513" lat="52.5553343" lon="-1.8257585" user="blackadder" visible="true" timestamp="2006-03-22T16:32:28+00:00"/>
<node id="200514" lat="52.5546308" lon="-1.8238934" user="blackadder" visible="true" timestamp="2006-03-22T16:32:30+00:00"/>
<node id="200515" lat="52.5544693" lon="-1.823135" user="blackadder" visible="true" timestamp="2007-11-22T17:33:32+00:00"/>
<node id="200517" lat="52.5545308" lon="-1.8235208" user="blackadder" visible="true" timestamp="2006-03-22T16:32:37+00:00"/>
<node id="200526" lat="52.5543989" lon="-1.8225501" user="blackadder" visible="true" timestamp="2006-03-22T16:33:02+00:00"/>
<node id="200527" lat="52.5543241" lon="-1.8221902" user="blackadder" visible="true" timestamp="2006-03-22T16:33:05+00:00"/>
<node id="200528" lat="52.5542654" lon="-1.8219444" user="blackadder" visible="true" timestamp="2006-03-22T16:33:07+00:00"/>
<node id="200530" lat="52.5541587" lon="-1.8216547" user="blackadder" visible="true" timestamp="2006-03-22T16:33:11+00:00"/>
<node id="200532" lat="52.5538918" lon="-1.821163" user="blackadder" visible="true" timestamp="2006-03-22T16:33:15+00:00"/>
<node id="200533" lat="52.5536782" lon="-1.8208031" user="blackadder" visible="true" timestamp="2006-03-22T16:33:17+00:00"/>
<node id="200534" lat="52.5534108" lon="-1.8204187" user="blackadder" visible="true" timestamp="2006-03-22T16:33:19+00:00"/>
<node id="200535" lat="52.5530804" lon="-1.8200481" user="blackadder" visible="true" timestamp="2006-03-22T16:33:21+00:00"/>
<node id="200536" lat="52.5527228" lon="-1.8197232" user="blackadder" visible="true" timestamp="2006-03-22T16:33:23+00:00"/>
<node id="200537" lat="52.5525413" lon="-1.8195652" user="blackadder" visible="true" timestamp="2006-03-22T16:33:25+00:00"/>
<node id="200539" lat="52.5522844" lon="-1.8193896" user="blackadder" visible="true" timestamp="2006-03-22T16:33:29+00:00"/>
<node id="200540" lat="52.5519374" lon="-1.8190999" user="blackadder" visible="true" timestamp="2006-03-22T16:33:31+00:00"/>
<node id="200541" lat="52.5521848" lon="-1.8193018" user="blackadder" visible="true" timestamp="2007-12-17T23:11:03+00:00"/>
<node id="200542" lat="52.5516186" lon="-1.8186947" user="blackadder" visible="true" timestamp="2007-11-22T17:33:32+00:00"/>
<node id="200543" lat="52.5517933" lon="-1.8189419" user="blackadder" visible="true" timestamp="2006-03-22T16:33:37+00:00"/>
<node id="200544" lat="52.5513983" lon="-1.8183449" user="blackadder" visible="true" timestamp="2006-03-22T16:33:39+00:00"/>
<node id="200550" lat="52.5519976" lon="-1.8179888" user="blackadder" visible="true" timestamp="2007-11-22T17:33:33+00:00"/>
<node id="200559" lat="52.5523069" lon="-1.816393" user="blackadder" visible="true" timestamp="2007-11-22T17:33:32+00:00"/>
<node id="200560" lat="52.5523905" lon="-1.8163169" user="blackadder" visible="true" timestamp="2007-11-22T17:33:32+00:00"/>
<node id="200561" lat="52.552524" lon="-1.8159306" user="blackadder" visible="true" timestamp="2006-03-22T21:55:12+00:00"/>
<node id="200563" lat="52.5526121" lon="-1.8152809" user="blackadder" visible="true" timestamp="2006-03-22T16:34:24+00:00"/>
<node id="200564" lat="52.5526358" lon="-1.8149766" user="blackadder" visible="true" timestamp="2007-11-22T17:33:34+00:00"/>
<node id="200565" lat="52.5526654" lon="-1.8146664" user="blackadder" visible="true" timestamp="2006-03-22T16:34:29+00:00"/>
<node id="200566" lat="52.5525937" lon="-1.8156438" user="blackadder" visible="true" timestamp="2006-03-22T16:34:31+00:00"/>
<node id="200571" lat="52.5535575" lon="-1.8148566" user="blackadder" visible="true" timestamp="2007-11-15T12:54:40+00:00"/>
<node id="200572" lat="52.5523885" lon="-1.8145932" user="blackadder" visible="true" timestamp="2006-03-22T16:34:46+00:00"/>
<node id="200629" lat="52.5495701" lon="-1.8156789" user="blackadder" visible="true" timestamp="2007-11-22T17:33:31+00:00"/>
<node id="200630" lat="52.5493694" lon="-1.815524" user="blackadder" visible="true" timestamp="2007-11-22T17:33:31+00:00"/>
<node id="200631" lat="52.5490781" lon="-1.8153587" user="blackadder" visible="true" timestamp="2007-11-22T17:33:31+00:00"/>
<node id="200632" lat="52.5488293" lon="-1.815287" user="blackadder" visible="true" timestamp="2007-11-22T17:33:32+00:00"/>
<node id="200633" lat="52.5485269" lon="-1.8153192" user="blackadder" visible="true" timestamp="2007-11-22T17:33:32+00:00"/>
<node id="200650" lat="52.5482109" lon="-1.815399" user="blackadder" visible="true" timestamp="2007-11-22T17:33:31+00:00"/>
<node id="200651" lat="52.5478984" lon="-1.8153867" user="blackadder" visible="true" timestamp="2007-11-22T17:33:31+00:00"/>
<node id="200652" lat="52.5474767" lon="-1.8152603" user="blackadder" visible="true" timestamp="2007-11-22T17:33:31+00:00"/>
<node id="200653" lat="52.5468312" lon="-1.8150679" user="blackadder" visible="true" timestamp="2007-11-22T17:33:29+00:00"/>
<node id="200753" lat="52.5496876" lon="-1.8136891" user="blackadder" visible="true" timestamp="2006-03-22T21:55:13+00:00"/>
<node id="200754" lat="52.549009" lon="-1.8133906" user="blackadder" visible="true" timestamp="2006-03-22T16:36:24+00:00"/>
<node id="200755" lat="52.5478879" lon="-1.8128287" user="blackadder" visible="true" timestamp="2006-03-22T16:36:26+00:00"/>
<node id="200756" lat="52.548993" lon="-1.8134871" user="blackadder" visible="true" timestamp="2006-03-22T16:36:28+00:00"/>
<node id="200757" lat="52.5490304" lon="-1.8135925" user="blackadder" visible="true" timestamp="2006-03-22T16:36:31+00:00"/>
<node id="200759" lat="52.5464722" lon="-1.8119684" user="blackadder" visible="true" timestamp="2006-03-22T16:36:34+00:00"/>
<node id="200771" lat="52.5466312" lon="-1.8121126" user="blackadder" visible="true" timestamp="2006-03-22T16:37:02+00:00"/>
<node id="653117" lat="52.5423754" lon="-1.8078749" user="blackadder" visible="true" timestamp="2007-11-26T18:40:45+00:00">
<tag k="created_by" v="JOSM"/>
</node>
<node id="653118" lat="52.5465842" lon="-1.81179" user="blackadder" visible="true" timestamp="2006-03-25T18:08:29+00:00">
<tag k="created_by" v="JOSM"/>
</node>
<node id="653119" lat="52.5444001" lon="-1.8100834" user="blackadder" visible="true" timestamp="2006-03-25T18:08:29+00:00">
<tag k="created_by" v="JOSM"/>
</node>
<node id="653120" lat="52.5490713" lon="-1.8131664" user="blackadder" visible="true" timestamp="2006-03-25T18:08:29+00:00">
<tag k="created_by" v="JOSM"/>
</node>
<node id="653122" lat="52.5526798" lon="-1.814402" user="blackadder" visible="true" timestamp="2006-03-25T18:08:29+00:00">
<tag k="created_by" v="JOSM"/>
</node>
<node id="653123" lat="52.5536564" lon="-1.814631" user="blackadder" visible="true" timestamp="2007-11-15T12:54:42+00:00">
<tag k="created_by" v="JOSM"/>
</node>
<node id="29783564" lat="52.5538289" lon="-1.8145536" user="blackadder" visible="true" timestamp="2007-11-15T12:53:07+00:00">
<tag k="created_by" v="JOSM"/>
</node>
<node id="29783565" lat="52.5539485" lon="-1.8128538" user="blackadder" visible="true" timestamp="2007-11-15T12:53:07+00:00">
<tag k="created_by" v="JOSM"/>
</node>
<node id="29783566" lat="52.5509299" lon="-1.8119156" user="blackadder" visible="true" timestamp="2007-05-30T14:25:10+01:00">
<tag k="created_by" v="JOSM"/>
</node>
<node id="29783567" lat="52.5470281" lon="-1.8097771" user="blackadder" visible="true" timestamp="2007-05-30T14:25:11+01:00">
<tag k="created_by" v="JOSM"/>
</node>
<node id="29783568" lat="52.5465979" lon="-1.811457" user="blackadder" visible="true" timestamp="2007-05-30T14:25:11+01:00">
<tag k="created_by" v="JOSM"/>
</node>
<node id="29783569" lat="52.5466086" lon="-1.8115118" user="blackadder" visible="true" timestamp="2007-05-30T14:25:11+01:00">
<tag k="created_by" v="JOSM"/>
</node>
<node id="29783570" lat="52.5491153" lon="-1.8130205" user="blackadder" visible="true" timestamp="2007-05-30T14:25:11+01:00">
<tag k="created_by" v="JOSM"/>
</node>
<node id="29783572" lat="52.5527014" lon="-1.8142812" user="blackadder" visible="true" timestamp="2007-05-30T14:25:11+01:00">
<tag k="created_by" v="JOSM"/>
</node>
<node id="135352210" lat="52.5549423" lon="-1.814954" user="blackadder" visible="true" timestamp="2007-11-26T18:37:58+00:00">
<tag k="created_by" v="JOSM"/>
</node>
<node id="175922965" lat="52.551783" lon="-1.8181591" user="blackadder" visible="true" timestamp="2007-12-18T16:12:50+00:00">
<tag k="created_by" v="JOSM"/>
</node>
<node id="175922972" lat="52.5516751" lon="-1.8183582" user="blackadder" visible="true" timestamp="2007-12-17T23:10:46+00:00">
<tag k="created_by" v="JOSM"/>
</node>
<node id="175923064" lat="52.5542375" lon="-1.8222046" user="blackadder" visible="true" timestamp="2007-12-18T15:34:00+00:00">
<tag k="created_by" v="JOSM"/>
</node>
<node id="175923066" lat="52.5540618" lon="-1.8217823" user="blackadder" visible="true" timestamp="2007-12-17T23:10:49+00:00">
<tag k="created_by" v="JOSM"/>
</node>
<node id="175923068" lat="52.5537913" lon="-1.8213338" user="blackadder" visible="true" timestamp="2007-12-17T23:10:49+00:00">
<tag k="created_by" v="JOSM"/>
</node>
<node id="175923070" lat="52.5529993" lon="-1.8203219" user="blackadder" visible="true" timestamp="2007-12-17T23:10:49+00:00">
<tag k="created_by" v="JOSM"/>
</node>
<node id="175923072" lat="52.5521418" lon="-1.8195539" user="blackadder" visible="true" timestamp="2007-12-17T23:10:49+00:00">
<tag k="created_by" v="JOSM"/>
</node>
<node id="175923077" lat="52.5517862" lon="-1.8192228" user="blackadder" visible="true" timestamp="2007-12-18T16:12:51+00:00">
<tag k="created_by" v="JOSM"/>
</node>
<node id="175923081" lat="52.55152" lon="-1.8188757" user="blackadder" visible="true" timestamp="2007-12-17T23:10:49+00:00">
<tag k="created_by" v="JOSM"/>
</node>
<node id="175923083" lat="52.5510247" lon="-1.8181078" user="blackadder" visible="true" timestamp="2007-12-17T23:10:50+00:00">
<tag k="created_by" v="JOSM"/>
</node>
<node id="175923092" lat="52.5514479" lon="-1.8190434" user="blackadder" visible="true" timestamp="2007-12-18T16:12:51+00:00">
<tag k="created_by" v="JOSM"/>
</node>
<node id="175923093" lat="52.5517434" lon="-1.8194353" user="blackadder" visible="true" timestamp="2007-12-18T16:12:51+00:00">
<tag k="created_by" v="JOSM"/>
</node>
<node id="175923094" lat="52.5529379" lon="-1.8205018" user="blackadder" visible="true" timestamp="2007-12-18T16:12:51+00:00">
<tag k="created_by" v="JOSM"/>
</node>
<node id="175923095" lat="52.5537161" lon="-1.8214889" user="blackadder" visible="true" timestamp="2007-12-18T16:12:51+00:00">
<tag k="created_by" v="JOSM"/>
</node>
<node id="175923096" lat="52.5539755" lon="-1.8218808" user="blackadder" visible="true" timestamp="2007-12-18T16:12:50+00:00">
<tag k="created_by" v="JOSM"/>
</node>
<node id="175923099" lat="52.5541405" lon="-1.8222767" user="blackadder" visible="true" timestamp="2007-12-18T15:34:00+00:00">
<tag k="created_by" v="JOSM"/>
</node>
<node id="177081428" lat="52.5552884" lon="-1.8256253" user="blackadder" visible="true" timestamp="2007-12-18T15:01:16+00:00">
<tag k="created_by" v="JOSM"/>
</node>
<node id="177081440" lat="52.5551147" lon="-1.825166" user="blackadder" visible="true" timestamp="2007-12-18T15:01:17+00:00">
<tag k="created_by" v="JOSM"/>
</node>
<node id="177128288" lat="52.5496708" lon="-1.816009" user="blackadder" visible="true" timestamp="2007-12-18T15:33:55+00:00">
<tag k="created_by" v="JOSM"/>
</node>
<node id="177128291" lat="52.5494958" lon="-1.8157939" user="blackadder" visible="true" timestamp="2007-12-18T15:33:56+00:00">
<tag k="created_by" v="JOSM"/>
</node>
<node id="177128294" lat="52.5492862" lon="-1.8156326" user="blackadder" visible="true" timestamp="2007-12-18T15:33:56+00:00">
<tag k="created_by" v="JOSM"/>
</node>
<node id="177128297" lat="52.5490612" lon="-1.8155156" user="blackadder" visible="true" timestamp="2007-12-18T15:33:56+00:00">
<tag k="created_by" v="JOSM"/>
</node>
<node id="177128299" lat="52.5488284" lon="-1.8154808" user="blackadder" visible="true" timestamp="2007-12-18T15:33:56+00:00">
<tag k="created_by" v="JOSM"/>
</node>
<node id="177128301" lat="52.5488246" lon="-1.8156477" user="blackadder" visible="true" timestamp="2007-12-19T17:06:33+00:00">
<tag k="created_by" v="JOSM"/>
</node>
<node id="177128303" lat="52.5490573" lon="-1.8156698" user="blackadder" visible="true" timestamp="2007-12-19T17:06:33+00:00">
<tag k="created_by" v="JOSM"/>
</node>
<node id="177128306" lat="52.5492802" lon="-1.8157959" user="blackadder" visible="true" timestamp="2007-12-19T17:06:33+00:00">
<tag k="created_by" v="JOSM"/>
</node>
<node id="177128308" lat="52.5494967" lon="-1.8159735" user="blackadder" visible="true" timestamp="2007-12-19T17:06:33+00:00">
<tag k="created_by" v="JOSM"/>
</node>
<node id="177128310" lat="52.549613" lon="-1.8161509" user="blackadder" visible="true" timestamp="2007-12-19T17:06:33+00:00">
<tag k="created_by" v="JOSM"/>
</node>
<node id="177230972" lat="52.5496355" lon="-1.8153859" user="blackadder" visible="true" timestamp="2007-12-18T16:53:45+00:00">
<tag k="created_by" v="JOSM"/>
</node>
<node id="177230975" lat="52.5494398" lon="-1.8152371" user="blackadder" visible="true" timestamp="2007-12-18T16:53:45+00:00">
<tag k="created_by" v="JOSM"/>
</node>
<node id="177230979" lat="52.5492418" lon="-1.8151165" user="blackadder" visible="true" timestamp="2007-12-18T16:53:45+00:00">
<tag k="created_by" v="JOSM"/>
</node>
<node id="177230981" lat="52.5490437" lon="-1.8150441" user="blackadder" visible="true" timestamp="2007-12-18T16:53:45+00:00">
<tag k="created_by" v="JOSM"/>
</node>
<node id="177230983" lat="52.5488114" lon="-1.8149878" user="blackadder" visible="true" timestamp="2007-12-18T16:53:45+00:00">
<tag k="created_by" v="JOSM"/>
</node>
<node id="177230985" lat="52.5485375" lon="-1.815024" user="blackadder" visible="true" timestamp="2007-12-18T16:53:45+00:00">
<tag k="created_by" v="JOSM"/>
</node>
<node id="177230988" lat="52.5481977" lon="-1.8150843" user="blackadder" visible="true" timestamp="2007-12-18T16:53:46+00:00">
<tag k="created_by" v="JOSM"/>
</node>
<node id="177230989" lat="52.5480118" lon="-1.8150884" user="blackadder" visible="true" timestamp="2007-12-18T16:53:46+00:00">
<tag k="created_by" v="JOSM"/>
</node>
<node id="177230996" lat="52.5480143" lon="-1.8152371" user="blackadder" visible="true" timestamp="2007-12-18T16:53:46+00:00">
<tag k="created_by" v="JOSM"/>
</node>
<node id="177231000" lat="52.5482099" lon="-1.8152331" user="blackadder" visible="true" timestamp="2007-12-18T16:53:46+00:00">
<tag k="created_by" v="JOSM"/>
</node>
<node id="177231003" lat="52.5485498" lon="-1.8151567" user="blackadder" visible="true" timestamp="2007-12-18T16:53:46+00:00">
<tag k="created_by" v="JOSM"/>
</node>
<node id="177231007" lat="52.5488212" lon="-1.8151246" user="blackadder" visible="true" timestamp="2007-12-18T16:53:46+00:00">
<tag k="created_by" v="JOSM"/>
</node>
<node id="177231010" lat="52.5490364" lon="-1.8151728" user="blackadder" visible="true" timestamp="2007-12-18T16:53:46+00:00">
<tag k="created_by" v="JOSM"/>
</node>
<node id="177231014" lat="52.5492393" lon="-1.8152452" user="blackadder" visible="true" timestamp="2007-12-18T16:53:46+00:00">
<tag k="created_by" v="JOSM"/>
</node>
<node id="177231016" lat="52.5494081" lon="-1.8153618" user="blackadder" visible="true" timestamp="2007-12-18T16:53:46+00:00">
<tag k="created_by" v="JOSM"/>
</node>
<node id="177231019" lat="52.5495915" lon="-1.8155106" user="blackadder" visible="true" timestamp="2007-12-18T16:53:47+00:00">
<tag k="created_by" v="JOSM"/>
</node>
<node id="177231081" lat="52.5555213" lon="-1.8261466" user="blackadder" visible="true" timestamp="2007-12-18T16:53:49+00:00">
<tag k="created_by" v="JOSM"/>
</node>
<way id="35" visible="true" timestamp="2007-09-18T02:37:16+01:00" user="crschmidt">
<nd ref="200542"/>
<nd ref="200550"/>
<nd ref="200551"/>
<nd ref="200553"/>
<tag k="note" v="fire access route"/>
<tag k="created_by" v="JOSM"/>
<tag k="highway" v="footway"/>
<tag k="place_name" v="Sutton Coldfield"/>
<tag k="surface" v="paved"/>
</way>
<way id="37" visible="true" timestamp="2007-12-18T16:53:51+00:00" user="blackadder">
<nd ref="200511"/>
<nd ref="177231081"/>
<nd ref="200513"/>
<nd ref="177081428"/>
<nd ref="177081440"/>
<nd ref="200512"/>
<nd ref="200514"/>
<nd ref="200517"/>
<nd ref="200515"/>
<nd ref="200526"/>
<nd ref="200527"/>
<nd ref="200528"/>
<nd ref="200530"/>
<nd ref="200532"/>
<nd ref="200533"/>
<nd ref="200534"/>
<nd ref="200535"/>
<nd ref="200536"/>
<nd ref="200537"/>
<nd ref="200539"/>
<nd ref="200541"/>
<nd ref="200540"/>
<nd ref="200543"/>
<nd ref="200542"/>
<nd ref="200544"/>
<nd ref="200545"/>
<nd ref="200627"/>
<nd ref="200628"/>
<nd ref="200629"/>
<nd ref="200630"/>
<nd ref="200631"/>
<nd ref="200632"/>
<nd ref="200633"/>
<nd ref="200650"/>
<nd ref="200651"/>
<nd ref="200652"/>
<nd ref="200653"/>
<tag k="created_by" v="JOSM"/>
<tag k="place_name" v="Sutton Coldfield"/>
<tag k="postal_code" v="B72"/>
<tag k="name" v="Maney Hill Road"/>
<tag k="abutters" v="residential"/>
<tag k="highway" v="residential"/>
</way>
<way id="54" visible="true" timestamp="2006-03-29T09:51:45+01:00" user="blackadder">
<nd ref="200545"/>
<nd ref="200546"/>
<nd ref="200547"/>
<nd ref="200548"/>
<nd ref="200549"/>
<tag k="name" v="Mottrams Close"/>
<tag k="abutters" v="residential"/>
<tag k="postal_code" v="B72"/>
<tag k="highway" v="residential"/>
<tag k="place_name" v="Sutton Coldfield"/>
<tag k="created_by" v="JOSM"/>
</way>
<way id="55" visible="true" timestamp="2006-03-22T21:55:16+00:00" user="blackadder">
<nd ref="200758"/>
<nd ref="200757"/>
<nd ref="200756"/>
<nd ref="200754"/>
<tag k="place_name" v="Sutton Coldfield"/>
<tag k="highway" v="residential"/>
<tag k="postal_code" v="B72"/>
<tag k="name" v="East View Road"/>
<tag k="created_by" v="JOSM"/>
</way>
<way id="57" visible="true" timestamp="2007-09-26T14:35:13+01:00" user="blackadder">
<nd ref="200571"/>
<nd ref="200565"/>
<nd ref="200572"/>
<nd ref="200573"/>
<nd ref="200751"/>
<nd ref="200752"/>
<nd ref="200753"/>
<nd ref="200754"/>
<nd ref="200755"/>
<nd ref="200771"/>
<nd ref="200759"/>
<tag k="place_name" v="Sutton Coldfield"/>
<tag k="postal_code" v="B72"/>
<tag k="name" v="East View Road"/>
<tag k="created_by" v="JOSM"/>
<tag k="highway" v="unclassified"/>
</way>
<way id="395" visible="true" timestamp="2007-12-19T17:50:08+00:00" user="blackadder">
<nd ref="200552"/>
<nd ref="200553"/>
<nd ref="200554"/>
<nd ref="200555"/>
<nd ref="200556"/>
<nd ref="200557"/>
<nd ref="200558"/>
<nd ref="200559"/>
<nd ref="200560"/>
<nd ref="200561"/>
<nd ref="200566"/>
<nd ref="200563"/>
<nd ref="200564"/>
<nd ref="200565"/>
<tag k="place_name" v="Sutton Coldfield"/>
<tag k="postal_code" v="B72"/>
<tag k="name" v="Shooters Hill"/>
<tag k="abutters" v="residential"/>
<tag k="created_by" v="JOSM"/>
<tag k="highway" v="residential"/>
</way>
<way id="418" visible="true" timestamp="2006-03-25T11:39:32+00:00" user="blackadder">
<nd ref="200562"/>
<nd ref="200563"/>
<tag k="place_name" v="Sutton Coldfield"/>
<tag k="highway" v="residential"/>
<tag k="postal_code" v="B72"/>
<tag k="abutters" v="residential"/>
<tag k="name" v="Corncrake Close"/>
<tag k="created_by" v="JOSM"/>
</way>
<way id="4685537" visible="true" timestamp="2007-05-30T14:21:35+01:00" user="blackadder">
<nd ref="29783472"/>
<nd ref="29783473"/>
<nd ref="29783474"/>
<nd ref="29783476"/>
<nd ref="29783477"/>
<nd ref="29783478"/>
<nd ref="29783479"/>
<nd ref="29783468"/>
<nd ref="29783470"/>
<nd ref="29783471"/>
<nd ref="29783472"/>
<tag k="name" v="Maney Hill School"/>
<tag k="created_by" v="JOSM"/>
<tag k="landuse" v="school"/>
<tag k="amenity" v="school"/>
</way>
<way id="4685542" visible="true" timestamp="2007-05-30T14:25:15+01:00" user="blackadder">
<nd ref="29783570"/>
<nd ref="29783571"/>
<nd ref="29783572"/>
<nd ref="29783564"/>
<nd ref="29783565"/>
<nd ref="29783566"/>
<nd ref="29783567"/>
<nd ref="29783568"/>
<nd ref="29783569"/>
<nd ref="29783570"/>
<tag k="landuse" v="school"/>
<tag k="created_by" v="JOSM"/>
<tag k="amenity" v="school"/>
</way>
<way id="14166897" visible="true" timestamp="2007-11-26T18:40:45+00:00" user="blackadder">
<nd ref="135352210"/>
<nd ref="653123"/>
<nd ref="653122"/>
<nd ref="653121"/>
<nd ref="653120"/>
<nd ref="653118"/>
<nd ref="653119"/>
<nd ref="653117"/>
<tag k="created_by" v="JOSM"/>
<tag k="name" v="Freight Line"/>
<tag k="railway" v="rail"/>
</way>
<way id="16966783" visible="true" timestamp="2007-12-17T23:11:00+00:00" user="blackadder">
<nd ref="175922965"/>
<nd ref="175922968"/>
<nd ref="175922970"/>
<nd ref="175922972"/>
<nd ref="175922965"/>
<tag k="created_by" v="JOSM"/>
<tag k="building" v="residential"/>
</way>
<way id="16966792" visible="true" timestamp="2007-12-17T23:11:01+00:00" user="blackadder">
<nd ref="175923064"/>
<nd ref="175923066"/>
<nd ref="175923068"/>
<nd ref="175923070"/>
<nd ref="175923072"/>
<nd ref="175923077"/>
<nd ref="175923081"/>
<nd ref="175923083"/>
<nd ref="175923086"/>
<nd ref="175923089"/>
<nd ref="175923092"/>
<nd ref="175923093"/>
<nd ref="175923094"/>
<nd ref="175923095"/>
<nd ref="175923096"/>
<nd ref="175923099"/>
<nd ref="175923064"/>
<tag k="created_by" v="JOSM"/>
<tag k="building" v="residential"/>
</way>
<way id="17060325" visible="true" timestamp="2007-12-18T15:37:01+00:00" user="blackadder">
<nd ref="177128255"/>
<nd ref="177128262"/>
<nd ref="177128259"/>
<nd ref="177128257"/>
<nd ref="177128255"/>
<tag k="created_by" v="JOSM"/>
<tag k="building" v="residential"/>
</way>
<way id="17060326" visible="true" timestamp="2007-12-18T15:37:01+00:00" user="blackadder">
<nd ref="177128265"/>
<nd ref="177128270"/>
<nd ref="177128268"/>
<nd ref="177128266"/>
<nd ref="177128265"/>
<tag k="created_by" v="JOSM"/>
<tag k="building" v="residential"/>
</way>
<way id="17060327" visible="true" timestamp="2007-12-18T15:37:01+00:00" user="blackadder">
<nd ref="177128275"/>
<nd ref="177128273"/>
<nd ref="177128288"/>
<nd ref="177128291"/>
<nd ref="177128294"/>
<nd ref="177128297"/>
<nd ref="177128299"/>
<nd ref="177128301"/>
<nd ref="177128303"/>
<nd ref="177128306"/>
<nd ref="177128308"/>
<nd ref="177128310"/>
<nd ref="177128275"/>
<tag k="created_by" v="JOSM"/>
<tag k="building" v="residential"/>
</way>
<way id="17060329" visible="true" timestamp="2007-12-18T15:33:58+00:00" user="blackadder">
<nd ref="177128278"/>
<nd ref="177128280"/>
<nd ref="177128281"/>
<nd ref="177128283"/>
<nd ref="177128278"/>
<tag k="created_by" v="JOSM"/>
<tag k="amenity" v="parking"/>
</way>
<way id="17067452" visible="true" timestamp="2007-12-18T16:53:49+00:00" user="blackadder">
<nd ref="177230963"/>
<nd ref="177230965"/>
<nd ref="177230968"/>
<nd ref="177230972"/>
<nd ref="177230975"/>
<nd ref="177230979"/>
<nd ref="177230981"/>
<nd ref="177230983"/>
<nd ref="177230985"/>
<nd ref="177230988"/>
<nd ref="177230989"/>
<nd ref="177230996"/>
<nd ref="177231000"/>
<nd ref="177231003"/>
<nd ref="177231007"/>
<nd ref="177231010"/>
<nd ref="177231014"/>
<nd ref="177231016"/>
<nd ref="177231019"/>
<nd ref="177231022"/>
<nd ref="177230963"/>
<tag k="created_by" v="JOSM"/>
<tag k="building" v="residential"/>
</way>
</osm>

View File

@@ -17,7 +17,8 @@ import sys, os
allowedHosts = ['www.openlayers.org', 'openlayers.org',
'labs.metacarta.com', 'world.freemap.in',
'prototype.openmnnd.org', 'geo.openplans.org']
'prototype.openmnnd.org', 'geo.openplans.org',
'www.openstreetmap.org']
method = os.environ["REQUEST_METHOD"]

View File

@@ -180,6 +180,7 @@
"OpenLayers/Format/GeoRSS.js",
"OpenLayers/Format/WFS.js",
"OpenLayers/Format/WKT.js",
"OpenLayers/Format/OSM.js",
"OpenLayers/Format/SLD.js",
"OpenLayers/Format/Text.js",
"OpenLayers/Format/JSON.js",

View File

@@ -0,0 +1,450 @@
/* Copyright (c) 2006-2007 MetaCarta, Inc., published under a modified BSD license.
* See http://svn.openlayers.org/trunk/openlayers/repository-license.txt
* for the full text of the license. */
/**
* @requires OpenLayers/Format/XML.js
* @requires OpenLayers/Feature/Vector.js
* @requires OpenLayers/Geometry/Point.js
* @requires OpenLayers/Geometry/LineString.js
* @requires OpenLayers/Geometry/Polygon.js
*/
/**
* Class: OpenLayers.Format.OSM
* OSM parser. Create a new instance with the
* <OpenLayers.Format.OSM> constructor.
*
* Inherits from:
* - <OpenLayers.Format.XML>
*/
OpenLayers.Format.OSM = OpenLayers.Class(OpenLayers.Format.XML, {
/**
* APIProperty: checkTags
* {Boolean} Should tags be checked to determine whether something
* should be treated as a seperate node. Will slow down parsing.
* Default is false.
*/
checkTags: false,
/**
* Property: interestingTagsExclude
* {Array} List of tags to exclude from 'interesting' checks on nodes.
* Must be set when creating the format. Will only be used if checkTags
* is set.
*/
interestingTagsExclude: null,
/**
* APIProperty: areaTags
* {Array} List of tags indicating that something is an area.
* Must be set when creating the format. Will only be used if
* checkTags is true.
*/
areaTags: null,
/**
* Constructor: OpenLayers.Format.OSM
* Create a new parser for OSM.
*
* Parameters:
* options - {Object} An optional object whose properties will be set on
* this instance.
*/
initialize: function(options) {
var layer_defaults = {
'interestingTagsExclude': ['source', 'source_ref',
'source:ref', 'history', 'attribution', 'created_by'],
'areaTags': ['area', 'building', 'leisure', 'tourism', 'ruins',
'historic', 'landuse', 'military', 'natural', 'sport']
};
layer_defaults = OpenLayers.Util.extend(layer_defaults, options);
var interesting = {};
for (var i = 0; i < layer_defaults.interestingTagsExclude.length; i++) {
interesting[layer_defaults.interestingTagsExclude[i]] = true;
}
layer_defaults.interestingTagsExclude = interesting;
var area = {};
for (var i = 0; i < layer_defaults.areaTags.length; i++) {
area[layer_defaults.areaTags[i]] = true;
}
layer_defaults.areaTags = area;
OpenLayers.Format.XML.prototype.initialize.apply(this, [layer_defaults]);
},
/**
* APIMethod: read
* Return a list of features from a OSM doc
* Parameters:
* data - {Element}
*
* Returns:
* An Array of <OpenLayers.Feature.Vector>s
*/
read: function(doc) {
if (typeof doc == "string") {
doc = OpenLayers.Format.XML.prototype.read.apply(this, [doc]);
}
var nodes = this.getNodes(doc);
var ways = this.getWays(doc);
// Geoms will contain at least ways.length entries.
var feat_list = new Array(ways.length);
for (var i = 0; i < ways.length; i++) {
// We know the minimal of this one ahead of time. (Could be -1
// due to areas/polygons)
var point_list = new Array(ways[i].nodes.length);
var poly = this.isWayArea(ways[i]) ? 1 : 0;
for (var j = 0; j < ways[i].nodes.length; j++) {
var node = nodes[ways[i].nodes[j]];
var point = new OpenLayers.Geometry.Point(node.lon, node.lat);
// Since OSM is topological, we stash the node ID internally.
point.osm_id = parseInt(ways[i].nodes[j]);
point_list[j] = point;
// We don't display nodes if they're used inside other
// elements.
node.used = true;
}
var geometry = null;
if (poly) {
geometry = new OpenLayers.Geometry.Polygon(
new OpenLayers.Geometry.LinearRing(point_list));
} else {
geometry = new OpenLayers.Geometry.LineString(point_list);
}
if (this.internalProjection && this.externalProjection) {
geometry.transform(this.externalProjection,
this.internalProjection);
}
var feat = new OpenLayers.Feature.Vector(geometry,
ways[i].tags);
feat.osm_id = parseInt(ways[i].id);
feat_list[i] = feat;
}
for (var node_id in nodes) {
var node = nodes[node_id];
if (!node.used || this.checkTags) {
var tags = null;
if (this.checkTags) {
var result = this.getTags(node.node, true);
if (node.used && !result[1]) {
continue;
}
tags = result[0];
} else {
tags = this.getTags(node.node);
}
var feat = new OpenLayers.Feature.Vector(
new OpenLayers.Geometry.Point(node['lon'], node['lat']),
tags);
if (this.internalProjection && this.externalProjection) {
feat.geometry.transform(this.externalProjection,
this.internalProjection);
}
feat.osm_id = parseInt(node_id);
feat_list.push(feat);
}
// Memory cleanup
node.node = null;
}
return feat_list;
},
/**
* Method: getNodes
* Return the node items from a doc.
*
* Parameters:
* node - {DOMElement} node to parse tags from
*/
getNodes: function(doc) {
var node_list = doc.getElementsByTagName("node");
var nodes = {};
for (var i = 0; i < node_list.length; i++) {
var node = node_list[i];
var id = node.getAttribute("id");
nodes[id] = {
'lat': node.getAttribute("lat"),
'lon': node.getAttribute("lon"),
'node': node
};
}
return nodes;
},
/**
* Method: getWays
* Return the way items from a doc.
*
* Parameters:
* node - {DOMElement} node to parse tags from
*/
getWays: function(doc) {
var way_list = doc.getElementsByTagName("way");
var return_ways = [];
for (var i = 0; i < way_list.length; i++) {
var way = way_list[i];
var way_object = {
id: way.getAttribute("id")
};
way_object.tags = this.getTags(way);
var node_list = way.getElementsByTagName("nd");
way_object.nodes = new Array(node_list.length);
for (var j = 0; j < node_list.length; j++) {
way_object.nodes[j] = node_list[j].getAttribute("ref");
}
return_ways.push(way_object);
}
return return_ways;
},
/**
* Method: getTags
* Return the tags list attached to a specific DOM element.
*
* Parameters:
* node - {DOMElement} node to parse tags from
* interesting_tags - {Boolean} whether the return from this function should
* return a boolean indicating that it has 'interesting tags' --
* tags like attribution and source are ignored. (To change the list
* of tags, see interestingTagsExclude)
*
* Returns:
* tags - {Object} hash of tags
* interesting - {Boolean} if interesting_tags is passed, returns
* whether there are any interesting tags on this element.
*/
getTags: function(dom_node, interesting_tags) {
var tag_list = dom_node.getElementsByTagName("tag");
var tags = {};
var interesting = false;
for (var j = 0; j < tag_list.length; j++) {
var key = tag_list[j].getAttribute("k");
tags[key] = tag_list[j].getAttribute("v");
if (interesting_tags) {
if (!this.interestingTagsExclude[key]) {
interesting = true;
}
}
}
return interesting_tags ? [tags, interesting] : tags;
},
/**
* Method: isWayArea
* Given a way object from getWays, check whether the tags and geometry
* indicate something is an area.
*
* Returns:
* {Boolean}
*/
isWayArea: function(way) {
var poly_shaped = false;
var poly_tags = false;
if (way.nodes[0] == way.nodes[way.nodes.length - 1]) {
poly_shaped = true;
}
if (this.checkTags) {
for(var key in way.tags) {
if (this.areaTags[key]) {
poly_tags = true;
break;
}
}
}
return poly_shaped && (this.checkTags ? poly_tags : true);
},
/**
* APIMethod: write
* Takes a list of features, returns a serialized OSM format file for use
* in tools like JOSM.
*
* Parameters:
* features - Array({<OpenLayers.Feature.Vector>})
*/
write: function(features) {
if (!(features instanceof Array)) {
features = [features];
}
this.osm_id = 1;
this.created_nodes = {};
var root_node = document.createElementNS(null, "osm");
root_node.setAttribute("version", "0.5");
root_node.setAttribute("generator", "OpenLayers "+ OpenLayers.VERSION_NUMBER);
// Loop backwards, because the deserializer puts nodes last, and
// we want them first if possible
for(var i = features.length - 1; i >= 0; i--) {
var nodes = this.createFeatureNodes(features[i]);
for (var j = 0; j < nodes.length; j++) {
root_node.appendChild(nodes[j]);
}
}
return OpenLayers.Format.XML.prototype.write.apply(this, [root_node]);
},
/**
* Method: createFeatureNodes
* Takes a feature, returns a list of nodes from size 0->n.
* Will include all pieces of the serialization that are required which
* have not already been created. Calls out to createXML based on geometry
* type.
*
* Parameters:
* feature - {<OpenLayers.Feature.Vector>}
*/
createFeatureNodes: function(feature) {
var nodes = [];
var className = feature.geometry.CLASS_NAME;
var type = className.substring(className.lastIndexOf(".") + 1)
type = type.toLowerCase();
var builder = this.createXML[type];
if (builder) {
nodes = builder.apply(this, [feature]);
}
return nodes;
},
/**
* Method: createXML
* Takes a feature, returns a list of nodes from size 0->n.
* Will include all pieces of the serialization that are required which
* have not already been created.
*
* Parameters:
* feature - {<OpenLayers.Feature.Vector>}
*/
createXML: {
'point': function(point) {
var id = null;
var geometry = point.geometry ? point.geometry : point;
var already_exists = false; // We don't return anything if the node
// has already been created
if (point.osm_id) {
id = point.osm_id;
if (this.created_nodes[id]) {
already_exists = true;
}
} else {
id = -this.osm_id;
this.osm_id++;
}
if (already_exists) {
node = this.created_nodes[id];
} else {
var node = this.createElementNS(null, "node");
}
this.created_nodes[id] = node;
node.setAttribute("id", id);
node.setAttribute("lon", geometry.x);
node.setAttribute("lat", geometry.y);
if (point.attributes) {
this.serializeTags(point, node);
}
this.setState(point, node);
return already_exists ? [] : [node];
},
linestring: function(feature) {
var nodes = [];
var geometry = feature.geometry;
if (feature.osm_id) {
id = feature.osm_id;
} else {
id = -this.osm_id;
this.osm_id++;
}
var way = this.createElementNS(null, "way");
way.setAttribute("id", id);
for (var i = 0; i < geometry.components.length; i++) {
var node = this.createXML['point'].apply(this, [geometry.components[i]]);
if (node.length) {
node = node[0];
var node_ref = node.getAttribute("id");
nodes.push(node);
} else {
node_ref = geometry.components[i].osm_id;
node = this.created_nodes[node_ref];
}
this.setState(feature, node);
var nd_dom = this.createElementNS(null, "nd");
nd_dom.setAttribute("ref", node_ref);
way.appendChild(nd_dom);
}
this.serializeTags(feature, way);
nodes.push(way);
return nodes;
},
polygon: function(feature) {
var attrs = OpenLayers.Util.extend({'area':'yes'}, feature.attributes);
var feat = new OpenLayers.Feature.Vector(feature.geometry.components[0], attrs);
feat.osm_id = feature.osm_id;
return this.createXML['linestring'].apply(this, [feat]);
}
},
/**
* Method: serializeTags
* Given a feature, serialize the attributes onto the given node.
*
* Parameters:
* feature - {<OpenLayers.Feature.Vector>}
* node - {DOMNode}
*/
serializeTags: function(feature, node) {
for (var key in feature.attributes) {
var tag = this.createElementNS(null, "tag");
tag.setAttribute("k", key);
tag.setAttribute("v", feature.attributes[key]);
node.appendChild(tag);
}
},
/**
* Method: setState
* OpenStreetMap has a convention that 'state' is stored for modification or deletion.
* This allows the file to be uploaded via JOSM or the bulk uploader tool.
*
* Parameters:
* feature - {<OpenLayers.Feature.Vector>}
* node - {DOMNode}
*/
setState: function(feature, node) {
if (feature.state) {
var state = null;
switch(feature.state) {
case OpenLayers.State.UPDATE:
state = "modify";
case OpenLayers.State.DELETE:
state = "delete";
}
if (state) {
node.setAttribute("action", state);
}
}
},
CLASS_NAME: "OpenLayers.Format.OSM"
});

View File

@@ -0,0 +1,99 @@
<html>
<head>
<script src="../../lib/OpenLayers.js"></script>
<script src="../data/osm.js"></script>
<script type="text/javascript">
function test_Format_OSM_constructor(t) {
t.plan(4);
var options = {'foo': 'bar'};
var format = new OpenLayers.Format.OSM(options);
t.ok(format instanceof OpenLayers.Format.OSM,
"new OpenLayers.Format.OSM returns object" );
t.eq(format.foo, "bar", "constructor sets options correctly");
t.eq(typeof format.read, "function", "format has a read function");
t.eq(typeof format.write, "function", "format has a write function");
}
function test_Format_OSM_node(t) {
t.plan(4);
var f = new OpenLayers.Format.OSM();
var features = f.read(osm_test_data['node']);
var feat = features[0];
t.eq(feat.attributes, {}, "attributes is empty");
t.eq(feat.osm_id, 200545, "internal osm_id property set correctly");
t.eq(feat.geometry.x, -1.8166417, "lon is correct");
t.eq(feat.geometry.y, 52.5503033, "lat is correct");
}
function test_Format_OSM_node_with_tags(t) {
t.plan(4);
var f = new OpenLayers.Format.OSM();
var features = f.read(osm_test_data['node_with_tags']);
var feat = features[0];
t.eq(feat.attributes, {'a':'b'}, "attributes match");
t.eq(feat.osm_id, 200545, "internal osm_id property set correctly");
t.eq(feat.geometry.x, -1.8166417, "lon is correct");
t.eq(feat.geometry.y, 52.5503033, "lat is correct");
}
function test_Format_OSM_way(t) {
t.plan(7);
var f = new OpenLayers.Format.OSM();
var features = f.read(osm_test_data['way']);
t.eq(features.length, 1, "One feature");
var feat = features[0];
t.eq(feat.osm_id, 4685537, "OSM ID set correctly.");
t.eq(feat.geometry.CLASS_NAME, "OpenLayers.Geometry.Polygon", "returned as polygon");
t.eq(feat.geometry.components[0].components.length, 11, "Correct number of components");
t.eq(feat.geometry.components[0].components[0].osm_id, 29783472, "OSM ID set on components");
t.eq(feat.geometry.toString(), "POLYGON((-1.8164007 52.5501836,-1.8170311 52.5506035,-1.8164092 52.5509559,-1.8169385 52.5513103,-1.8159626 52.5517893,-1.8145067 52.5518461,-1.8143197 52.5511883,-1.8141177 52.5506446,-1.8151451 52.5501275,-1.8157703 52.5505521,-1.8164007 52.5501836))", "WKT of feature is correct");
t.eq(feat.attributes.landuse, "school", "landuse attribute correct");
}
function test_Format_OSM_node_way(t) {
t.plan(5)
var f = new OpenLayers.Format.OSM();
var features = f.read(osm_test_data['node_way']);
t.eq(features.length, 1, "One feature");
var feat = features[0];
t.eq(feat.osm_id, 21329267, "OSM ID set correctly");
t.eq(feat.attributes.highway, "unclassified", "highway attribute is correct.");
t.eq(feat.geometry.CLASS_NAME, "OpenLayers.Geometry.LineString", "returned as linestring");
t.eq(feat.geometry.components.length, 12, "correct number of segments");
}
function test_Format_OSM_node_way_checkTags(t) {
t.plan(9)
var f = new OpenLayers.Format.OSM({'checkTags': true});
var features = f.read(osm_test_data['node_way']);
t.eq(features.length, 3, "multiple features");
var feat = features[1];
t.eq(feat.geometry.CLASS_NAME, "OpenLayers.Geometry.Point", "point class");
t.ok(feat.attributes != {}, "feature has attributes");
var feat = features[2];
t.eq(feat.geometry.CLASS_NAME, "OpenLayers.Geometry.Point", "point class");
t.ok(feat.attributes != {}, "feature has attributes");
feat = features[0];
t.eq(feat.osm_id, 21329267, "OSM ID set correctly");
t.eq(feat.attributes.highway, "unclassified", "highway attribute is correct.");
t.eq(feat.geometry.CLASS_NAME, "OpenLayers.Geometry.LineString", "returned as linestring");
t.eq(feat.geometry.components.length, 12, "correct number of segments");
}
function test_Format_OSM_serialize(t) {
t.plan(4);
var f = new OpenLayers.Format.OSM({'checkTags': true});
for (var key in osm_serialized_data) {
var input = f.read(osm_test_data[key]);
var output = f.write(input);
output = output.replace(/<\?[^>]*\?>/, '');
t.eq(output, osm_serialized_data[key], key + " serialized correctly");
}
}
</script>
</head>
<body>
</body>
</html>

13
tests/data/osm.js Normal file
View File

@@ -0,0 +1,13 @@
var osm_test_data = {
'node': '<?xml version="1.0" encoding="UTF-8"?><osm version="0.5" generator="OpenStreetMap server"> <node id="200545" lat="52.5503033" lon="-1.8166417" user="blackadder" visible="true" timestamp="2006-03-22T16:33:41+00:00"/></osm>',
'node_with_tags': '<?xml version="1.0" encoding="UTF-8"?><osm version="0.5" generator="OpenStreetMap server"> <node id="200545" lat="52.5503033" lon="-1.8166417" user="blackadder" visible="true" timestamp="2006-03-22T16:33:41+00:00"><tag k="a" v="b" /></node></osm>',
'way': '<?xml version="1.0" encoding="UTF-8"?><osm version="0.5" generator="OpenStreetMap server"> <node id="29783468" lat="52.5506446" lon="-1.8141177" user="blackadder" visible="true" timestamp="2007-05-30T14:22:33+01:00"> <tag k="created_by" v="JOSM"/> </node> <node id="29783470" lat="52.5501275" lon="-1.8151451" user="blackadder" visible="true" timestamp="2007-05-30T14:22:33+01:00"> <tag k="created_by" v="JOSM"/> </node> <node id="29783471" lat="52.5505521" lon="-1.8157703" user="blackadder" visible="true" timestamp="2007-12-18T15:33:59+00:00"> <tag k="created_by" v="JOSM"/> </node> <node id="29783472" lat="52.5501836" lon="-1.8164007" user="blackadder" visible="true" timestamp="2007-12-18T15:33:59+00:00"> <tag k="created_by" v="JOSM"/> </node> <node id="29783473" lat="52.5506035" lon="-1.8170311" user="blackadder" visible="true" timestamp="2007-05-30T14:21:32+01:00"> <tag k="created_by" v="JOSM"/> </node> <node id="29783474" lat="52.5509559" lon="-1.8164092" user="blackadder" visible="true" timestamp="2007-05-30T14:21:33+01:00"> <tag k="created_by" v="JOSM"/> </node> <node id="29783476" lat="52.5513103" lon="-1.8169385" user="blackadder" visible="true" timestamp="2007-05-30T14:21:33+01:00"> <tag k="created_by" v="JOSM"/> </node> <node id="29783477" lat="52.5517893" lon="-1.8159626" user="blackadder" visible="true" timestamp="2007-05-30T14:21:33+01:00"> <tag k="created_by" v="JOSM"/> </node> <node id="29783478" lat="52.5518461" lon="-1.8145067" user="blackadder" visible="true" timestamp="2007-05-30T14:21:33+01:00"> <tag k="created_by" v="JOSM"/> </node> <node id="29783479" lat="52.5511883" lon="-1.8143197" user="blackadder" visible="true" timestamp="2007-05-30T14:21:33+01:00"> <tag k="created_by" v="JOSM"/> </node> <way id="4685537" visible="true" timestamp="2007-05-30T14:21:35+01:00" user="blackadder"> <nd ref="29783472"/> <nd ref="29783473"/> <nd ref="29783474"/> <nd ref="29783476"/> <nd ref="29783477"/> <nd ref="29783478"/> <nd ref="29783479"/> <nd ref="29783468"/> <nd ref="29783470"/> <nd ref="29783471"/> <nd ref="29783472"/> <tag k="name" v="Maney Hill School"/> <tag k="created_by" v="JOSM"/> <tag k="landuse" v="school"/> <tag k="amenity" v="school"/> </way></osm>',
'node_way': '<?xml version="1.0" encoding="UTF-8"?><osm version="0.5" generator="OpenStreetMap server"> <node id="200565" lat="52.5526654" lon="-1.8146664" user="blackadder" visible="true" timestamp="2006-03-22T16:34:29+00:00"/> <node id="200571" lat="52.5535575" lon="-1.8148566" user="blackadder" visible="true" timestamp="2007-11-15T12:54:40+00:00"/> <node id="200572" lat="52.5522848" lon="-1.8145676" user="blackadder" visible="true" timestamp="2008-01-15T17:36:32+00:00"> <tag k="ref" v="0562901"/> <tag k="both_sides" v="true"/> <tag k="route_ref" v="167|757"/> <tag k="highway" v="bus_stop"/> <tag k="location" v="East View Road, Shooters Hill"/> </node> <node id="200573" lat="52.5520736" lon="-1.8145054" user="blackadder" visible="true" timestamp="2006-03-22T16:34:49+00:00"/> <node id="200751" lat="52.5511951" lon="-1.8142246" user="blackadder" visible="true" timestamp="2006-03-22T16:36:18+00:00"/> <node id="200752" lat="52.5505598" lon="-1.8140051" user="blackadder" visible="true" timestamp="2006-03-22T16:36:20+00:00"/> <node id="200753" lat="52.5496876" lon="-1.8136891" user="blackadder" visible="true" timestamp="2006-03-22T21:55:13+00:00"/> <node id="200754" lat="52.549009" lon="-1.8133906" user="blackadder" visible="true" timestamp="2006-03-22T16:36:24+00:00"/> <node id="200755" lat="52.5478879" lon="-1.8128287" user="blackadder" visible="true" timestamp="2006-03-22T16:36:26+00:00"/> <node id="200759" lat="52.5464722" lon="-1.8119684" user="blackadder" visible="true" timestamp="2006-03-22T16:36:34+00:00"/> <node id="200771" lat="52.5466788" lon="-1.8121387" user="blackadder" visible="true" timestamp="2008-01-15T16:56:49+00:00"/> <node id="645730" lat="52.5491787" lon="-1.8134657" user="blackadder" visible="true" timestamp="2008-01-15T17:36:32+00:00"> <tag k="created_by" v="JOSM"/> <tag k="ref" v="0562201"/> <tag k="both_sides" v="true"/> <tag k="route_ref" v="167|757"/> <tag k="highway" v="bus_stop"/> <tag k="location" v="East View Road, Recretaion Ground"/> <tag k="amenity" v="bus_stop"/> </node> <way id="21329267" visible="true" timestamp="2008-01-15T16:24:55+00:00" user="blackadder"> <nd ref="200571"/> <nd ref="200565"/> <nd ref="200572"/> <nd ref="200573"/> <nd ref="200751"/> <nd ref="200752"/> <nd ref="200753"/> <nd ref="645730"/> <nd ref="200754"/> <nd ref="200755"/> <nd ref="200771"/> <nd ref="200759"/> <tag k="name" v="East View Road"/> <tag k="postal_code" v="B72"/> <tag k="place_name" v="Sutton Coldfield"/> <tag k="created_by" v="JOSM"/> <tag k="highway" v="unclassified"/> </way></osm>' }
var osm_serialized_data = {
'node':'<osm version="0.5" generator="OpenLayers '+OpenLayers.VERSION_NUMBER+'"><node id="200545" lon="-1.8166417" lat="52.5503033"/></osm>',
'node_with_tags':'<osm version="0.5" generator="OpenLayers '+OpenLayers.VERSION_NUMBER+'"><node id="200545" lon="-1.8166417" lat="52.5503033"><tag k="a" v="b"/></node></osm>',
'way':'<osm version="0.5" generator="OpenLayers '+OpenLayers.VERSION_NUMBER+'"><node id="29783472" lon="-1.8164007" lat="52.5501836"/><node id="29783473" lon="-1.8170311" lat="52.5506035"/><node id="29783474" lon="-1.8164092" lat="52.5509559"/><node id="29783476" lon="-1.8169385" lat="52.5513103"/><node id="29783477" lon="-1.8159626" lat="52.5517893"/><node id="29783478" lon="-1.8145067" lat="52.5518461"/><node id="29783479" lon="-1.8143197" lat="52.5511883"/><node id="29783468" lon="-1.8141177" lat="52.5506446"/><node id="29783470" lon="-1.8151451" lat="52.5501275"/><node id="29783471" lon="-1.8157703" lat="52.5505521"/><way id="4685537"><nd ref="29783472"/><nd ref="29783473"/><nd ref="29783474"/><nd ref="29783476"/><nd ref="29783477"/><nd ref="29783478"/><nd ref="29783479"/><nd ref="29783468"/><nd ref="29783470"/><nd ref="29783471"/><nd ref="29783472"/><tag k="area" v="yes"/><tag k="name" v="Maney Hill School"/><tag k="created_by" v="JOSM"/><tag k="landuse" v="school"/><tag k="amenity" v="school"/></way></osm>',
'node_way':'<osm version="0.5" generator="OpenLayers '+OpenLayers.VERSION_NUMBER+'"><node id="645730" lon="-1.8134657" lat="52.5491787"><tag k="created_by" v="JOSM"/><tag k="ref" v="0562201"/><tag k="both_sides" v="true"/><tag k="route_ref" v="167|757"/><tag k="highway" v="bus_stop"/><tag k="location" v="East View Road, Recretaion Ground"/><tag k="amenity" v="bus_stop"/></node><node id="200572" lon="-1.8145676" lat="52.5522848"><tag k="ref" v="0562901"/><tag k="both_sides" v="true"/><tag k="route_ref" v="167|757"/><tag k="highway" v="bus_stop"/><tag k="location" v="East View Road, Shooters Hill"/></node><node id="200571" lon="-1.8148566" lat="52.5535575"/><node id="200565" lon="-1.8146664" lat="52.5526654"/><node id="200573" lon="-1.8145054" lat="52.5520736"/><node id="200751" lon="-1.8142246" lat="52.5511951"/><node id="200752" lon="-1.8140051" lat="52.5505598"/><node id="200753" lon="-1.8136891" lat="52.5496876"/><node id="200754" lon="-1.8133906" lat="52.549009"/><node id="200755" lon="-1.8128287" lat="52.5478879"/><node id="200771" lon="-1.8121387" lat="52.5466788"/><node id="200759" lon="-1.8119684" lat="52.5464722"/><way id="21329267"><nd ref="200571"/><nd ref="200565"/><nd ref="200572"/><nd ref="200573"/><nd ref="200751"/><nd ref="200752"/><nd ref="200753"/><nd ref="645730"/><nd ref="200754"/><nd ref="200755"/><nd ref="200771"/><nd ref="200759"/><tag k="name" v="East View Road"/><tag k="postal_code" v="B72"/><tag k="place_name" v="Sutton Coldfield"/><tag k="created_by" v="JOSM"/><tag k="highway" v="unclassified"/></way></osm>'
}

View File

@@ -25,6 +25,7 @@
<li>Format/test_GeoRSS.html</li>
<li>Format/test_GML.html</li>
<li>Format/test_JSON.html</li>
<li>Format/test_OSM.html</li>
<li>Format/test_KML.html</li>
<li>Format/test_SLD.html</li>
<li>Format/test_WKT.html</li>