Merge branch 'refactor'
authorRichard Fairhurst <richard@systemeD.net>
Fri, 17 Jun 2011 17:36:52 +0000 (18:36 +0100)
committerRichard Fairhurst <richard@systemeD.net>
Fri, 17 Jun 2011 17:36:52 +0000 (18:36 +0100)
18 files changed:
REFACTOR.txt [deleted file]
net/systemeD/halcyon/connection/XMLBaseConnection.as
net/systemeD/halcyon/connection/XMLConnection.as
net/systemeD/potlatch2/find/FindDialog.mxml
net/systemeD/potlatch2/mapfeatures/Feature.as
net/systemeD/potlatch2/mapfeatures/MapFeatures.as
net/systemeD/potlatch2/mapfeatures/editors/RouteIcon.mxml
net/systemeD/potlatch2/mapfeatures/editors/TurnRestrictionIcon.mxml
resources/features/pois/transport_car_wash.n.24.png [new file with mode: 0644]
resources/icons/accommodation_blank.png [deleted file]
resources/icons/shopping_garden_centre.n.16.png
resources/icons/transport_car_wash.n.16.png [new file with mode: 0644]
resources/imagery.xml
resources/map_features/buildings.xml
resources/map_features/tourism.xml
resources/map_features/transport.xml
resources/stylesheets/core_pois.css
version.as.template

diff --git a/REFACTOR.txt b/REFACTOR.txt
deleted file mode 100644 (file)
index 7ec9173..0000000
+++ /dev/null
@@ -1,21 +0,0 @@
-== Potlatch 2 refactoring ==
-
-Aims:
-- to enable multiple Maps to be shown on-screen (e.g. for junction editor)
-- to bring Connection and VectorLayer code together
-
-== Changes overall ==
-
-Map.as becomes a collection of MapPaint objects, all with the same lat/long/scale
-(plus a backdrop sprite and a background imagery sprite)
-
-Map.editableLayer returns a reference to the single MapPaint object where isBackground is false
-
-MapPaint.as gains a reference to a Connection - i.e. the source data for this layer
-
-== Code tidying ==
-
-There are lots more of these throughout the code, marked with fixmes of the form '>>>> REFACTOR'
-
-- remove all back-references to Map except where necessary for lat/long/scale
-- getParam is messy - stuff sent via flashvars needs somewhere to live: currently in Globals which is ugly
index d2e5164ea0601f221f28d930abc4d8428af4e8dd..c94a8572b2533e01f1544551babdd4fa52b190f7 100644 (file)
 package net.systemeD.halcyon.connection {
 
-    import flash.events.*;
+       import flash.events.*;
 
        import flash.system.Security;
        import flash.net.*;
-    import org.iotashan.oauth.*;
+       import org.iotashan.oauth.*;
 
-    /**
-    * XMLBaseConnection is the common code between connecting to an OSM server
-    * (i.e. XMLConnection) and connecting to a standalone .osm file (i.e. OSMConnection)
-    * and so mainly concerns itself with /map -call-ish related matters
-    */
+       import net.systemeD.halcyon.MapEvent;
+
+       /**
+       * XMLBaseConnection is the common code between connecting to an OSM server
+       * (i.e. XMLConnection) and connecting to a standalone .osm file (i.e. OSMConnection)
+       * and so mainly concerns itself with /map -call-ish related matters
+       */
        public class XMLBaseConnection extends Connection {
 
                public function XMLBaseConnection(name:String,api:String,policy:String,initparams:Object) {
                        super(name,api,policy,initparams);
                }
                
-        protected function loadedMap(event:Event):void {
-            var map:XML = new XML(URLLoader(event.target).data);
-            var id:Number;
-            var version:uint;
-            var uid:Number;
-            var timestamp:String;
-            var tags:Object;
-            var node:Node, newNode:Node;
-            var unusedNodes:Object={};
-                       var createdEntities:Array=[];
+               protected function loadedMap(event:Event):void {
+                       var map:XML = new XML(URLLoader(event.target).data);
+                       
+                       if (map.localName=="osmError") {
+                               dispatchEvent(new MapEvent(MapEvent.ERROR, { message: "Couldn't load the map: " + map.message } ));
+                       } else {
+                               var id:Number;
+                               var version:uint;
+                               var uid:Number;
+                               var timestamp:String;
+                               var tags:Object;
+                               var node:Node, newNode:Node;
+                               var unusedNodes:Object={};
+                               var createdEntities:Array=[];
 
-                       var minlon:Number, maxlon:Number, minlat:Number, maxlat:Number;
-                       var singleEntityRequest:Boolean=true;
-                       if (map.bounds.@minlon.length()) {
-                               minlon=map.bounds.@minlon;
-                               maxlon=map.bounds.@maxlon;
-                               minlat=map.bounds.@minlat;
-                               maxlat=map.bounds.@maxlat;
-                               singleEntityRequest=false;
-                       }
+                               var minlon:Number, maxlon:Number, minlat:Number, maxlat:Number;
+                               var singleEntityRequest:Boolean=true;
+                               if (map.bounds.@minlon.length()) {
+                                       minlon=map.bounds.@minlon;
+                                       maxlon=map.bounds.@maxlon;
+                                       minlat=map.bounds.@minlat;
+                                       maxlat=map.bounds.@maxlat;
+                                       singleEntityRequest=false;
+                               }
 
-            for each(var relData:XML in map.relation) {
-                id = Number(relData.@id);
-                version = uint(relData.@version);
-                uid = Number(relData.@uid);
-                timestamp = relData.@timestamp;
-                
-                var rel:Relation = getRelation(id);
-                if ( rel == null || !rel.loaded ) {
-                    tags = parseTags(relData.tag);
-                    var members:Array = [];
-                    for each(var memberXML:XML in relData.member) {
-                        var type:String = memberXML.@type.toLowerCase();
-                        var role:String = memberXML.@role;
-                        var memberID:Number = Number(memberXML.@ref);
-                        var member:Entity = null;
-                        if ( type == "node" ) {
-                            member = getNode(memberID);
-                            if ( member == null ) {
-                                member = new Node(this,memberID,0,{},false,0,0);
-                                setNode(Node(member),true);
-                            } else if (member.isDeleted()) {
-                                member.setDeletedState(false);
-                            }
-                        } else if ( type == "way" ) {
-                            member = getWay(memberID);
-                            if (member == null) {
-                                member = new Way(this,memberID,0,{},false,[]);
-                                setWay(Way(member),true);
-                            }
-                        } else if ( type == "relation" ) {
-                            member = getRelation(memberID);
-                            if (member == null) {
-                                member = new Relation(this,memberID,0,{},false,[]);
-                                setRelation(Relation(member),true);
-                            }
-                        }
-                        
-                        if ( member != null )
-                            members.push(new RelationMember(member, role));
-                    }
-                    
-                    if ( rel == null ) {
-                        rel=new Relation(this, id, version, tags, true, members, uid, timestamp);
-                        setRelation(rel, false);
-                        createdEntities.push(rel);
-                    } else {
-                        rel.update(version, tags, true, false, members, uid, timestamp);
-                        sendEvent(new EntityEvent(NEW_RELATION, rel), false);
-                    }
-                }
-            }
+                               for each(var relData:XML in map.relation) {
+                                       id = Number(relData.@id);
+                                       version = uint(relData.@version);
+                                       uid = Number(relData.@uid);
+                                       timestamp = relData.@timestamp;
+                          
+                                       var rel:Relation = getRelation(id);
+                                       if ( rel == null || !rel.loaded || singleEntityRequest ) {
+                                               tags = parseTags(relData.tag);
+                                               var members:Array = [];
+                                               for each(var memberXML:XML in relData.member) {
+                                                       var type:String = memberXML.@type.toLowerCase();
+                                                       var role:String = memberXML.@role;
+                                                       var memberID:Number = Number(memberXML.@ref);
+                                                       var member:Entity = null;
+                                                       if ( type == "node" ) {
+                                                               member = getNode(memberID);
+                                                               if ( member == null ) {
+                                                                       member = new Node(this,memberID,0,{},false,0,0);
+                                                                       setNode(Node(member),true);
+                                                               } else if (member.isDeleted()) {
+                                                                       member.setDeletedState(false);
+                                                               }
+                                                       } else if ( type == "way" ) {
+                                                               member = getWay(memberID);
+                                                               if (member == null) {
+                                                                       member = new Way(this,memberID,0,{},false,[]);
+                                                                       setWay(Way(member),true);
+                                                               }
+                                                       } else if ( type == "relation" ) {
+                                                               member = getRelation(memberID);
+                                                               if (member == null) {
+                                                                       member = new Relation(this,memberID,0,{},false,[]);
+                                                                       setRelation(Relation(member),true);
+                                                               }
+                                                       }
+                                               
+                                                       if ( member != null )
+                                                               members.push(new RelationMember(member, role));
+                                               }
+                                       
+                                               if ( rel == null ) {
+                                                       rel=new Relation(this, id, version, tags, true, members, uid, timestamp);
+                                                       setRelation(rel, false);
+                                                       createdEntities.push(rel);
+                                               } else {
+                                                       rel.update(version, tags, true, false, members, uid, timestamp);
+                                                       sendEvent(new EntityEvent(NEW_RELATION, rel), false);
+                                               }
+                                       }
+                               }
 
-            for each(var nodeData:XML in map.node) {
-                               id = Number(nodeData.@id);
-                               node = getNode(id);
-                               newNode = new Node(this,
-                                                  id, 
-                                                  uint(nodeData.@version), 
-                                                  parseTags(nodeData.tag),
-                                                  true, 
-                                                  Number(nodeData.@lat),
-                                                  Number(nodeData.@lon),
-                                                  Number(nodeData.@uid),
-                                                  nodeData.@timestamp);
+                               for each(var nodeData:XML in map.node) {
+                                       id = Number(nodeData.@id);
+                                       node = getNode(id);
+                                       newNode = new Node(this,
+                                                                          id, 
+                                                                          uint(nodeData.@version), 
+                                                                          parseTags(nodeData.tag),
+                                                                          true, 
+                                                                          Number(nodeData.@lat),
+                                                                          Number(nodeData.@lon),
+                                                                          Number(nodeData.@uid),
+                                                                          nodeData.@timestamp);
                                
-                               if ( singleEntityRequest ) {
-                                       // it's a revert request, so create/update the node
-                                       setOrUpdateNode(newNode, true);
-                               } else if ( node == null || !node.loaded) {
-                                       // the node didn't exist before, so create/update it
-                                       newNode.parentsLoaded=newNode.within(minlon,maxlon,minlat,maxlat);
-                                       setOrUpdateNode(newNode, true);
-                                       createdEntities.push(newNode);
-                               } else {
-                                       // the node's already in memory, but store it in case one of the new ways needs it
-                                       if (newNode.within(minlon,maxlon,minlat,maxlat)) newNode.parentsLoaded=true;
-                                       unusedNodes[id]=newNode;
+                                       if ( singleEntityRequest ) {
+                                               // it's a revert request, so create/update the node
+                                               setOrUpdateNode(newNode, true);
+                                       } else if ( node == null || !node.loaded) {
+                                               // the node didn't exist before, so create/update it
+                                               newNode.parentsLoaded=newNode.within(minlon,maxlon,minlat,maxlat);
+                                               setOrUpdateNode(newNode, true);
+                                               createdEntities.push(newNode);
+                                       } else {
+                                               // the node's already in memory, but store it in case one of the new ways needs it
+                                               if (newNode.within(minlon,maxlon,minlat,maxlat)) newNode.parentsLoaded=true;
+                                               unusedNodes[id]=newNode;
+                                       }
                                }
-                       }
-            
-            for each(var data:XML in map.way) {
-                id = Number(data.@id);
-                version = uint(data.@version);
-                uid = Number(data.@uid);
-                timestamp = data.@timestamp;
+                       
+                               for each(var data:XML in map.way) {
+                                       id = Number(data.@id);
+                                       version = uint(data.@version);
+                                       uid = Number(data.@uid);
+                                       timestamp = data.@timestamp;
 
-                var way:Way = getWay(id);
-                if ( way == null || !way.loaded || singleEntityRequest) {
-                    var nodelist:Array = [];
-                    for each(var nd:XML in data.nd) {
-                                               var nodeid:Number=Number(nd.@ref)
-                                               if (getNode(nodeid).isDeleted() && unusedNodes[nodeid]) { 
-                                                       setOrUpdateNode(unusedNodes[nodeid], true); 
+                                       var way:Way = getWay(id);
+                                       if ( way == null || !way.loaded || singleEntityRequest) {
+                                               var nodelist:Array = [];
+                                               for each(var nd:XML in data.nd) {
+                                                       var nodeid:Number=Number(nd.@ref)
+                                                       if (getNode(nodeid).isDeleted() && unusedNodes[nodeid]) { 
+                                                               setOrUpdateNode(unusedNodes[nodeid], true); 
+                                                       }
+                                                       nodelist.push(getNode(nodeid));
+                                               }
+                                               tags = parseTags(data.tag);
+                                               if ( way == null ) {
+                                                       way=new Way(this, id, version, tags, true, nodelist, uid, timestamp)
+                                                       setWay(way,false);
+                                                       createdEntities.push(way);
+                                               } else {
+                                                       waycount++;
+                                                       way.update(version, tags, true, true, nodelist, uid, timestamp);
+                                                       sendEvent(new EntityEvent(NEW_WAY, way), false);
                                                }
-                        nodelist.push(getNode(nodeid));
                                        }
-                    tags = parseTags(data.tag);
-                    if ( way == null ) {
-                        way=new Way(this, id, version, tags, true, nodelist, uid, timestamp)
-                        setWay(way,false);
-                        createdEntities.push(way);
-                    } else {
-                                               waycount++;
-                        way.update(version, tags, true, true, nodelist, uid, timestamp);
-                        sendEvent(new EntityEvent(NEW_WAY, way), false);
-                    }
-                }
-            }
-            
-            markBboxLoaded(minlon,maxlon,maxlat,minlat);
-            registerPOINodes();
-            dispatchEvent(new Event(LOAD_COMPLETED));
+                               }
+                       
+                               markBboxLoaded(minlon,maxlon,maxlat,minlat);
+                               registerPOINodes();
+                       }
 
-            if (statusFetcher) statusFetcher.fetch(createdEntities); 
-        }
-        
-        protected function registerPOINodes():void {
-            for each (var nodeID:Number in getAllNodeIDs()) {
-                var node:Node = getNode(nodeID);
-                if (!node.hasParentWays)
-                    registerPOI(node);
-            }
-        }
+                       dispatchEvent(new Event(LOAD_COMPLETED));
 
-        private function parseTags(tagElements:XMLList):Object {
-            var tags:Object = {};
-            for each (var tagEl:XML in tagElements)
-                tags[tagEl.@k] = tagEl.@v;
-            return tags;
-        }
+                       if (statusFetcher) statusFetcher.fetch(createdEntities); 
+               }
+               
+               protected function registerPOINodes():void {
+                       for each (var nodeID:Number in getAllNodeIDs()) {
+                               var node:Node = getNode(nodeID);
+                               if (!node.hasParentWays)
+                                       registerPOI(node);
+                       }
+               }
+
+               private function parseTags(tagElements:XMLList):Object {
+                       var tags:Object = {};
+                       for each (var tagEl:XML in tagElements)
+                               tags[tagEl.@k] = tagEl.@v;
+                       return tags;
+               }
 
        }
 }
index d87d87eed958aa92705f8eb76bdf2e650be1cb48..3a4c5ef3bfaedb745ebfa39d1dd1d5f672b1db03 100644 (file)
@@ -56,6 +56,7 @@ package net.systemeD.halcyon.connection {
                        mapLoader.addEventListener(Event.COMPLETE, loadedMap);
                        mapLoader.addEventListener(IOErrorEvent.IO_ERROR, errorOnMapLoad);
                        mapLoader.addEventListener(HTTPStatusEvent.HTTP_STATUS, mapLoadStatus);
+            request.requestHeaders.push(new URLRequestHeader("X-Error-Format", "XML"));
                        mapLoader.load(request);
                        dispatchEvent(new Event(LOAD_STARTED));
                }
index e54cc1cabacc811f928ba09c91a819bb3b8a8d18..a64c90e73692ae0a8ac0f6fd7f08254f14a42d52 100644 (file)
@@ -85,7 +85,7 @@
        </mx:Script>
 
        <mx:HBox horizontalAlign="left" width="100%">
-               <mx:Label text="Search for: " />
+               <mx:Label text="Enter place name: " />
                <mx:TextInput id="txtFind" width="100%" enter="txtFind_enterHandler(event)"/>
                <mx:Button label="Search" id="btnFind" click="btnFind_clickHandler(event)"/>            
        </mx:HBox>
index 007c87e0fd2a4095b382ecde2010c3c84e13288a..beb69ffaa88fc46e423109fa376a1cd93d4463d7 100644 (file)
@@ -81,7 +81,6 @@ package net.systemeD.potlatch2.mapfeatures {
             var inputType:String = inputXML.@type;
             var presenceStr:String = inputXML.@presence;
             var sortOrderStr:String = inputXML.@priority;
-//          _tags.push( { k:String(inputXML.@key) } ); /* add the key to tags so that e.g. addr:housenumber shows up on autocomplete */
             var editor:EditorFactory = EditorFactory.createFactory(inputType, inputXML);
             if ( editor != null ) {
                 editor.presence = Presence.getPresence(presenceStr);
index e7ce89592f70d4a0932213c35555328351c9eb90..605d0a854095a2e30163f0254b03f387a201ada1 100644 (file)
@@ -59,6 +59,10 @@ package net.systemeD.potlatch2.mapfeatures {
                     if (f.isType('relation'))                 { addToTagList('relation',tag); }
                     if (f.isType('point'))                    { addToTagList('node',tag); }
                 }
+
+                for each (var inputSet:XML in feature..inputSet) {
+                    tagsFromInputSet(definition.inputSet.(@id == String(inputSet.@ref)), f);
+                }
             }
 
             _categories = new Array();
@@ -69,6 +73,28 @@ package net.systemeD.potlatch2.mapfeatures {
             dispatchEvent(new Event("featuresLoaded"));
         }
 
+        private function tagsFromInputSet(inputSet:XMLList, f:Feature):void {
+            for each (var input:XML in inputSet.input) {
+                // Take all the k/v pairs from inputs that have choice
+                for each (var choice:XML in input..choice ) {
+                    if (f.isType('line') || f.isType('area')) { addToTagList('way', {k:String(input.@key), v:String(choice.@value)}); }
+                    if (f.isType('relation'))                 { addToTagList('relation',{k:String(input.@key), v:String(choice.@value)}); }
+                    if (f.isType('point'))                    { addToTagList('node',{k:String(input.@key), v:String(choice.@value)}); }
+                }
+
+                if (input.@type == 'freetext') {
+                    if (f.isType('line') || f.isType('area')) { addToTagList('way', {k:String(input.@key), v:''}); }
+                    if (f.isType('relation'))                 { addToTagList('relation',{k:String(input.@key), v:''}); }
+                    if (f.isType('point'))                    { addToTagList('node',{k:String(input.@key), v:''}); }
+                }
+            }
+
+            // inputSets can have their own inputSets, so recurse
+            for each (var i:XML in inputSet.inputSet) {
+                tagsFromInputSet(definition.inputSet.(@id == String(i.@ref)), f);
+            }
+        }
+
         /** Add one item to tagList index, which will end up being a list like: ["way"]["highway"]["residential"] */
                private function addToTagList(type:String,tag:Object):void {
                        if (tag.v=='*') { return; }
index 6eca2c7f760353ff4ea2a25bc79da970000f80d2..7ab0003d6388c279d5d4aab1d903a0e5d19ddde3 100644 (file)
     
     private function setRole(role:String):void {
         var member:RelationMember = new RelationMember(_route["entity"], role);
-        _route["relation"].setMember(_route["index"], member);
+        Relation(_route["relation"]).setMember(_route["index"], member, MainUndoStack.getGlobalStack().addAction);
     }
 
        private function removeFromRelation():void {
-               _route["relation"].removeMember(_route["entity"], MainUndoStack.getGlobalStack().addAction);
+               Relation(_route["relation"]).removeMember(_route["entity"], MainUndoStack.getGlobalStack().addAction);
        }
     
     ]]></mx:Script>
index f7cebe687d4e854192ae37ebc836847c98e3bdde..11465a4a692b104c97e05497ccf64a7301eed413 100644 (file)
                // now add new entity
                rel.appendMember(new RelationMember(entity,role), undo.push);
 
-        undo.doAction();
+        MainUndoStack.getGlobalStack().addAction(undo);
 
                if (show.label=='Hide') { setHighlights(true); }
        }
diff --git a/resources/features/pois/transport_car_wash.n.24.png b/resources/features/pois/transport_car_wash.n.24.png
new file mode 100644 (file)
index 0000000..1c173e2
Binary files /dev/null and b/resources/features/pois/transport_car_wash.n.24.png differ
diff --git a/resources/icons/accommodation_blank.png b/resources/icons/accommodation_blank.png
deleted file mode 100644 (file)
index d12f23e..0000000
Binary files a/resources/icons/accommodation_blank.png and /dev/null differ
index 37d2ecc8eedc01cb8a974b38a1e5b517992e8e7e..7af4465d013aaec97bc22a6b9e45995bd292f4ac 100644 (file)
Binary files a/resources/icons/shopping_garden_centre.n.16.png and b/resources/icons/shopping_garden_centre.n.16.png differ
diff --git a/resources/icons/transport_car_wash.n.16.png b/resources/icons/transport_car_wash.n.16.png
new file mode 100644 (file)
index 0000000..07acd4e
Binary files /dev/null and b/resources/icons/transport_car_wash.n.16.png differ
index fc514196e922a003926938394ef3c798384e7a9f..eaf416acb6b76664e7e12977a89fe1e1614e3a66 100644 (file)
        <set minlat="49.8" minlon="-9" maxlat="61.1" maxlon="1.9">
                <name>OS OpenData Streetview</name>
                <url>http://os.openstreetmap.org/sv/$z/$x/$y.png</url>
-               <sourcetag>OS OpenData StreetView</sourcetag>
+               <sourcetag>OS_OpenData_StreetView</sourcetag>
        </set>
        <set minlat="49.8" minlon="-9" maxlat="61.1" maxlon="1.9">
                <name>OS OpenData Locator</name>
                <url>http://tiles.itoworld.com/os_locator/$z/$x/$y.png</url>
-               <sourcetag>OS OpenData Locator</sourcetag>
+               <sourcetag>OS_OpenData_Locator</sourcetag>
                <sourcekey>source:name</sourcekey>
        </set>
        <set minlat="49.8" minlon="-9" maxlat="61.1" maxlon="1.9">
                <url>http://hypercube.telascience.org/tiles/1.0.0/haiti-city/$z/$x/$y.jpg</url>
                <sourcetag>Haiti streetnames</sourcetag>
        </set>
-
+       <set minlat="24.2" minlon="-125.8" maxlat="49.5" maxlon="-62.3">
+               <name>National Agriculture Imagery Program</name>
+               <url>http://cube.telascience.org/tilecache/tilecache.py/1.0.0/NAIP_ALL/$z/$x/$y.png</url>
+               <sourcetag>NAIP</sourcetag>
+       </set>
+       <set minlat="55.3" minlon="-168.5" maxlat="71.5" maxlon="-140">
+               <name>National Agriculture Imagery Program</name>
+               <url>http://cube.telascience.org/tilecache/tilecache.py/1.0.0/NAIP_ALL/$z/$x/$y.png</url>
+               <sourcetag>NAIP</sourcetag>
+       </set>
     <set minlat="54.44" minlon="7.81" maxlat="57.86" maxlon="15.49">
         <name>Denmark - Fugro Aerial Imagery</name>
         <url>http://fugro.findvej.dk/fugro2005/$z/$x/$y.jpg</url>
index dc6dc3c255b7d7680c2eabb6e25729c3a8d57c81..d05720c587674d92bc7087c13d960588fd4a2cdb 100644 (file)
       ${addr:housenumber} ${addr:street} ${addr:postcode}\r
     </icon>\r
 \r
-    <area/>\r
+    <area/>
+    <point/>\r
     <!-- This should catch all the "building=*" tags in use: yes, hut, house, residential, entrance, apartments, garage, industrial,  garages, service, manufacture, collapsed... \r
          Is this possible? -->\r
     <!-- <tag k="building" v="*"/> -->\r
index 826a52e6cc00c39ae280de7545b891820edad148..e807e186ed1ea47af6f22ac5c080dc0272f74ce6 100644 (file)
   </feature>\r
 \r
 \r
-  <feature name="Ruin">\r
+  <feature name="Ruins">\r
     <category>tourism</category>\r
     <point/>\r
     <area/>\r
     <inputSet ref="simpleName"/>\r
     <icon image="features/pois/tourist_ruin.n.24.png"/>\r
-    <tag k="historic" v="ruin"/>\r
+    <tag k="historic" v="ruins"/>\r
     <inputSet ref="common"/>\r
   </feature>\r
 \r
     <tag k="tourism" v="theme_park"/>\r
     <inputSet ref="common"/>\r
   </feature>\r
-</featureGroup>
\ No newline at end of file
+</featureGroup>\r
index a039e0ad8d9732e2f10c9085dd0fef09f3715100..7c0bad00b0d6e2f7f8cd14ae1447a75813923839 100644 (file)
         <inputSet ref="common"/>
       </feature>
     
+  <feature name="Car Wash">
+    <category>transport</category>
+    <icon image="features/pois/transport_car_wash.n.24.png">
+      ${name}
+    </icon>
+    <help>http://wiki.openstreetmap.org/wiki/Tag:amenity%3Dcar_wash</help>
+    <point/>
+    <area/>
+    <tag k="amenity" v="car_wash"/>
+    <inputSet ref="names"/>
+    <input type="freetext" presence="onTagMatch" category="Naming" name="Operator" key="operator" description="The company/organisation that runs the car wash" priority="low"/>
+    <input type="freetext" presence="onTagMatch" category="Operation" name="Opening hours" key="opening_hours" priority="normal"/>
+    <input type="choice" presence="onTagMatch" category="Operation" name="Self service" key="self_service" priority="low">
+       <choice value="yes" text="Yes" />
+       <choice value="no" text="No" />
+    </input>
+    <input type="choice" presence="onTagMatch" category="Operation" name="Automated" key="automated" priority="low">
+       <choice value="yes" text="Yes" />
+       <choice value="no" text="No" />
+    </input>
+    
+    <inputSet ref="common"/>
+  </feature>
     
       <feature name="Bus station">
         <category>transport</category>
index 158096d622c901f154ba50903c100fa7519fa286..62d804088ac01fd3d274761157456cd3033a8ea7 100644 (file)
@@ -62,7 +62,7 @@ node[historic=memorial] { icon-image: icons/tourist_memorial.n.16.png; text-offs
 node[historic=monument] { icon-image: icons/tourist_monument.n.16.png; text-offset:15; text: name; z-index: 20; }
 node[tourism=museum] { icon-image: icons/tourist_museum.n.16.png; text-offset:15; text: name; z-index: 20; }
 node[tourism=picnic_site] { icon-image: icons/tourist_picnic.n.16.png; z-index: 20; }
-node[historic=ruin] { icon-image: icons/tourist_ruin.n.16.png; z-index: 20; }
+node[historic=ruins] { icon-image: icons/tourist_ruin.n.16.png; z-index: 20; }
 node[amenity=theatre] { icon-image: icons/tourist_theatre.n.16.png; z-index: 20; }
 node[tourism=viewpoint] { icon-image: icons/tourist_view_point.n.16.png; z-index: 20; }
 node[tourism=zoo] { icon-image: icons/tourist_zoo.n.16.png; z-index: 20; }
@@ -70,6 +70,7 @@ node[aeroway=aerodrome] { icon-image: icons/transport_aerodrome.n.16.png; z-inde
 node[amenity=bus_station] { icon-image: icons/transport_bus_station.n.16.png; z-index: 20; }
 node[highway=bus_stop] { icon-image: icons/transport_bus_stop2.n.16.png; z-index: 20; }
 node[amenity=fuel] { icon-image: icons/transport_fuel.n.16.png; z-index: 20; }
+node[amenity=car_wash] { icon-image: icons/transport_car_wash.n.16.png; z-index: 20; }
 node[amenity=bicycle_parking] { icon-image: icons/transport_parking_bicycle.n.16.png; text-offset: 15; text: capacity; z-index: 20; }
 node[amenity=parking] { icon-image: icons/transport_parking_car.n.16.png; z-index: 20; }
 node[amenity=ferry_terminal] { icon-image: icons/transport_port.n.16.png; z-index: 20; }
index 9288362868aea30333261613baa71a05c74d5ab7..c58ef7f018b88a8aff0e306b7396207a55221ef2 100644 (file)
@@ -3,5 +3,5 @@
 // at some point in the future.
 
 public var build_number:String="@@@buildnumber@@@";
-public var version:String="2.0-MQ";
+public var version:String="2.1";