diff --git a/ARCHITECTURE.md b/ARCHITECTURE.md
new file mode 100644
index 000000000..c0ff6b217
--- /dev/null
+++ b/ARCHITECTURE.md
@@ -0,0 +1,203 @@
+## d3
+
+[d3](http://d3js.org/) is the primary library used by iD. It is used for
+rendering the map data as well as many sorts of general DOM manipulation tasks
+for which jQuery would often be used.
+
+Notable features of d3 that are used by iD include
+[d3.xhr](https://github.com/mbostock/d3/wiki/Requests#wiki-d3_xhr), which is
+used to make the API requests to download data from openstreetmap.org and save
+changes;
+[d3.dispatch](https://github.com/mbostock/d3/wiki/Internals#wiki-d3_dispatch),
+which provides a callback-based [Observer
+pattern](http://en.wikipedia.org/wiki/Observer_pattern) between different
+parts of iD;
+[d3.geo.path](https://github.com/mbostock/d3/wiki/Geo-Paths#wiki-path), which
+generates SVG paths for lines and areas; and
+[d3.behavior.zoom](https://github.com/mbostock/d3/wiki/Zoom-Behavior#wiki-zoom),
+which implements map panning and zooming.
+
+## Core
+
+The iD *core* implements the OSM data types, a graph of OSM object's
+relationships to each other, and an undo/redo history for changes made during
+editing. It aims to be generic enough to be used by other JavaScript-based
+tools for OpenStreetMap.
+
+Briefly, the OSM data model includes three basic data types: nodes, ways, and
+relations. A _node_ is a point type, having a single geographic coordinate. A
+_way_ is an ordered list of nodes. And a _relation_ groups together nodes,
+ways, and other relations to provide free-form higher-level structures. Each
+of these three types has _tags_: an associative array of key-value pairs which
+describe the object.
+
+In iD, these three types are implemented by `iD.Node`, `iD.Way` and
+`iD.Relation`. These three classes inherit from a common base, `iD.Entity`
+(the only use of classical inheritance in iD). Generically, we refer to a
+node, way or relation as an _entity_.
+
+Every entity has an _ID_ either assigned by the OSM database, or, for an
+entity that is newly created, constructed as a proxy consisting of a negative
+numeral. IDs from the OSM database as treated as opaque strings; no
+[assumptions](http://lists.openstreetmap.org/pipermail/dev/2013-February/026495.html)
+are made of them other than that they can be compared for identity and do not
+begin with a minus sign (and thus will not conflict with proxy IDs). In fact,
+in the OSM database the three types of entities have separate ID spaces; a
+node can have the same ID as a way, for instance. Because it is useful to
+store heterogeneous entities in the same datastructure, iD ensures that every
+entity has a fully-unique ID by prefixing each OSM ID with the first letter of
+the entity type. For example, a way with OSM ID 123456 is represented as
+'w123456' within iD.
+
+iD entities are *immutable*: once constructed, an `Entity` object cannot
+change. Tags cannot be updated; nodes cannot be added or removed from ways,
+and so on. Immutability makes it easier to reason about the behavior of an
+entity: if your code has a reference to one, it is safe to store it and use it
+later, knowing that it cannot have been changed outside of your control. It
+also makes it possible to implement the entity graph (described below) as an
+efficient [persistent data
+structure](http://en.wikipedia.org/wiki/Persistent_data_structure). But
+obviously, iD is an editor, and must allow entities to change somehow. The
+solution is that all edits produce new copies of anything that changes. At the
+entity level, this takes the form of methods such as `iD.Node#move`, which
+returns a new node object that has the same ID and tags as the original, but a
+different coordinate. More generically, `iD.Entity#update` returns a new
+entity of the same type and ID as the original but with specified properties
+such as `nodes`, `tags`, or `members` replaced.
+
+Entities are related to one another: ways have many nodes and relations have
+many members. In order to render a map of a certain area, iD needs a
+datastructure to hold all the entities in that area and traverse these
+relationships. `iD.Graph` provides this functionality. The core of a graph is
+a map between IDs and the associated entities; given an ID, the graph can give
+you the entity. Like entities, a graph is immutable: adding, replacing, or
+removing an entity produces a new graph, and the original is unchanged.
+Because entities are immutable, the original and new graphs can share
+references to entities that have not changed, keeping memory use to a minimum.
+If you are familiar with how git works internally, this persistent data
+structure approach is very similar.
+
+The final component of the core is comprised of `iD.History` and
+`iD.Difference`, which track the changes made in an editing session and
+provide undo/redo capabilities. Here, the immutable nature of the core types
+really pays off: the history is a simple stack of graphs, each representing
+the state of the data at a particular point in editing. The graph at the top
+of the stack is the current state, off which all rendering is based. To undo
+the last change, this graph is popped off the stack, and the map is
+re-rendered based on the new top of the stack. Contrast this to a mutable
+graph as used in JOSM and Potlatch: every command that changes the graph must
+implement an equal and opposite undo command that restores the graph to the
+previous state.
+
+## Actions
+
+In iD, an _action_ is a function that accepts a graph as input and returns a
+modified graph as output. Actions typically need other inputs as well; for
+example, `iD.actions.DeleteNode` also requires the ID of a node to delete. The
+additional input is passed to the action's constructor:
+
+``` var action = iD.actions.DeleteNode('n123456'); // construct the action var
+newGraph = action(oldGraph); // apply the action ```
+
+iD provides actions for all the typical things an editor needs to do: add a
+new entity, split a way in two, connect the vertices of two ways together, and
+so on. In addition to performing the basic work needed to accomplish these
+things, an action typically contains a significant amount of logic for keeping
+the relationships between entities logical and consistent. For example, an
+action as apparently simple as `DeleteNode`, in addition to removing the node
+from the graph, needs to do two other things: remove the node from any ways in
+which it is a member (which in turn requires deleting parent ways that are
+left with just a single node), and removing it from any relations of which it
+is a member.
+
+As you can imagine, implementing all these details requires an expert
+knowledge of the OpenStreetMap data model. It is our hope that JavaScript
+based tools for OpenStreetMap can reuse the implementations provided by iD in
+other contexts, significantly reducing the work necessary to create a robust
+tool.
+
+## Modes
+
+With _modes_, we shift gears from abstract data types and algorithms to the
+parts of the architecture that implement the user interface for iD. Modes are
+manifested in the interface by the four buttons at the top left:
+
+
+
+The modality of existing OSM editors runs the gamut from Potlatch 2, which is
+almost entirely modeless, to JOSM, which sports half a dozen modes out of the
+box and has many more provided by plugins. iD seeks a middle ground: too few
+modes can leave new users unsure where to start, while too many can be
+overwhelming.
+
+iD's user-facing modes consist of a base "Browse" mode, in which you can move
+around the map and select and edit entities, and three geometrically-oriented
+drawing modes: Point, Line, and Area. In the code, these are broken down a
+little bit more. There are separate modes for when an entity is selected
+(`iD.modes.Select`) versus when nothing is selected (`iD.modes.Browse`), and
+each of the geometric modes is split into one mode for starting to draw an
+object and one mode for continuing an existing object (with the exception of
+`iD.modes.AddPoint`, which is a single-step operation for obvious reasons).
+
+The code interface for each mode consists of a pair of methods: `enter` and
+`exit`. In the `enter` method, a mode sets up all the behavior that should be
+present when that mode is active. This typically means binding callbacks to
+DOM events that will be triggered on map elements, installing keybindings, and
+showing certain parts of the interface like the inspector in `Select` mode.
+The `exit` mode does the opposite, removing the behavior installed by the
+`enter` method. Together the two methods ensure that modes are self-contained
+and exclusive: each mode knows exactly the behavior that is specific to that
+mode, and exactly one mode's behavior is active at any time.
+
+## Behavior
+
+Certain behaviors are common to more than one mode. For example, iD indicates
+interactive map elements by drawing a halo around them when you hover over
+them, and this behavior is common to both the browse and draw modes. Instead
+of duplicating the code to implement this behavior in all these modes, we
+extract it to `iD.behavior.Hover`.
+
+_Behaviors_ take their inspiration from [d3's
+behaviors](https://github.com/mbostock/d3/wiki/Behaviors). Like d3's `zoom`
+and `drag`, each iD behavior is a function that takes as input a d3 selection
+(assumed to consist of a single element) and installs the DOM event bindings
+necessary to implement the behavior. The `Hover` behavior, for example,
+installs bindings for the `mouseover` and `mouseout` events that add and
+remove a `hover` class from map elements.
+
+Because certain behaviors are appropriate to some but not all modes, we need
+the ability to remove a behavior when entering a mode where it is not
+appropriate. (This is functionality [not yet
+provided](https://github.com/mbostock/d3/issues/894) by d3's own behaviors.)
+Each behavior implements an `off` function that "uninstalls" the behavior.
+This is very similar to the `exit` method of a mode, and in fact many modes do
+little else but uninstall behaviors in their `exit` methods.
+
+## Operations
+
+_Operations_ wrap actions, providing their user-interface: tooltips, key
+bindings, and the logic that determines whether an action can be validly
+performed given the current map state and selection. Each operation is
+constructed with the list of IDs which are currently selected and a `context`
+object which provides access to the history and other important parts of iD's
+internal state. After being constructed, an operation can be queried as to
+whether or not it should be made available (i.e., show up in the context menu)
+and if so, if it should be enabled.
+
+
+
+We make a distinction between availability and enabled state for the sake of
+learnability: most operations are available so long as an entity of the
+appropriate type is selected. Even if it remains disabled for other reasons
+(e.g. because you can't split a way on its start or end vertex), a new user
+can still learn that "this is something I can do to this type of thing", and a
+tooltip can provide an explanation of what that operation does and the
+conditions under which it is enabled.
+
+To execute an operation, call it as a function, with no arguments. The typical
+operation will perform the appropriate action, creating a new undo state in
+the history, and then enter the appropriate mode. For example,
+`iD.operations.Split` performs `iD.actions.Split`, then enters
+`iD.modes.Select` with the resulting ways selected.
+
+## Rendering and other UI
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
new file mode 100644
index 000000000..09dbab7ba
--- /dev/null
+++ b/CONTRIBUTING.md
@@ -0,0 +1,101 @@
+# Contributing to iD
+
+Thinking of contributing to iD? High five! Here are some basics for our habits
+so that you can write code that fits in perfectly.
+
+## Reporting Issues
+
+We'd love to hear what you think about iD, about any specific problems or
+concerns you have. Here's a quick list of things to consider:
+
+Please [search for your issue before filing it: many bugs and improvements have already been reported](https://github.com/systemed/iD/issues/search?q=)
+
+To report a bug:
+
+* Write specifically what browser (type and version, like Firefox 22), OS, and browser extensions you have installed
+* Write steps to replicate the error: when did it happen? What did you expect to happen? What happened instead?
+* Please keep bug reports professional and straightforward: trust us, we share your dismay at software breaking.
+* If you can, [enable web developer extensions](http://macwright.org/enable-web-developer-extensions/) and report the
+ Javascript error message.
+
+When in doubt, be over-descriptive of the bug and how you discovered it.
+
+To request a feature:
+
+* If the feature is available in some other software (like Potlatch), link to that software and the implementation.
+ We care about prior art.
+* Understand that iD is meant to be a simple editor and doesn't aim to be
+ as complete or complicated as JOSM or similar.
+
+## Javascript
+
+We use the [Airbnb style for Javascript](https://github.com/airbnb/javascript) with
+only one difference:
+
+**4 space soft tabs always for Javascript, not 2.**
+
+No aligned `=`, no aligned arguments, spaces are either indents or the 1
+space between expressions. No hard tabs, ever.
+
+Javascript code should pass through [JSHint](http://www.jshint.com/) with no
+warnings.
+
+## HTML
+
+There isn't much HTML in iD, but what there is is similar to JS: 4 spaces
+always, indented by the level of the tree:
+
+```html
+
+```
+
+## CSS
+
+Just like HTML and Javascript, 4 space soft tabs always.
+
+```css
+.radial-menu-tooltip {
+ background: rgba(255, 255, 255, 0.8);
+}
+```
+
+We write vanilla CSS with no preprocessing step. Since iD targets modern browsers,
+feel free to use newer features wisely.
+
+## Tests
+
+Test your code and make sure it passes. Our testing harness requires [node.js](http://nodejs.org/)
+and a few modules:
+
+1. [Install node.js](http://nodejs.org/) - 'Install' will download a package for your OS
+2. Go to the directory where you have checked out `iD`
+3. Run `npm install`
+4. Run `npm test` to see whether your tests pass or fail.
+
+## Licensing
+
+iD is under the [WTFPL](http://www.wtfpl.net/). Some of the libraries it uses
+are under different licenses. If you're contributing to iD, you're contributing
+WTFPL code.
+
+## Submitting Changes
+
+Let's say that you've thought of a great improvement to iD - a change that
+turns everything red (please do not do this, we like colors other than red).
+
+In your local copy, make a branch for this change:
+
+ git checkout -b make-red
+
+Make your changes to source files. By source files we mean the files in `js/`.
+the `iD.js` and `iD.min.js` files in this project are autogenerated - don't edit
+them.
+
+So let's say you've changed `js/ui/confirm.js`.
+
+1. Run `jshint js/id` to make sure your code is clean
+2. Run tests with `npm test`
+3. Commit your changes with an informative commit message
+4. [Submit a pull request](https://help.github.com/articles/using-pull-requests) to the `systemed/iD` project.
diff --git a/Makefile b/Makefile
index 70ac208d6..bb6844399 100644
--- a/Makefile
+++ b/Makefile
@@ -23,12 +23,16 @@ all: \
js/lib/jxon.js \
js/lib/lodash.js \
js/lib/ohauth.js \
+ js/lib/rtree.js \
js/lib/sha.js \
js/id/start.js \
js/id/id.js \
js/id/connection.js \
js/id/oauth.js \
js/id/services/*.js \
+ data/data.js \
+ data/imagery.js \
+ data/deprecated.js \
js/id/util.js \
js/id/geo.js \
js/id/geo/*.js \
@@ -40,14 +44,16 @@ all: \
js/id/modes/*.js \
js/id/operations.js \
js/id/operations/*.js \
- js/id/controller/*.js \
- js/id/graph/*.js \
+ js/id/core/*.js \
js/id/renderer/*.js \
js/id/svg.js \
js/id/svg/*.js \
js/id/ui.js \
js/id/ui/*.js \
- js/id/end.js
+ js/id/validate.js \
+ js/id/end.js \
+ js/lib/locale.js \
+ locale/*.js
iD.js: Makefile
@rm -f $@
diff --git a/README.md b/README.md
index 711cb5418..e185fbb4f 100644
--- a/README.md
+++ b/README.md
@@ -2,31 +2,30 @@
[](https://travis-ci.org/systemed/iD)
-[](http://geowiki.com/iD/)
-
-[Try the online demo of the most recent code.](http://geowiki.com/iD/) and
-[open issues for bugs and ideas!](https://github.com/systemed/iD/issues)
+[](http://ideditor.com/)
## Basics
* iD is a JavaScript [OpenStreetMap](http://www.openstreetmap.org/) editor.
* It's intentionally simple. It lets you do the most basic tasks while
not breaking other people's data.
-* We support modern browsers. Data is rendered with [d3](http://d3js.org/).
+* It supports modern browsers. Data is rendered with [d3](http://d3js.org/).
## Participate!
-* [Read NOTES.md, our ongoing dev journal](https://github.com/systemed/iD/blob/master/NOTES.md)
-* Fork this project. We eagerly accept pull requests.
-* See [open issues in the issue tracker if you're looking for something to do](https://github.com/systemed/iD/issues?state=open)
+* [Try out the latest stable release](http://geowiki.com/iD/)
+* [Read up on Contributing and the code style of iD](CONTRIBUTING.md)
+* See [open issues in the issue tracker](https://github.com/systemed/iD/issues?state=open) if you're looking for something to do
-To run the code locally, just fork this project and run it from a local webserver.
-With a Mac, you can enable Web Sharing and drop this in your website directory.
+## Installation
-If you have Python handy, just `cd` into `iD` and run
+To run the current development version, fork this project and serve it locally.
+If you have Python handy, just `cd` into the project root directory and run
python -m SimpleHTTPServer
+Or, with a Mac, you can enable Web Sharing and clone iD into your website directory.
+
Come on in, the water's lovely. More help? Ping RichardF, tmcw, or jfire on IRC
(`irc.oftc.net`, in `#osm-dev` or `#osm`), on the OSM mailing lists or at
richard@systemeD.net.
diff --git a/combobox.html b/combobox.html
new file mode 100644
index 000000000..383dbe325
--- /dev/null
+++ b/combobox.html
@@ -0,0 +1,169 @@
+
+
+
+
+ iD
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/css/app.css b/css/app.css
index f30a4570f..efcdd8b87 100644
--- a/css/app.css
+++ b/css/app.css
@@ -19,10 +19,11 @@ body {
}
.limiter {
+ position: relative;
max-width: 1200px;
}
-div, textarea, input, span, ul, li, ol, a, button {
+div, textarea, input, form, span, ul, li, ol, a, button {
-moz-box-sizing: border-box;
-webkit-box-sizing: border-box;
box-sizing: border-box;
@@ -33,6 +34,7 @@ div, textarea, input, span, ul, li, ol, a, button {
a, button, input, textarea {
-webkit-tap-highlight-color:rgba(0,0,0,0);
-webkit-touch-callout:none;
+ cursor:url(../img/cursor-pointer.png) 6 1, auto;
}
h2 {
@@ -92,7 +94,6 @@ a:hover {
color:#597be7;
}
-
textarea,
input[type=text] {
background-color: white;
@@ -120,7 +121,7 @@ input[type=text]:focus {
}
input[type=text] {
- padding:4px 10px;
+ padding:5px 10px;
height:30px;
resize: none;
}
@@ -181,11 +182,14 @@ ul li { list-style: none;}
ul.toggle-list li a {
font-weight: bold;
color: #333;
- padding: 10px;
- border-top: 1px solid white;
+ padding: 5px 10px;
display:block;
- border-top: 1px solid rgba(0, 0, 0, .5);
+ border-top: 1px solid #ccc;
+ white-space:nowrap;
+ text-overflow:ellipsis;
+ overflow:hidden;
}
+ul.toggle-list li a:hover { background-color: #ececec;}
ul.toggle-list .icon {
float: left;
@@ -220,7 +224,7 @@ ul.link-list li:last-child {
.fillD {
background:rgba(0,0,0,.8);
- color: #a9a9a9;
+ color: #6C6C6C;
}
@@ -246,7 +250,6 @@ form.hide {
button {
line-height:20px;
- position: relative;
border:0;
color:#222;
background: white;
@@ -254,7 +257,6 @@ button {
font-size:12px;
display: inline-block;
height:40px;
- cursor:url(../img/cursor-pointer.png) 6 1, auto;
border-radius:4px;
-webkit-transition: background 100ms;
-moz-transition: background 100ms;
@@ -265,16 +267,17 @@ button:hover {
background-color: #ececec;
}
-button.col3:hover {
- background: #bde5aa;
-}
-
button.active {
cursor:url(../img/cursor-pointing.png) 6 1, auto;
}
-button.active:not([disabled]) {
- background: #6bc641;
+button.disabled {
+ background: #6c6c6c;
+ cursor: auto;
+}
+
+button.active:not([disabled]):not(.disabled) {
+ background: #7092ff;
}
button.minor {
@@ -283,11 +286,11 @@ button.minor {
width: 20px;
border: 0;
box-shadow: none;
- background-color: transparent;
+ background: rgba(0,0,0,.5);
}
button.minor:hover {
- background: white;
+ background: #222;
}
button.centered {
@@ -319,6 +322,8 @@ button.centered {
border-radius:0 4px 4px 0;
}
+button.browse .label { display: none;}
+
button.action {
background: #7092ff;
}
@@ -344,16 +349,15 @@ button.save .count {
button.save.has-count .count {
display: block;
position: absolute;
- left: 115%;
- top: 0;
- bottom: 0;
- background: rgba(255,255,255,.5);
+ top: 5px;
+ background: rgba(255, 255, 255, .5);
color: #333;
padding: 10px;
height: 30px;
line-height: 12px;
border-radius: 4px;
margin: auto;
+ margin-left: 8.3333%;
}
button.save.has-count .count::before {
@@ -416,12 +420,12 @@ button[disabled] .label {
}
/* Definitions for every icon */
-.icon.browse { background-position: 0px -20px;}
-.icon.add-point { background-position: -20px -20px;}
-.icon.add-line { background-position: -40px -20px;}
-.icon.add-area { background-position: -60px -20px;}
-.icon.undo { background-position: -80px -20px;}
-.icon.redo { background-position: -100px -20px;}
+.icon.browse { background-position: 0px 0px;}
+.icon.add-point { background-position: -20px 0px;}
+.icon.add-line { background-position: -40px 0px;}
+.icon.add-area { background-position: -60px 0px;}
+.icon.undo { background-position: -80px 0px;}
+.icon.redo { background-position: -100px 0px;}
.icon.apply { background-position: -120px 0px;}
.icon.save { background-position: -140px 0px;}
@@ -431,6 +435,7 @@ button[disabled] .label {
.icon.inspect { background-position: -220px 0px;}
.icon.zoom-in { background-position: -240px 0px;}
.icon.zoom-out { background-position: -260px 0px;}
+.icon.plus { background-position: -240px 0px;}
.icon.geocode { background-position: -280px 0px;}
.icon.layers { background-position: -300px 0px;}
.icon.avatar { background-position: -320px 0px;}
@@ -438,16 +443,7 @@ button[disabled] .label {
.icon.geolocate { background-position: -360px 0px;}
.icon.warning { background-position: -380px 0px;}
-.icon.close-modal{ background-position: -200px -40px;}
-
-.icon.invert.zoom-in { background-position: -240px -40px;}
-
-.icon.browse { background-position: 0px 0px;}
-.icon.add-point { background-position: -20px 0px;}
-.icon.add-line { background-position: -40px 0px;}
-.icon.add-area { background-position: -60px 0px;}
-.icon.undo { background-position: -80px 0px;}
-.icon.redo { background-position: -100px 0px;}
+.icon.close-modal { background-position: -200px 0px;}
.fillD .icon.avatar { background-position: -320px -20px;}
.fillD .icon.nearby { background-position: -340px -20px;}
@@ -456,8 +452,8 @@ button[disabled] .icon.browse { background-position: 0px -40px;}
button[disabled] .icon.add-point { background-position: -20px -40px;}
button[disabled] .icon.add-line { background-position: -40px -40px;}
button[disabled] .icon.add-area { background-position: -60px -40px;}
-button[disabled] .icon.undo { background-position: -80px -40px;}
-button[disabled] .icon.redo { background-position: -100px -40px;}
+button.disabled .icon.undo { background-position: -80px -40px;}
+button.disabled .icon.redo { background-position: -100px -40px;}
button[disabled] .apply.icon { background-position: -120px -40px;}
button[disabled] .save.icon { background-position: -140px -40px;}
button[disabled] .close.icon { background-position: -160px -40px;}
@@ -471,13 +467,24 @@ button[disabled] .icon.layers { background-position: -300px -40px;}
button[disabled] .icon.avatar { background-position: -320px -40px;}
button[disabled] .icon.nearby { background-position: -340px -40px;}
-.icon.big-line { background-position: 0px -80px;}
-.icon.big-point { background-position: -40px -80px;}
-.icon.big-area { background-position: -80px -80px;}
-.icon.big-vertex { background-position: -120px -80px;}
-.icon.big-inspect { background-position: -160px -80px;}
+.icon.big-line { background-position: 0px -80px;}
+.icon.big-point { background-position: -40px -80px;}
+.icon.big-area { background-position: -80px -80px;}
+.icon.big-vertex { background-position: -120px -80px;}
+.icon.big-inspect { background-position: -160px -80px;}
.icon.big-relation { background-position: -200px -80px;}
+.icon-operation-delete { background-position: 0px -140px;}
+.icon-operation-circularize { background-position: -20px -140px;}
+.icon-operation-straighten { background-position: -40px -140px;}
+.icon-operation-split { background-position: -60px -140px;}
+.icon-operation-disconnect { background-position: -80px -140px;}
+.icon-operation-reverse { background-position: -100px -140px;}
+.icon-operation-move { background-position: -120px -140px;}
+.icon-operation-merge { background-position: -140px -140px;}
+.icon-operation-orthogonalize { background-position: -160px -140px;}
+
+
/* Toggle icon is special */
.toggle.icon { background-position: 0px -180px;}
a:hover .toggle.icon { background-position: -20px -180px;}
@@ -609,19 +616,20 @@ a.selected:hover .toggle.icon { background-position: -40px -180px;}
width: 60%;
}
-.inspector-inner .add-tag-row {
- width: 100%;
-}
-
-.inspector-inner .add-tag-row button {
+.inspector-inner .add-tag {
+ width: 20%;
+ height: 30px;
+ border-top: 0;
+ background: rgba(0,0,0,.5);
border-radius: 0 0 4px 4px;
}
-.inspector-inner .add-tag {
- width: 40%;
- height: 30px;
- border: 1px solid #ccc;
- border-top: 0;
+.inspector-inner .add-tag:hover {
+ background: rgba(0,0,0,.8);
+}
+
+.inspector-inner .add-tag .label {
+ display: none;
}
/* Map Controls */
@@ -631,25 +639,27 @@ a.selected:hover .toggle.icon { background-position: -40px -180px;}
position:absolute;
}
-.map-control button {
- width: 40px;
- background: rgba(0,0,0,.8);
- border-radius: 0 4px 4px 0;
+.map-control > button {
+ width: 30px;
+ background: rgba(0,0,0,.5);
+ border-radius: 0;
+ border-bottom: 1px solid rgba(0, 0, 0, 1);
}
-.map-control button:hover {
- background: rgba(0, 0, 0, .9);
+.map-control > button:hover {
+ background: rgba(0, 0, 0, .8);
}
-.map-control button.active:hover {
- background: #6bc641;
+.map-control > button.active:hover {
+ background: #7092ff;
}
.map-overlay {
- width: 150px;
- position:absolute;
- left:50px;
- top:0;
+ right: 75%;
+ max-width: 260px;
+ min-width: 210px;
+ position: fixed;
+ left: 40px;
display: block;
border-radius: 4px;
}
@@ -658,43 +668,117 @@ a.selected:hover .toggle.icon { background-position: -40px -180px;}
.zoombuttons {
top:70px;
- width: 40px;
+ width: 30px;
}
.zoombuttons button.zoom-in {
border-radius:0 4px 0 0;
- border-bottom: 1px solid rgba(0, 0, 0, .5);
}
.zoombuttons button.zoom-out {
border-top:0;
- border-radius:0 0 4px 0;
}
/* Layer Switcher */
.layerswitcher-control {
- top:210px;
+ top:190px;
+}
+
+.nudge-container {
+ margin-top: 10px;
}
.layerswitcher-control .adjustments button {
- opacity:0.5;
- height:20px;
+ height:30px;
font-size:10px;
- font-weight:normal;
padding:0 5px 3px 5px;
background: white;
- border: 1px solid #ddd;
- border-radius: 0;
+ text-transform: uppercase;
+ font-weight: bold;
}
.layerswitcher-control .adjustments button:hover {
- opacity: 1;
+ background:#ececec;
+}
+
+.layerswitcher-control .alignment-toggle {
+ display: block;
+ padding-left: 12px;
+ position: relative;
+}
+
+.layerswitcher-control .alignment-toggle:before {
+ content: '';
+ display: block;
+ position: absolute;
+ height: 0;
+ width: 0;
+ left: 0;
+ top: 4px;
+ border-top: 4px solid transparent;
+ border-bottom: 4px solid transparent;
+ border-left: 8px solid #7092ff;
+}
+
+.layerswitcher-control .alignment-toggle.expanded:before {
+ border-top: 8px solid #7092ff;
+ border-bottom: 0;
+ border-right: 4px solid transparent;
+ border-left: 4px solid transparent;
+
}
.layerswitcher-control .nudge {
- width:20px;
- margin-right:2px;
+ text-indent: -9999px;
+ overflow: hidden;
+ width:16.6666%;
+ border-radius: 0;
+ border-right: 1px solid rgba(0, 0, 0, .5);
+ position: relative;
+}
+
+.layerswitcher-control .nudge::after {
+ content: '';
+ display: block;
+ position: absolute;
+ margin: auto;
+ left: 0; right: 0; top: 0; bottom: 0;
+ height: 0;
+ width: 0;
+}
+
+.layerswitcher-control .nudge.left::after {
+ border-top: 5px solid transparent;
+ border-bottom: 5px solid transparent;
+ border-left: 5px solid #222;
+}
+
+.layerswitcher-control .nudge.right::after {
+ border-top: 5px solid transparent;
+ border-bottom: 5px solid transparent;
+ border-right: 5px solid #222;
+}
+
+.layerswitcher-control .nudge.top::after {
+ border-right: 5px solid transparent;
+ border-left: 5px solid transparent;
+ border-bottom: 5px solid #222;
+}
+
+.layerswitcher-control .nudge.bottom::after {
+ border-right: 5px solid transparent;
+ border-left: 5px solid transparent;
+ border-top: 5px solid #222;
+}
+
+.layerswitcher-control .nudge:first-child {
+ border-radius: 4px 0 0 4px;
+}
+
+.layerswitcher-control .reset {
+ width: 33.3333%;
+ border-radius: 0 4px 4px 0;
}
.opacity-options-wrapper {
@@ -708,6 +792,7 @@ a.selected:hover .toggle.icon { background-position: -40px -180px;}
position: absolute;
right: 10px;
top: 10px;
+ border: 1px solid #ddd;
}
.opacity-options li {
@@ -720,14 +805,14 @@ a.selected:hover .toggle.icon { background-position: -40px -180px;}
.opacity-options li .select-box{
position: absolute;
width:20px;
- height:20px;
+ height:18px;
z-index: 9999;
}
.layerswitcher-control li:hover .select-box,
.layerswitcher-control li.selected .select-box {
- border: 2px solid #6bc641;
- background: rgba(107, 198, 65, .5);
+ border: 2px solid #7092ff;
+ background: rgba(89, 123, 231, .5);
opacity: .5;
}
.layerswitcher-control li.selected:hover .select-box,
@@ -739,23 +824,45 @@ a.selected:hover .toggle.icon { background-position: -40px -180px;}
background:#222;
display:inline-block;
width:20px;
- height:20px;
+ height:18px;
}
/* Geocoder */
-.geocode-control {
- top:160px;
+.geocode-control, .geocode-control form {
+ top:150px;
+}
+
+.geocode-control form {
+ padding: 4px;
}
.geocode-control input {
- width: 140px;
- border: 1px solid #ccc;
- margin: 4px;
+ width: 100%;
}
+.geocode-control div.content {
+ z-index: 100;
+ top: 190px;
+ max-height: 300px;
+ overflow-y: auto;
+}
+
+.geocode-control div.content span {
+ display: inline-block;
+ border-bottom: 1px solid #333;
+ padding: 5px 10px;
+}
+
+/* Geolocator */
+
.geolocate-control {
- top:260px;
+ top:230px;
+}
+
+.geolocate-control button {
+ border-radius: 0 0 4px 0;
+ border-bottom: 0;
}
/* Map
@@ -791,6 +898,10 @@ img.tile {
-o-transform-origin:0 0;
}
+#surface {
+ position: static;
+}
+
#tile-g {
opacity: 0.5;
}
@@ -819,17 +930,17 @@ img.tile {
color:#fff;
}
-#user-list a:not(:last-child):after {
+.user-list a:not(:last-child):after {
content: ', ';
}
/* Account Information */
-.user-container {
+.account {
float: left;
}
-.user-container .logout {
+.account .logout {
margin-left:10px;
border-left: 1px solid white;
padding-left: 10px;
@@ -878,9 +989,11 @@ div.typeahead a:first-child {
display: inline-block;
position:absolute;
width: 50%;
- left: 25%;
+ left: 0;
+ right: 0;
+ margin: auto;
max-width: 600px;
- top:80px;
+ top: 80px;
z-index: 3;
}
@@ -899,10 +1012,14 @@ div.typeahead a:first-child {
position: absolute;
right:5px;
top:5px;
- border:0;
+ opacity: .5;
+ -webkit-transition: opacity 100ms;
+ -moz-transition: opacity 100ms;
+ transition: opacity 100ms;
}
.modal button.close-modal:hover {
background-color: transparent;
+ opacity: 1;
}
.shaded {
@@ -920,7 +1037,7 @@ div.typeahead a:first-child {
padding: 20px;
}
-.modal-section.header {
+.modal-section:first-child {
border-radius: 4px 4px 0 0;
}
@@ -963,7 +1080,6 @@ div.typeahead a:first-child {
.modal-splash {
width: 33.3333%;
- left: 33.3333%;
}
.logo {
@@ -976,7 +1092,7 @@ div.typeahead a:first-child {
/* Commit Modal
------------------------------------------------------- */
-.commit-modal .user-info {
+.commit-modal a.user-info {
display: inline-block;
}
@@ -1007,11 +1123,10 @@ div.typeahead a:first-child {
border:1px solid #ccc;
background:#fff;
max-height: 160px;
- overflow: visible;
}
-.commit-modal .warning-section .changeset-list {
- margin-right: 20px;
+.commit-modal .warning-section .changeset-list button {
+ float: right;
}
.commit-section.modal-section {
@@ -1022,30 +1137,17 @@ div.typeahead a:first-child {
.commit-modal .changeset-list li {
position: relative;
-}
-
-.commit-modal .changeset-list li button {
- position: absolute;
- right: -30px;
+ border-top:1px solid #ccc;
+ padding:5px 10px;
}
.modal-section {
padding: 20px;
}
-.modal-section.header {
- border-radius: 4px 4px 0 0;
-}
-
-.modal-section .buttons {
- padding-top: 10px;
- width: 100%;
-}
-
.modal-section img.wiki-image {
- max-width: 400px;
+ max-width: 100%;
max-height: 300px;
- padding: 10px;
display: block;
}
@@ -1060,11 +1162,6 @@ div.typeahead a:first-child {
display:none;
}
-.changeset-list li {
- border-top:1px solid #ccc;
- padding:5px 10px;
-}
-
.changeset-list li span.count {
font-size:10px;
color:#555;
@@ -1082,10 +1179,6 @@ div.typeahead a:first-child {
font:normal 12px/20px 'Helvetica Neue', Arial, sans-serif;
}
-.loading-modal {
- text-align: center;
-}
-
/* Success
------------------------------------------------------- */
a.success-action {
@@ -1104,7 +1197,8 @@ a.success-action {
text-align:center;
}
-.notice .notice-inner {
+.notice .zoom-to {
+ width:100%;
height: 40px;
border-radius: 5px;
line-height: 40px;
@@ -1113,22 +1207,27 @@ a.success-action {
opacity: 0.9;
}
-.notice .notice-inner .zoom-to {
- width:40px;
- height:40px;
+.notice .zoom-to:hover {
+ background: #d8e1ff;
+}
+
+.notice .zoom-to .icon {
+ margin-top:10px;
margin-right:10px;
}
+.icon.zoom-in-invert {
+ background-position: -240px -40px;
+}
+
/* Tooltips
------------------------------------------------------- */
.tooltip {
- white-space: normal;
+ width: 200px;
position: absolute;
- left: 0; right: 0; margin: auto;
z-index: -1000;
height: 0;
- padding: 5px;
opacity: 0;
display: block;
}
@@ -1140,106 +1239,140 @@ a.success-action {
}
.tooltip.top {
- margin-top: -5px;
+ margin-top: -10px;
+ text-align: center;
}
.tooltip.right {
- margin-left: 5px;
+ margin-left: 10px;
+ text-align: left;
}
.tooltip.bottom {
- margin-top: 5px;
+ margin-top: 10px;
+ text-align: center;
}
.tooltip.left {
- margin-left: -5px;
+ margin-left: -10px;
+ text-align: right;
}
.tooltip-inner {
- text-align: left;
- width: 200px;
- font-size: 11px;
- font-weight: bold;
- line-height: 20px;
- padding: 5px 10px;
- color: #333;
- background-color: white;
- -webkit-border-radius: 4px;
- -moz-border-radius: 4px;
- border-radius: 4px;
+ color: #333;
+ display: inline-block;
+ padding: 5px 10px;
+ font-size: 11px;
+ font-weight: bold;
+ line-height: 20px;
+ background-color: white;
+ -webkit-border-radius: 4px;
+ -moz-border-radius: 4px;
+ border-radius: 4px;
+
}
.tooltip-arrow {
- position: absolute;
- width: 0;
- height: 0;
- border-color: transparent;
- border-style: solid;
+ position: absolute;
+ width: 0;
+ height: 0;
+ border-color: transparent;
+ border-style: solid;
}
.tooltip.top .tooltip-arrow {
- bottom: 0;
- left: 50%;
- margin-left: -5px;
- border-top-color: white;
- border-width: 5px 5px 0;
+ bottom: -5px;
+ left: 50%;
+ margin-left: -5px;
+ border-top-color: white;
+ border-width: 5px 5px 0;
}
.tooltip.right .tooltip-arrow {
- top: 50%;
- left: 0;
- margin-top: -5px;
- border-right-color: white;
- border-width: 5px 5px 5px 0;
+ top: 50%;
+ left: -5px;
+ margin-top: -5px;
+ border-right-color: white;
+ border-width: 5px 5px 5px 0;
}
.tooltip.left .tooltip-arrow {
- top: 50%;
- right: 0;
- margin-top: -5px;
- border-left-color: white;
- border-width: 5px 0 5px 5px;
+ top: 50%;
+ right: 5px;
+ margin-top: -5px;
+ border-left-color: white;
+ border-width: 5px 0 5px 5px;
}
.tooltip.bottom .tooltip-arrow {
- top: 0;
- left: 50%;
- margin-left: -5px;
- border-bottom-color: white;
- border-width: 0 5px 5px;
+ top: -5px;
+ left: 50%;
+ margin-left: -5px;
+ border-bottom-color: white;
+ border-width: 0 5px 5px;
}
+.Browse .tooltip {
+ left: -20px !important; }
.Browse .tooltip .tooltip-arrow {
- left: 30px;
+ left: 60px;
+}
+
+.tooltip .keyhint-wrap {
+ padding: 5px 0 5px 0;
}
.tooltip .keyhint {
- float: right;
- background: #eee;
+ display: block;
+ color: #222;
font-size: 10px;
- padding: 0 4px;
- background:#aaa;
- color:#fff;
+ padding: 0px 7px;
+ font-weight: bold;
+ display: inline-block;
border-radius: 2px;
- margin-left: 4px;
+ border: 1px solid #CCC;
+ position: relative;
+ z-index: 1;
+ text-align: left;
+ clear: both;
+}
+
+.tooltip .keyhint .keyhint-label{
+ display: inline-block;
+}
+
+.tooltip .keyhint::after {
+ content: "";
+ position: absolute;
+ border-radius: 2px;
+ height: 10px;
+ width: 100%;
+ z-index: 0;
+ bottom: -4px;
+ left: -1px;
+ border: 1px solid #CCC;
+ border-top: 0;
}
.tail {
- pointer-events:none;
- position: absolute;
- background: rgba(255, 255, 255, 0.7);
- max-width: 250px;
- margin-top: -15px;
- padding: 5px;
- -webkit-border-radius: 4px;
+ pointer-events:none;
+ position: absolute;
+ background: rgba(255, 255, 255, 0.7);
+ max-width: 250px;
+ margin-top: -15px;
+ padding: 5px;
+ -webkit-border-radius: 4px;
-moz-border-radius: 4px;
border-radius: 4px;
}
+.radial-menu-background {
+ stroke: #aaa;
+ stroke-opacity: 0.4;
+}
+
.radial-menu-item {
- fill: white;
- stroke: black;
- stroke-width: 1;
+ fill: black;
cursor:url(../img/cursor-pointer.png) 6 1, auto;
}
@@ -1257,6 +1390,24 @@ a.success-action {
fill: rgba(255,255,255,.5);
}
+.radial-menu .icon {
+ pointer-events: none;
+}
+
+.radial-menu-tooltip {
+ background: rgba(255, 255, 255, 0.8);
+ padding: 5px;
+ -webkit-border-radius: 4px;
+ -moz-border-radius: 4px;
+ border-radius: 4px;
+}
+
+.lasso-box {
+ fill-opacity:0.2;
+ fill: #bde5aa;
+ stroke: #000;
+ stroke-width: 1;
+}
/* Media Queries
------------------------------------------------------- */
@@ -1265,5 +1416,44 @@ a.success-action {
span.label {display: none;}
/* override hide for save button */
.icon.icon-pre-text { margin-right: 0px;}
- .save .label { display: block;}
+ .save .label, .apply .label, .cancel .label { display: block;}
+}
+
+div.combobox {
+ width:155px;
+ z-index: 9999;
+ display: none;
+ box-shadow: 0 5px 10px 0 rgba(0,0,0,.2);
+ margin-top: -1px;
+ background: white;
+ max-height: 180px;
+ overflow: auto;
+ border: 1px solid #ccc;
+}
+
+div.combobox a {
+ height: 25px;
+ line-height: 25px;
+ cursor: pointer;
+ display: block;
+ border-top:1px solid #ccc;
+ background-color: #fff;
+ padding:1px 4px;
+ white-space: nowrap;
+}
+
+div.combobox a:hover,
+div.combobox a.selected {
+ background: #e1e8ff;
+ color: #154dff;
+}
+
+div.combobox a:first-child {
+ border-top: 0;
+}
+
+div.combobox-carat {
+ cursor: pointer;
+ padding:0 5px;
+ vertical-align:middle;
}
diff --git a/css/map.css b/css/map.css
index 7b3038d6c..43db827fe 100644
--- a/css/map.css
+++ b/css/map.css
@@ -1,3 +1,26 @@
+/* tiles */
+img.tile {
+ position:absolute;
+ transform-origin:0 0;
+ -ms-transform-origin:0 0;
+ -webkit-transform-origin:0 0;
+ -moz-transform-origin:0 0;
+ -o-transform-origin:0 0;
+ -webkit-user-select: none;
+ -webkit-user-drag: none;
+ -moz-user-drag: none;
+
+ opacity: 0;
+
+ -webkit-transition: opacity 200ms linear;
+ transition: opacity 200ms linear;
+ -moz-transition: opacity 200ms linear;
+}
+
+img.tile-loaded {
+ opacity: 1;
+}
+
/* base styles */
path {
fill: none;
@@ -9,6 +32,10 @@ g.point circle {
fill:#fff;
}
+g.point image {
+ pointer-events: none;
+}
+
g.point .shadow {
fill: none;
pointer-events: all;
@@ -16,22 +43,28 @@ g.point .shadow {
transition: transform 100ms linear;
-moz-transition: fill 100ms linear;
}
-.behavior-hover g.point.hover .shadow {
- fill: #E96666;
- fill-opacity: 0.3;
+.behavior-hover g.point.hover:not(.selected) .shadow {
+ fill: #f6634f;
+ fill-opacity: 0.5;
}
g.point.selected .shadow {
- fill: #E96666;
+ fill: #f6634f;
fill-opacity: 0.7;
}
+g.point.active, g.point.active * {
+ pointer-events: none;
+}
+
/* vertices */
g.vertex .fill {
fill:white;
}
+
g.vertex .stroke {
- stroke:#333;
+ stroke:black;
+ stroke-opacity: .5;
stroke-width:2;
fill:white;
}
@@ -101,28 +134,40 @@ g.vertex.shared .fill {
g.vertex .shadow {
fill: none;
pointer-events: all;
- stroke-width: 10;
+ stroke-width: 20;
-webkit-transition: -webkit-transform 100ms linear;
transition: transform 100ms linear;
-moz-transition: fill 100ms linear;
}
-.behavior-hover g.vertex.hover .shadow {
- fill: #E96666;
+.behavior-hover g.vertex.hover:not(.selected) .shadow {
+ fill: #f6634f;
fill-opacity: 0.3;
-}
+}
g.vertex.selected .shadow {
- fill: #E96666;
- fill-opacity: 0.7;
+ fill: #f6634f;
+ fill-opacity: 0.5;
}
/* midpoints */
-g.midpoint .fill {
- fill:#aaa;
+.mode-draw-area g.midpoint,
+.mode-draw-line g.midpoint,
+.mode-add-area g.midpoint,
+.mode-add-line g.midpoint,
+.mode-add-point g.midpoint,
+.behavior-drag-node g.midpoint {
+ display: none;
}
-.behavior-hover g.midpoint .fill.hover {
- fill:#fff;
- stroke:#000;
+
+g.midpoint .fill {
+ fill:#ddd;
+ stroke:black;
+ stroke-opacity: .5;
+ opacity: .5;
+}
+.behavior-hover g.midpoint .fill.hover:not(.selected) {
+ fill:white;
+ opacity: .75;
}
g.midpoint .shadow {
@@ -133,8 +178,8 @@ g.midpoint .shadow {
transition: transform 100ms linear;
-moz-transition: fill 100ms linear;
}
-.behavior-hover g.midpoint .shadow.hover {
- fill:#E96666;
+.behavior-hover g.midpoint .shadow.hover:not(.selected) {
+ fill:#f6634f;
fill-opacity: 0.3;
}
@@ -146,13 +191,8 @@ path.line {
}
path.stroke {
- stroke: #222;
- stroke-width: 2;
-}
-
-path.stroke,
-path.casing {
- shape-rendering: optimizeSpeed;
+ stroke: black;
+ stroke-width: 4;
}
path.shadow {
@@ -161,106 +201,83 @@ path.shadow {
-webkit-transition: stroke 100ms linear;
}
-.behavior-hover path.shadow.hover {
- stroke: #E96666;
+.behavior-hover path.shadow.hover:not(.selected) {
+ stroke: #f6634f;
stroke-opacity: 0.3;
}
path.shadow.selected {
- stroke: #E96666;
+ stroke: #f6634f;
stroke-opacity: 0.7;
}
path.area.stroke,
-path.multipolygon {
+path.line.member-type-multipolygon.stroke {
stroke-width:2;
- stroke:#fff;
}
-path.area.fill,
-path.multipolygon {
- fill:#fff;
- fill-opacity:0.3;
-}
-
-path.multipolygon {
- fill-rule: evenodd;
-}
-
-path.area.fill.member-type-multipolygon {
- fill: none;
-}
-
-path.area.stroke.selected {
+path.area.stroke.selected,
+path.line.member-type-multipolygon.stroke.selected {
stroke-width:4 !important;
}
-path.area.stroke.tag-natural,
-path.multipolygon.tag-natural {
- stroke: #ADD6A5;
+path.area.stroke {
+ stroke:#fff;
+}
+path.area.fill {
+ fill:#fff;
+ fill-opacity:0.3;
+ fill-rule: evenodd;
+}
+
+path.stroke.tag-natural {
+ stroke: #b6e199;
stroke-width:1;
}
-path.area.fill.tag-natural,
-path.multipolygon.tag-natural {
- fill: #ADD6A5;
+path.fill.tag-natural {
+ fill: #b6e199;
}
-path.area.stroke.tag-natural-water,
-path.multipolygon.tag-natural-water {
- stroke: #6382FF;
+path.stroke.tag-natural-water {
+ stroke: #77d3de;
}
-path.area.fill.tag-natural-water,
-path.multipolygon.tag-natural-water {
- fill: #ADBEFF;
+path.fill.tag-natural-water {
+ fill: #77d3de;
}
-path.area.stroke.tag-building,
-path.multipolygon.tag-building {
- stroke: #9E176A;
+path.stroke.tag-building {
+ stroke: #e06e5f;
stroke-width: 1;
}
-path.area.fill.tag-building,
-path.multipolygon.tag-building {
- fill: #ff6ec7;
+path.fill.tag-building {
+ fill: #e06e5f;
}
-path.area.stroke.tag-landuse,
-path.area.stroke.tag-natural-wood,
-path.area.stroke.tag-natural-tree,
-path.area.stroke.tag-natural-grassland,
-path.area.stroke.tag-leisure-park,
-path.multipolygon.tag-landuse,
-path.multipolygon.tag-natural-wood,
-path.multipolygon.tag-natural-tree,
-path.multipolygon.tag-natural-grassland,
-path.multipolygon.tag-leisure-park {
- stroke: #006B34;
+path.stroke.tag-landuse,
+path.stroke.tag-natural-wood,
+path.stroke.tag-natural-tree,
+path.stroke.tag-natural-grassland,
+path.stroke.tag-leisure-park {
+ stroke: #8cd05f;
stroke-width: 1;
}
-path.area.fill.tag-landuse,
-path.area.fill.tag-natural-wood,
-path.area.fill.tag-natural-tree,
-path.area.fill.tag-natural-grassland,
-path.area.fill.tag-leisure-park,
-path.multipolygon.tag-landuse,
-path.multipolygon.tag-natural-wood,
-path.multipolygon.tag-natural-tree,
-path.multipolygon.tag-natural-grassland,
-path.multipolygon.tag-leisure-park {
- fill: #189E59;
+path.fill.tag-landuse,
+path.fill.tag-natural-wood,
+path.fill.tag-natural-tree,
+path.fill.tag-natural-grassland,
+path.fill.tag-leisure-park {
+ fill: #8cd05f;
fill-opacity: 0.2;
}
-path.area.stroke.tag-amenity-parking,
-path.multipolygon.tag-amenity-parking {
- stroke: #beb267;
+path.stroke.tag-amenity-parking {
+ stroke: #aaa;
stroke-width: 1;
}
-path.area.fill.tag-amenity-parking,
-path.multipolygon.tag-amenity-parking {
- fill: #edecc0;
+path.fill.tag-amenity-parking {
+ fill: #aaa;
}
-path.multipolygon.tag-boundary {
+path.fill.tag-boundary {
fill: none;
}
@@ -291,56 +308,57 @@ svg[data-zoom="16"] path.stroke.tag-highway {
path.stroke.tag-highway-motorway,
path.stroke.tag-highway-motorway_link,
path.stroke.tag-construction-motorway {
- stroke:#809bc0;
+ stroke:#58a9ed;
}
+
path.casing.tag-highway-motorway,
path.casing.tag-highway-motorway_link,
path.casing.tag-construction-motorway {
- stroke:#506077;
+ stroke:#2c5476;
}
path.stroke.tag-highway-trunk,
path.stroke.tag-highway-trunk_link,
path.stroke.tag-construction-trunk {
- stroke:#97d397;
+ stroke:#8cd05f;
}
path.casing.tag-highway-trunk,
path.casing.tag-highway-trunk_link,
path.casing.tag-construction-trunk {
- stroke:#477147;
+ stroke:#46682f;
}
path.stroke.tag-highway-primary,
path.stroke.tag-highway-primary_link,
path.stroke.tag-construction-primary {
- stroke:#ec989a;
+ stroke:#e06d5f;
}
path.casing.tag-highway-primary,
path.casing.tag-highway-primary_link,
path.casing.tag-construction-primary {
- stroke:#8d4346;
+ stroke:#70372f;
}
path.stroke.tag-highway-secondary,
path.stroke.tag-highway-secondary_link,
path.stroke.tag-construction-secondary {
- stroke:#fecc8b;
+ stroke:#eab056;
}
path.casing.tag-highway-secondary,
path.casing.tag-highway-secondary_link,
path.casing.tag-construction-secondary {
- stroke:#a37b48;
+ stroke:#75582b;
}
path.stroke.tag-highway-tertiary,
path.stroke.tag-highway-tertiary_link,
path.stroke.tag-construction-tertiary {
- stroke:#ffffb3;
+ stroke:#ffff7e;
}
path.casing.tag-highway-tertiary,
path.casing.tag-highway-tertiary_link,
path.casing.tag-construction-tertiary {
- stroke:#bbb;
+ stroke:#7f7f3f;
}
path.stroke.tag-highway-unclassified,
@@ -377,7 +395,7 @@ path.stroke.tag-highway-pedestrian {
shapeRendering: auto;
}
path.casing.tag-highway-pedestrian {
- stroke:#84C382;
+ stroke:#8cd05f;
stroke-width:6 !important;
}
@@ -450,17 +468,17 @@ svg[data-zoom="16"] path.casing.tag-highway-bridleway {
}
path.stroke.tag-highway-footway {
- stroke: #996600;
+ stroke: #ae8681;
}
path.stroke.tag-highway-cycleway {
- stroke: #69f;
+ stroke: #58a9ed;
}
path.stroke.tag-highway-bridleway {
- stroke: green;
+ stroke: #e06d5f;
}
path.stroke.tag-highway-steps {
- stroke: #ff6257;
+ stroke: #81d25c;
stroke-width: 4;
stroke-linecap: butt;
stroke-dasharray: 3, 3;
@@ -472,7 +490,7 @@ path.casing.tag-highway-steps {
path.casing.tag-bridge-yes {
stroke-width: 14;
- stroke: #000;
+ stroke: #333;
}
path.stroke.tag-highway-construction,
@@ -516,12 +534,16 @@ path.casing.tag-railway-subway {
/* waterways */
+path.fill.tag-waterway {
+ fill: #77d3de;
+}
+
path.stroke.tag-waterway {
- stroke: #10539a;
+ stroke: #77d3de;
stroke-width: 2;
}
path.casing.tag-waterway {
- stroke: #6AA2FF;
+ stroke: #77d3de;
stroke-width: 4;
}
@@ -540,11 +562,11 @@ svg[data-zoom="16"] path.casing.tag-waterway-river {
}
path.stroke.tag-waterway-ditch {
- stroke: #10539a;
+ stroke: #6591ff;
stroke-width: 1;
}
path.casing.tag-waterway-ditch {
- stroke: #999692;
+ stroke: #6591ff;
stroke-width: 3;
}
@@ -573,17 +595,22 @@ path.casing.tag-boundary {
path.casing.tag-boundary-protected_area,
path.casing.tag-boundary-national_park {
- stroke: #4D9849;
+ stroke: #b0e298;
}
text {
font-size:10px;
pointer-events: none;
+ color: #222;
+ opacity: 1;
}
.oneway .textpath {
pointer-events: none;
+ font-size: 7px;
+ baseline-shift: 2px;
+ opacity: .7;
}
text.tag-oneway {
@@ -611,15 +638,29 @@ text.pathlabel,
text.pointlabel {
font-size: 12px;
font-weight: bold;
- fill: black;
+ fill: #333;
text-anchor: middle;
pointer-events: none;
}
+.layer-halo rect,
+.layer-halo path,
+.layer-label text {
+ -webkit-transition: opacity 100ms linear;
+ transition: opacity 100ms linear;
+ -moz-transition: opacity 100ms linear;
+}
+
.pathlabel .textpath {
dominant-baseline: middle;
}
+/* Opera doesn't support dominant-baseline. See #715 */
+.opera .pathlabel .textpath {
+ baseline-shift: -33%;
+ dominant-baseline: auto;
+}
+
.pointlabel-halo,
.linelabel-halo,
.arealabel-halo {
@@ -628,13 +669,9 @@ text.pointlabel {
}
-text.area.tag-leisure-park {
- font-size: 16px;
-}
-
-text.point.tag-shop,
-text.point.tag-amenity {
- font-size: 9px;
+text.point {
+ font-size: 10px;
+ baseline-shift: 2px;
}
/* Cursors */
@@ -663,9 +700,7 @@ text.point.tag-amenity {
}
.mode-select .area,
-.mode-browse .area,
-.mode-select .multipolygon,
-.mode-browse .multipolygon {
+.mode-browse .area {
cursor: url(../img/cursor-select-area.png), pointer;
}
@@ -678,7 +713,6 @@ text.point.tag-amenity {
.vertex:active,
.line:active,
.area:active,
-.multipolygon:active,
.midpoint:active,
.mode-select .selected {
cursor: url(../img/cursor-select-acting.png), pointer;
@@ -694,14 +728,16 @@ text.point.tag-amenity {
.mode-draw-line .behavior-hover .way,
.mode-draw-area .behavior-hover .way,
.mode-add-line .behavior-hover .way,
-.mode-add-area .behavior-hover .way {
+.mode-add-area .behavior-hover .way,
+.behavior-drag-node.behavior-hover .way {
cursor:url(../img/cursor-draw-connect-line.png) 9 9, auto;
}
.mode-draw-line .behavior-hover .vertex,
.mode-draw-area .behavior-hover .vertex,
.mode-add-line .behavior-hover .vertex,
-.mode-add-area .behavior-hover .vertex {
+.mode-add-area .behavior-hover .vertex,
+.behavior-drag-node.behavior-hover .vertex {
cursor:url(../img/cursor-draw-connect-vertex.png) 9 9, auto;
}
@@ -712,16 +748,19 @@ text.point.tag-amenity {
/* Modes */
.mode-draw-line .vertex.active,
-.mode-draw-area .vertex.active {
+.mode-draw-area .vertex.active,
+.behavior-drag-node .vertex.active {
display: none;
}
.mode-draw-line .way.active,
-.mode-draw-area .way.active {
+.mode-draw-area .way.active,
+.behavior-drag-node .active {
pointer-events: none;
}
/* Ensure drawing doesn't interact with area fills. */
+.mode-add-point .area,
.mode-draw-line .area,
.mode-draw-area .area,
.mode-add-line .area,
diff --git a/data/data.js b/data/data.js
new file mode 100644
index 000000000..279b1ea86
--- /dev/null
+++ b/data/data.js
@@ -0,0 +1 @@
+iD.data = {};
diff --git a/data/deprecated.js b/data/deprecated.js
new file mode 100644
index 000000000..53457c9f3
--- /dev/null
+++ b/data/deprecated.js
@@ -0,0 +1,112 @@
+// from http://wiki.openstreetmap.org/wiki/Deprecated_features
+// TODO: deal with deprecated 'class' tag
+// does not deal with landuse=wood because of indecision
+// we will not care about http://taginfo.openstreetmap.org/tags/bicycle_parking=sheffield
+iD.data.deprecated = [
+ {
+ old: { barrier: 'wire_fence' },
+ replace: {
+ barrier: 'fence',
+ fence_type: 'chain'
+ }
+ },
+ {
+ old: { barrier: 'wood_fence' },
+ replace: {
+ barrier: 'fence',
+ fence_type: 'wood'
+ }
+ },
+ {
+ old: { highway: 'ford' },
+ replace: {
+ ford: 'yes'
+ }
+ },
+ {
+ old: { highway: 'ford' },
+ replace: {
+ ford: 'yes'
+ }
+ },
+ {
+ old: { highway: 'ford' },
+ replace: {
+ ford: 'yes'
+ }
+ },
+ {
+ old: { highway: 'stile' },
+ replace: {
+ barrier: 'stile'
+ }
+ },
+ {
+ old: { highway: 'incline' },
+ replace: {
+ highway: 'road',
+ incline: 'up'
+ }
+ },
+ {
+ old: { highway: 'incline_steep' },
+ replace: {
+ highway: 'road',
+ incline: 'up'
+ }
+ },
+ {
+ old: { highway: 'unsurfaced' },
+ replace: {
+ highway: 'road',
+ incline: 'unpaved'
+ }
+ },
+ {
+ old: { highway: 'unsurfaced' },
+ replace: {
+ highway: 'road',
+ incline: 'unpaved'
+ }
+ },
+ {
+ old: { landuse: 'wood' },
+ replace: {
+ highway: 'road',
+ incline: 'unpaved'
+ }
+ },
+ {
+ old: { natural: 'marsh' },
+ replace: {
+ natural: 'wetland',
+ wetland: 'marsh'
+ }
+ },
+ {
+ old: { shop: 'organic' },
+ replace: {
+ shop: 'supermarket',
+ organic: 'only'
+ }
+ },
+ {
+ old: { power_source: '*' },
+ replace: {
+ 'generator:source': '$1'
+ }
+ },
+ {
+ old: { power_rating: '*' },
+ replace: {
+ 'generator:output': '$1'
+ }
+ },
+ {
+ old: { bicycle_parking: 'organic' },
+ replace: {
+ shop: 'supermarket',
+ organic: 'only'
+ }
+ }
+];
diff --git a/data/discarded.js b/data/discarded.js
new file mode 100644
index 000000000..7a1e4580e
--- /dev/null
+++ b/data/discarded.js
@@ -0,0 +1,10 @@
+// entirely discarded tags
+iD.data.discarded = [
+ 'tiger:upload_uuid',
+ 'tiger:tlid',
+ 'tiger:source',
+ 'tiger:separated',
+ 'geobase:datasetName',
+ 'geobase:uuid',
+ 'sub_sea:type'
+];
diff --git a/data/imagery.js b/data/imagery.js
new file mode 100644
index 000000000..5cda27b95
--- /dev/null
+++ b/data/imagery.js
@@ -0,0 +1,609 @@
+iD.data.imagery = [
+ {
+ "name": "Bing aerial imagery",
+ "template": "http://ecn.t{t}.tiles.virtualearth.net/tiles/a{u}.jpeg?g=587&mkt=en-gb&n=z",
+ "description": "Satellite imagery.",
+ "scaleExtent": [
+ 0,
+ 20
+ ],
+ "subdomains": [
+ "0",
+ "1",
+ "2",
+ "3"
+ ],
+ "default": "yes",
+ "sourcetag": "Bing",
+ "logo": "bing_maps.png",
+ "logo_url": "http://www.bing.com/maps",
+ "terms_url": "http://opengeodata.org/microsoft-imagery-details"
+ },
+ {
+ "name": "MapBox Satellite",
+ "template": "http://{t}.tiles.mapbox.com/v3/openstreetmap.map-4wvf9l0l/{z}/{x}/{y}.png",
+ "description": "Satellite and aerial imagery",
+ "scaleExtent": [
+ 0,
+ 16
+ ],
+ "subdomains": [
+ "a",
+ "b",
+ "c"
+ ],
+ "terms_url": "http://mapbox.com/tos/"
+ },
+ {
+ "name": "OpenStreetMap",
+ "template": "http://{t}.tile.openstreetmap.org/{z}/{x}/{y}.png",
+ "description": "The default OpenStreetMap layer.",
+ "scaleExtent": [
+ 0,
+ 18
+ ],
+ "subdomains": [
+ "a",
+ "b",
+ "c"
+ ]
+ },
+ {
+ "name": " TIGER 2012 Roads Overlay",
+ "template": "http://{t}.tile.openstreetmap.us/tiger2012_roads_expanded/{z}/{x}/{y}.png",
+ "subdomains": [
+ "a",
+ "b",
+ "c"
+ ],
+ "extent": [
+ [
+ -124.81,
+ 24.055
+ ],
+ [
+ -66.865,
+ 49.386
+ ]
+ ]
+ },
+ {
+ "name": " TIGER 2012 Roads Overlay",
+ "template": "http://{t}.tile.openstreetmap.us/tiger2012_roads_expanded/{z}/{x}/{y}.png",
+ "subdomains": [
+ "a",
+ "b",
+ "c"
+ ],
+ "extent": [
+ [
+ -179.754,
+ 50.858
+ ],
+ [
+ -129.899,
+ 71.463
+ ]
+ ]
+ },
+ {
+ "name": " TIGER 2012 Roads Overlay",
+ "template": "http://{t}.tile.openstreetmap.us/tiger2012_roads_expanded/{z}/{x}/{y}.png",
+ "subdomains": [
+ "a",
+ "b",
+ "c"
+ ],
+ "extent": [
+ [
+ -174.46,
+ 18.702
+ ],
+ [
+ -154.516,
+ 26.501
+ ]
+ ]
+ },
+ {
+ "name": " USGS Topographic Maps",
+ "template": "http://{t}.tile.openstreetmap.us/usgs_scanned_topos/{z}/{x}/{y}.png",
+ "subdomains": [
+ "a",
+ "b",
+ "c"
+ ],
+ "extent": [
+ [
+ -125.991,
+ 24.005
+ ],
+ [
+ -65.988,
+ 50.009
+ ]
+ ]
+ },
+ {
+ "name": " USGS Topographic Maps",
+ "template": "http://{t}.tile.openstreetmap.us/usgs_scanned_topos/{z}/{x}/{y}.png",
+ "subdomains": [
+ "a",
+ "b",
+ "c"
+ ],
+ "extent": [
+ [
+ -160.579,
+ 18.902
+ ],
+ [
+ -154.793,
+ 22.508
+ ]
+ ]
+ },
+ {
+ "name": " USGS Topographic Maps",
+ "template": "http://{t}.tile.openstreetmap.us/usgs_scanned_topos/{z}/{x}/{y}.png",
+ "subdomains": [
+ "a",
+ "b",
+ "c"
+ ],
+ "extent": [
+ [
+ -178.001,
+ 51.255
+ ],
+ [
+ -130.004,
+ 71.999
+ ]
+ ]
+ },
+ {
+ "name": " USGS Large Scale Aerial Imagery",
+ "template": "http://{t}.tile.openstreetmap.us/usgs_large_scale/{z}/{x}/{y}.jpg",
+ "subdomains": [
+ "a",
+ "b",
+ "c"
+ ],
+ "extent": [
+ [
+ -124.819,
+ 24.496
+ ],
+ [
+ -66.931,
+ 49.443
+ ]
+ ]
+ },
+ {
+ "name": "British Columbia bc_mosaic",
+ "template": "http://{t}.imagery.paulnorman.ca/tiles/bc_mosaic/{z}/{x}/{y}.png",
+ "subdomains": [
+ "a",
+ "b",
+ "c",
+ "d"
+ ],
+ "extent": [
+ [
+ -123.441,
+ 48.995
+ ],
+ [
+ -121.346,
+ 50.426
+ ]
+ ],
+ "sourcetag": "bc_mosaic",
+ "terms_url": "http://imagery.paulnorman.ca/tiles/about.html"
+ },
+ {
+ "name": "OS OpenData Streetview",
+ "template": "http://os.openstreetmap.org/sv/{z}/{x}/{y}.png",
+ "extent": [
+ [
+ -8.72,
+ 49.86
+ ],
+ [
+ 1.84,
+ 60.92
+ ]
+ ],
+ "sourcetag": "OS_OpenData_StreetView"
+ },
+ {
+ "name": "OS OpenData Locator",
+ "template": "http://tiles.itoworld.com/os_locator/{z}/{x}/{y}.png",
+ "extent": [
+ [
+ -9,
+ 49.8
+ ],
+ [
+ 1.9,
+ 61.1
+ ]
+ ],
+ "sourcetag": "OS_OpenData_Locator"
+ },
+ {
+ "name": "OS 1:25k historic (OSM)",
+ "template": "http://ooc.openstreetmap.org/os1/{z}/{x}/{y}.jpg",
+ "extent": [
+ [
+ -9,
+ 49.8
+ ],
+ [
+ 1.9,
+ 61.1
+ ]
+ ],
+ "sourcetag": "OS 1:25k"
+ },
+ {
+ "name": "OS 1:25k historic (NLS)",
+ "template": "http://geo.nls.uk/mapdata2/os/25000/{z}/{x}/{y}.png",
+ "extent": [
+ [
+ -9,
+ 49.8
+ ],
+ [
+ 1.9,
+ 61.1
+ ]
+ ],
+ "sourcetag": "OS 1:25k",
+ "logo": "icons/logo_nls70-nq8.png",
+ "logo_url": "http://geo.nls.uk/maps/"
+ },
+ {
+ "name": "OS 7th Series historic (OSM)",
+ "template": "http://ooc.openstreetmap.org/os7/{z}/{x}/{y}.jpg",
+ "extent": [
+ [
+ -9,
+ 49.8
+ ],
+ [
+ 1.9,
+ 61.1
+ ]
+ ],
+ "sourcetag": "OS7"
+ },
+ {
+ "name": "OS 7th Series historic (NLS)",
+ "template": "http://geo.nls.uk/mapdata2/os/seventh/{z}/{x}/{y}.png",
+ "extent": [
+ [
+ -9,
+ 49.8
+ ],
+ [
+ 1.9,
+ 61.1
+ ]
+ ],
+ "sourcetag": "OS7",
+ "logo": "icons/logo_nls70-nq8.png",
+ "logo_url": "http://geo.nls.uk/maps/"
+ },
+ {
+ "name": "OS New Popular Edition historic",
+ "template": "http://ooc.openstreetmap.org/npe/{z}/{x}/{y}.png",
+ "extent": [
+ [
+ -5.8,
+ 49.8
+ ],
+ [
+ 1.9,
+ 55.8
+ ]
+ ],
+ "sourcetag": "NPE"
+ },
+ {
+ "name": "OS Scottish Popular historic",
+ "template": "http://ooc.openstreetmap.org/npescotland/tiles/{z}/{x}/{y}.jpg",
+ "extent": [
+ [
+ -7.8,
+ 54.5
+ ],
+ [
+ -1.1,
+ 61.1
+ ]
+ ],
+ "sourcetag": "NPE"
+ },
+ {
+ "name": "Surrey aerial",
+ "template": "http://gravitystorm.dev.openstreetmap.org/surrey/{z}/{x}/{y}.png",
+ "extent": [
+ [
+ -0.856,
+ 51.071
+ ],
+ [
+ 0.062,
+ 51.473
+ ]
+ ],
+ "sourcetag": "Surrey aerial"
+ },
+ {
+ "name": "Haiti - GeoEye Jan 13",
+ "template": "http://gravitystorm.dev.openstreetmap.org/imagery/haiti/{z}/{x}/{y}.jpg",
+ "extent": [
+ [
+ -74.5,
+ 17.95
+ ],
+ [
+ -71.58,
+ 20.12
+ ]
+ ],
+ "sourcetag": "Haiti GeoEye"
+ },
+ {
+ "name": "Haiti - GeoEye Jan 13+",
+ "template": "http://maps.nypl.org/tilecache/1/geoeye/{z}/{x}/{y}.jpg",
+ "extent": [
+ [
+ -74.5,
+ 17.95
+ ],
+ [
+ -71.58,
+ 20.12
+ ]
+ ],
+ "sourcetag": "Haiti GeoEye"
+ },
+ {
+ "name": "Haiti - DigitalGlobe",
+ "template": "http://maps.nypl.org/tilecache/1/dg_crisis/{z}/{x}/{y}.jpg",
+ "extent": [
+ [
+ -74.5,
+ 17.95
+ ],
+ [
+ -71.58,
+ 20.12
+ ]
+ ],
+ "sourcetag": "Haiti DigitalGlobe"
+ },
+ {
+ "name": "Haiti - Street names",
+ "template": "http://hypercube.telascience.org/tiles/1.0.0/haiti-city/{z}/{x}/{y}.jpg",
+ "extent": [
+ [
+ -74.5,
+ 17.95
+ ],
+ [
+ -71.58,
+ 20.12
+ ]
+ ],
+ "sourcetag": "Haiti streetnames"
+ },
+ {
+ "name": "NAIP",
+ "template": "http://cube.telascience.org/tilecache/tilecache.py/NAIP_ALL/{z}/{x}/{y}.png",
+ "description": "National Agriculture Imagery Program",
+ "extent": [
+ [
+ -125.8,
+ 24.2
+ ],
+ [
+ -62.3,
+ 49.5
+ ]
+ ],
+ "sourcetag": "NAIP"
+ },
+ {
+ "name": "NAIP",
+ "template": "http://cube.telascience.org/tilecache/tilecache.py/NAIP_ALL/{z}/{x}/{y}.png",
+ "description": "National Agriculture Imagery Program",
+ "extent": [
+ [
+ -168.5,
+ 55.3
+ ],
+ [
+ -140,
+ 71.5
+ ]
+ ],
+ "sourcetag": "NAIP"
+ },
+ {
+ "name": "Ireland - NLS Historic Maps",
+ "template": "http://geo.nls.uk/maps/ireland/gsgs4136/{z}/{x}/{y}.png",
+ "extent": [
+ [
+ -10.71,
+ 51.32
+ ],
+ [
+ -5.37,
+ 55.46
+ ]
+ ],
+ "sourcetag": "NLS Historic Maps",
+ "logo": "icons/logo_nls70-nq8.png",
+ "logo_url": "http://geo.nls.uk/maps/"
+ },
+ {
+ "name": "Denmark - Fugro Aerial Imagery",
+ "template": "http://tile.openstreetmap.dk/fugro2005/{z}/{x}/{y}.jpg",
+ "extent": [
+ [
+ 7.81,
+ 54.44
+ ],
+ [
+ 15.49,
+ 57.86
+ ]
+ ],
+ "sourcetag": "Fugro (2005)"
+ },
+ {
+ "name": "Denmark - Stevns Kommune",
+ "template": "http://tile.openstreetmap.dk/stevns/2009/{z}/{x}/{y}.jpg",
+ "extent": [
+ [
+ 12.09144,
+ 55.23403
+ ],
+ [
+ 12.47712,
+ 55.43647
+ ]
+ ],
+ "sourcetag": "Stevns Kommune (2009)"
+ },
+ {
+ "name": "Austria - geoimage.at",
+ "template": "http://geoimage.openstreetmap.at/4d80de696cd562a63ce463a58a61488d/{z}/{x}/{y}.jpg",
+ "extent": [
+ [
+ 9.36,
+ 46.33
+ ],
+ [
+ 17.28,
+ 49.09
+ ]
+ ],
+ "sourcetag": "geoimage.at"
+ },
+ {
+ "name": "Russia - Kosmosnimki.ru IRS Satellite",
+ "template": "http://irs.gis-lab.info/?layers=irs&request=GetTile&z={z}&x={x}&y={y}",
+ "extent": [
+ [
+ 19.02,
+ 40.96
+ ],
+ [
+ 77.34,
+ 70.48
+ ]
+ ],
+ "sourcetag": "Kosmosnimki.ru IRS"
+ },
+ {
+ "name": "Belarus - Kosmosnimki.ru SPOT4 Satellite",
+ "template": "http://irs.gis-lab.info/?layers=spot&request=GetTile&z={z}&x={x}&y={y}",
+ "extent": [
+ [
+ 23.16,
+ 51.25
+ ],
+ [
+ 32.83,
+ 56.19
+ ]
+ ],
+ "sourcetag": "Kosmosnimki.ru SPOT4"
+ },
+ {
+ "name": "Australia - Geographic Reference Image",
+ "template": "http://agri.openstreetmap.org/{z}/{x}/{y}.png",
+ "extent": [
+ [
+ 96,
+ -44
+ ],
+ [
+ 168,
+ -9
+ ]
+ ],
+ "sourcetag": "AGRI"
+ },
+ {
+ "name": "Switzerland - Canton Aargau - AGIS 25cm 2011",
+ "template": "http://tiles.poole.ch/AGIS/OF2011/{z}/{x}/{y}.png",
+ "extent": [
+ [
+ 7.69,
+ 47.13
+ ],
+ [
+ 8.48,
+ 47.63
+ ]
+ ],
+ "sourcetag": "AGIS OF2011"
+ },
+ {
+ "name": "Switzerland - Canton Solothurn - SOGIS 2007",
+ "template": "http://mapproxy.sosm.ch:8080/tiles/sogis2007/EPSG900913/{z}/{x}/{y}.png?origin=nw",
+ "extent": [
+ [
+ 7.33,
+ 47.06
+ ],
+ [
+ 8.04,
+ 47.5
+ ]
+ ],
+ "sourcetag": "Orthofoto 2007 WMS Solothurn"
+ },
+ {
+ "name": "Poland - Media-Lab fleet GPS masstracks",
+ "template": "http://masstracks.media-lab.com.pl/{z}/{x}/{y}.png",
+ "extent": [
+ [
+ 14,
+ 48.9
+ ],
+ [
+ 24.2,
+ 55
+ ]
+ ],
+ "sourcetag": "masstracks"
+ },
+ {
+ "name": "South Africa - CD:NGI Aerial",
+ "template": "http://{t}.aerial.openstreetmap.org.za/ngi-aerial/{z}/{x}/{y}.jpg",
+ "subdomains": [
+ "a",
+ "b",
+ "c"
+ ],
+ "extent": [
+ [
+ 17.64,
+ -34.95
+ ],
+ [
+ 32.87,
+ -22.05
+ ]
+ ],
+ "sourcetag": "ngi-aerial"
+ }
+];
\ No newline at end of file
diff --git a/data/imagery.json b/data/imagery.json
new file mode 100644
index 000000000..9cf657886
--- /dev/null
+++ b/data/imagery.json
@@ -0,0 +1,609 @@
+[
+ {
+ "name": "Bing aerial imagery",
+ "template": "http://ecn.t{t}.tiles.virtualearth.net/tiles/a{u}.jpeg?g=587&mkt=en-gb&n=z",
+ "description": "Satellite imagery.",
+ "scaleExtent": [
+ 0,
+ 20
+ ],
+ "subdomains": [
+ "0",
+ "1",
+ "2",
+ "3"
+ ],
+ "default": "yes",
+ "sourcetag": "Bing",
+ "logo": "bing_maps.png",
+ "logo_url": "http://www.bing.com/maps",
+ "terms_url": "http://opengeodata.org/microsoft-imagery-details"
+ },
+ {
+ "name": "MapBox Satellite",
+ "template": "http://{t}.tiles.mapbox.com/v3/openstreetmap.map-4wvf9l0l/{z}/{x}/{y}.png",
+ "description": "Satellite and aerial imagery",
+ "scaleExtent": [
+ 0,
+ 16
+ ],
+ "subdomains": [
+ "a",
+ "b",
+ "c"
+ ],
+ "terms_url": "http://mapbox.com/tos/"
+ },
+ {
+ "name": "OpenStreetMap",
+ "template": "http://{t}.tile.openstreetmap.org/{z}/{x}/{y}.png",
+ "description": "The default OpenStreetMap layer.",
+ "scaleExtent": [
+ 0,
+ 18
+ ],
+ "subdomains": [
+ "a",
+ "b",
+ "c"
+ ]
+ },
+ {
+ "name": " TIGER 2012 Roads Overlay",
+ "template": "http://{t}.tile.openstreetmap.us/tiger2012_roads_expanded/{z}/{x}/{y}.png",
+ "subdomains": [
+ "a",
+ "b",
+ "c"
+ ],
+ "extent": [
+ [
+ -124.81,
+ 24.055
+ ],
+ [
+ -66.865,
+ 49.386
+ ]
+ ]
+ },
+ {
+ "name": " TIGER 2012 Roads Overlay",
+ "template": "http://{t}.tile.openstreetmap.us/tiger2012_roads_expanded/{z}/{x}/{y}.png",
+ "subdomains": [
+ "a",
+ "b",
+ "c"
+ ],
+ "extent": [
+ [
+ -179.754,
+ 50.858
+ ],
+ [
+ -129.899,
+ 71.463
+ ]
+ ]
+ },
+ {
+ "name": " TIGER 2012 Roads Overlay",
+ "template": "http://{t}.tile.openstreetmap.us/tiger2012_roads_expanded/{z}/{x}/{y}.png",
+ "subdomains": [
+ "a",
+ "b",
+ "c"
+ ],
+ "extent": [
+ [
+ -174.46,
+ 18.702
+ ],
+ [
+ -154.516,
+ 26.501
+ ]
+ ]
+ },
+ {
+ "name": " USGS Topographic Maps",
+ "template": "http://{t}.tile.openstreetmap.us/usgs_scanned_topos/{z}/{x}/{y}.png",
+ "subdomains": [
+ "a",
+ "b",
+ "c"
+ ],
+ "extent": [
+ [
+ -125.991,
+ 24.005
+ ],
+ [
+ -65.988,
+ 50.009
+ ]
+ ]
+ },
+ {
+ "name": " USGS Topographic Maps",
+ "template": "http://{t}.tile.openstreetmap.us/usgs_scanned_topos/{z}/{x}/{y}.png",
+ "subdomains": [
+ "a",
+ "b",
+ "c"
+ ],
+ "extent": [
+ [
+ -160.579,
+ 18.902
+ ],
+ [
+ -154.793,
+ 22.508
+ ]
+ ]
+ },
+ {
+ "name": " USGS Topographic Maps",
+ "template": "http://{t}.tile.openstreetmap.us/usgs_scanned_topos/{z}/{x}/{y}.png",
+ "subdomains": [
+ "a",
+ "b",
+ "c"
+ ],
+ "extent": [
+ [
+ -178.001,
+ 51.255
+ ],
+ [
+ -130.004,
+ 71.999
+ ]
+ ]
+ },
+ {
+ "name": " USGS Large Scale Aerial Imagery",
+ "template": "http://{t}.tile.openstreetmap.us/usgs_large_scale/{z}/{x}/{y}.jpg",
+ "subdomains": [
+ "a",
+ "b",
+ "c"
+ ],
+ "extent": [
+ [
+ -124.819,
+ 24.496
+ ],
+ [
+ -66.931,
+ 49.443
+ ]
+ ]
+ },
+ {
+ "name": "British Columbia bc_mosaic",
+ "template": "http://{t}.imagery.paulnorman.ca/tiles/bc_mosaic/{z}/{x}/{y}.png",
+ "subdomains": [
+ "a",
+ "b",
+ "c",
+ "d"
+ ],
+ "extent": [
+ [
+ -123.441,
+ 48.995
+ ],
+ [
+ -121.346,
+ 50.426
+ ]
+ ],
+ "sourcetag": "bc_mosaic",
+ "terms_url": "http://imagery.paulnorman.ca/tiles/about.html"
+ },
+ {
+ "name": "OS OpenData Streetview",
+ "template": "http://os.openstreetmap.org/sv/{z}/{x}/{y}.png",
+ "extent": [
+ [
+ -8.72,
+ 49.86
+ ],
+ [
+ 1.84,
+ 60.92
+ ]
+ ],
+ "sourcetag": "OS_OpenData_StreetView"
+ },
+ {
+ "name": "OS OpenData Locator",
+ "template": "http://tiles.itoworld.com/os_locator/{z}/{x}/{y}.png",
+ "extent": [
+ [
+ -9,
+ 49.8
+ ],
+ [
+ 1.9,
+ 61.1
+ ]
+ ],
+ "sourcetag": "OS_OpenData_Locator"
+ },
+ {
+ "name": "OS 1:25k historic (OSM)",
+ "template": "http://ooc.openstreetmap.org/os1/{z}/{x}/{y}.jpg",
+ "extent": [
+ [
+ -9,
+ 49.8
+ ],
+ [
+ 1.9,
+ 61.1
+ ]
+ ],
+ "sourcetag": "OS 1:25k"
+ },
+ {
+ "name": "OS 1:25k historic (NLS)",
+ "template": "http://geo.nls.uk/mapdata2/os/25000/{z}/{x}/{y}.png",
+ "extent": [
+ [
+ -9,
+ 49.8
+ ],
+ [
+ 1.9,
+ 61.1
+ ]
+ ],
+ "sourcetag": "OS 1:25k",
+ "logo": "icons/logo_nls70-nq8.png",
+ "logo_url": "http://geo.nls.uk/maps/"
+ },
+ {
+ "name": "OS 7th Series historic (OSM)",
+ "template": "http://ooc.openstreetmap.org/os7/{z}/{x}/{y}.jpg",
+ "extent": [
+ [
+ -9,
+ 49.8
+ ],
+ [
+ 1.9,
+ 61.1
+ ]
+ ],
+ "sourcetag": "OS7"
+ },
+ {
+ "name": "OS 7th Series historic (NLS)",
+ "template": "http://geo.nls.uk/mapdata2/os/seventh/{z}/{x}/{y}.png",
+ "extent": [
+ [
+ -9,
+ 49.8
+ ],
+ [
+ 1.9,
+ 61.1
+ ]
+ ],
+ "sourcetag": "OS7",
+ "logo": "icons/logo_nls70-nq8.png",
+ "logo_url": "http://geo.nls.uk/maps/"
+ },
+ {
+ "name": "OS New Popular Edition historic",
+ "template": "http://ooc.openstreetmap.org/npe/{z}/{x}/{y}.png",
+ "extent": [
+ [
+ -5.8,
+ 49.8
+ ],
+ [
+ 1.9,
+ 55.8
+ ]
+ ],
+ "sourcetag": "NPE"
+ },
+ {
+ "name": "OS Scottish Popular historic",
+ "template": "http://ooc.openstreetmap.org/npescotland/tiles/{z}/{x}/{y}.jpg",
+ "extent": [
+ [
+ -7.8,
+ 54.5
+ ],
+ [
+ -1.1,
+ 61.1
+ ]
+ ],
+ "sourcetag": "NPE"
+ },
+ {
+ "name": "Surrey aerial",
+ "template": "http://gravitystorm.dev.openstreetmap.org/surrey/{z}/{x}/{y}.png",
+ "extent": [
+ [
+ -0.856,
+ 51.071
+ ],
+ [
+ 0.062,
+ 51.473
+ ]
+ ],
+ "sourcetag": "Surrey aerial"
+ },
+ {
+ "name": "Haiti - GeoEye Jan 13",
+ "template": "http://gravitystorm.dev.openstreetmap.org/imagery/haiti/{z}/{x}/{y}.jpg",
+ "extent": [
+ [
+ -74.5,
+ 17.95
+ ],
+ [
+ -71.58,
+ 20.12
+ ]
+ ],
+ "sourcetag": "Haiti GeoEye"
+ },
+ {
+ "name": "Haiti - GeoEye Jan 13+",
+ "template": "http://maps.nypl.org/tilecache/1/geoeye/{z}/{x}/{y}.jpg",
+ "extent": [
+ [
+ -74.5,
+ 17.95
+ ],
+ [
+ -71.58,
+ 20.12
+ ]
+ ],
+ "sourcetag": "Haiti GeoEye"
+ },
+ {
+ "name": "Haiti - DigitalGlobe",
+ "template": "http://maps.nypl.org/tilecache/1/dg_crisis/{z}/{x}/{y}.jpg",
+ "extent": [
+ [
+ -74.5,
+ 17.95
+ ],
+ [
+ -71.58,
+ 20.12
+ ]
+ ],
+ "sourcetag": "Haiti DigitalGlobe"
+ },
+ {
+ "name": "Haiti - Street names",
+ "template": "http://hypercube.telascience.org/tiles/1.0.0/haiti-city/{z}/{x}/{y}.jpg",
+ "extent": [
+ [
+ -74.5,
+ 17.95
+ ],
+ [
+ -71.58,
+ 20.12
+ ]
+ ],
+ "sourcetag": "Haiti streetnames"
+ },
+ {
+ "name": "NAIP",
+ "template": "http://cube.telascience.org/tilecache/tilecache.py/NAIP_ALL/{z}/{x}/{y}.png",
+ "description": "National Agriculture Imagery Program",
+ "extent": [
+ [
+ -125.8,
+ 24.2
+ ],
+ [
+ -62.3,
+ 49.5
+ ]
+ ],
+ "sourcetag": "NAIP"
+ },
+ {
+ "name": "NAIP",
+ "template": "http://cube.telascience.org/tilecache/tilecache.py/NAIP_ALL/{z}/{x}/{y}.png",
+ "description": "National Agriculture Imagery Program",
+ "extent": [
+ [
+ -168.5,
+ 55.3
+ ],
+ [
+ -140,
+ 71.5
+ ]
+ ],
+ "sourcetag": "NAIP"
+ },
+ {
+ "name": "Ireland - NLS Historic Maps",
+ "template": "http://geo.nls.uk/maps/ireland/gsgs4136/{z}/{x}/{y}.png",
+ "extent": [
+ [
+ -10.71,
+ 51.32
+ ],
+ [
+ -5.37,
+ 55.46
+ ]
+ ],
+ "sourcetag": "NLS Historic Maps",
+ "logo": "icons/logo_nls70-nq8.png",
+ "logo_url": "http://geo.nls.uk/maps/"
+ },
+ {
+ "name": "Denmark - Fugro Aerial Imagery",
+ "template": "http://tile.openstreetmap.dk/fugro2005/{z}/{x}/{y}.jpg",
+ "extent": [
+ [
+ 7.81,
+ 54.44
+ ],
+ [
+ 15.49,
+ 57.86
+ ]
+ ],
+ "sourcetag": "Fugro (2005)"
+ },
+ {
+ "name": "Denmark - Stevns Kommune",
+ "template": "http://tile.openstreetmap.dk/stevns/2009/{z}/{x}/{y}.jpg",
+ "extent": [
+ [
+ 12.09144,
+ 55.23403
+ ],
+ [
+ 12.47712,
+ 55.43647
+ ]
+ ],
+ "sourcetag": "Stevns Kommune (2009)"
+ },
+ {
+ "name": "Austria - geoimage.at",
+ "template": "http://geoimage.openstreetmap.at/4d80de696cd562a63ce463a58a61488d/{z}/{x}/{y}.jpg",
+ "extent": [
+ [
+ 9.36,
+ 46.33
+ ],
+ [
+ 17.28,
+ 49.09
+ ]
+ ],
+ "sourcetag": "geoimage.at"
+ },
+ {
+ "name": "Russia - Kosmosnimki.ru IRS Satellite",
+ "template": "http://irs.gis-lab.info/?layers=irs&request=GetTile&z={z}&x={x}&y={y}",
+ "extent": [
+ [
+ 19.02,
+ 40.96
+ ],
+ [
+ 77.34,
+ 70.48
+ ]
+ ],
+ "sourcetag": "Kosmosnimki.ru IRS"
+ },
+ {
+ "name": "Belarus - Kosmosnimki.ru SPOT4 Satellite",
+ "template": "http://irs.gis-lab.info/?layers=spot&request=GetTile&z={z}&x={x}&y={y}",
+ "extent": [
+ [
+ 23.16,
+ 51.25
+ ],
+ [
+ 32.83,
+ 56.19
+ ]
+ ],
+ "sourcetag": "Kosmosnimki.ru SPOT4"
+ },
+ {
+ "name": "Australia - Geographic Reference Image",
+ "template": "http://agri.openstreetmap.org/{z}/{x}/{y}.png",
+ "extent": [
+ [
+ 96,
+ -44
+ ],
+ [
+ 168,
+ -9
+ ]
+ ],
+ "sourcetag": "AGRI"
+ },
+ {
+ "name": "Switzerland - Canton Aargau - AGIS 25cm 2011",
+ "template": "http://tiles.poole.ch/AGIS/OF2011/{z}/{x}/{y}.png",
+ "extent": [
+ [
+ 7.69,
+ 47.13
+ ],
+ [
+ 8.48,
+ 47.63
+ ]
+ ],
+ "sourcetag": "AGIS OF2011"
+ },
+ {
+ "name": "Switzerland - Canton Solothurn - SOGIS 2007",
+ "template": "http://mapproxy.sosm.ch:8080/tiles/sogis2007/EPSG900913/{z}/{x}/{y}.png?origin=nw",
+ "extent": [
+ [
+ 7.33,
+ 47.06
+ ],
+ [
+ 8.04,
+ 47.5
+ ]
+ ],
+ "sourcetag": "Orthofoto 2007 WMS Solothurn"
+ },
+ {
+ "name": "Poland - Media-Lab fleet GPS masstracks",
+ "template": "http://masstracks.media-lab.com.pl/{z}/{x}/{y}.png",
+ "extent": [
+ [
+ 14,
+ 48.9
+ ],
+ [
+ 24.2,
+ 55
+ ]
+ ],
+ "sourcetag": "masstracks"
+ },
+ {
+ "name": "South Africa - CD:NGI Aerial",
+ "template": "http://{t}.aerial.openstreetmap.org.za/ngi-aerial/{z}/{x}/{y}.jpg",
+ "subdomains": [
+ "a",
+ "b",
+ "c"
+ ],
+ "extent": [
+ [
+ 17.64,
+ -34.95
+ ],
+ [
+ 32.87,
+ -22.05
+ ]
+ ],
+ "sourcetag": "ngi-aerial"
+ }
+]
\ No newline at end of file
diff --git a/data/imagery.xml b/data/imagery.xml
new file mode 100644
index 000000000..91c52fef0
--- /dev/null
+++ b/data/imagery.xml
@@ -0,0 +1,233 @@
+
+
+
+ Bing aerial imagery
+ http://ecn.t${0|1|2|3}.tiles.virtualearth.net/tiles/a$quadkey.jpeg?g=587&mkt=en-gb&n=z
+ microsoft
+ Bing
+ http://dev.virtualearth.net/REST/v1/Imagery/Metadata/Aerial/0,0?zl=1&mapVersion=v1&key=Arzdiw4nlOJzRwOz__qailc8NiR31Tt51dN2D7cm57NrnceZnCpgOkmJhNpGoppU&include=ImageryProviders&output=xml
+ bing_maps.png
+ http://www.bing.com/maps
+ http://opengeodata.org/microsoft-imagery-details
+ yes
+
+
+ MapBox Satellite
+ http://${a|b|c}.tiles.mapbox.com/v3/openstreetmap.map-4wvf9l0l/$z/$x/$y.png
+ http://mapbox.com/tos/
+
+
+ MapQuest Open Aerial
+ http://oatile1.mqcdn.com/tiles/1.0.0/sat/$z/$x/$y.jpg
+ http://developer.mapquest.com/web/products/open/map#terms
+
+
+ OSM - Mapnik
+ http://${a|b|c}.tile.openstreetmap.org/$z/$x/$y.png
+
+
+ OSM - OpenCycleMap
+ http://tile.opencyclemap.org/cycle/$z/$x/$y.png
+
+
+ OSM - MapQuest
+ http://otile1.mqcdn.com/tiles/1.0.0/osm/$z/$x/$y.jpg
+
+
+ OSM - Tiger Edited Map
+ 900913
+ http://tiger-osm.mapquest.com/tiles/1.0.0/tiger/$z/$x/$y.png
+
+
+ OSM - Tiger Edited Map
+ 900913
+ http://tiger-osm.mapquest.com/tiles/1.0.0/tiger/$z/$x/$y.png
+
+
+ OSM - Tiger Edited Map
+ 900913
+ http://tiger-osm.mapquest.com/tiles/1.0.0/tiger/$z/$x/$y.png
+
+
+ OSM US TIGER 2012 Roads Overlay
+ 900913
+ http://${a|b|c}.tile.openstreetmap.us/tiger2012_roads_expanded/$z/$x/$y.png
+
+
+ OSM US TIGER 2012 Roads Overlay
+ 900913
+ http://${a|b|c}.tile.openstreetmap.us/tiger2012_roads_expanded/$z/$x/$y.png
+
+
+ OSM US TIGER 2012 Roads Overlay
+ 900913
+ http://${a|b|c}.tile.openstreetmap.us/tiger2012_roads_expanded/$z/$x/$y.png
+
+
+ OSM US USGS Topographic Maps
+ 900913
+ http://${a|b|c}.tile.openstreetmap.us/usgs_scanned_topos/$z/$x/$y.png
+
+
+ OSM US USGS Topographic Maps
+ 900913
+ http://${a|b|c}.tile.openstreetmap.us/usgs_scanned_topos/$z/$x/$y.png
+
+
+ OSM US USGS Topographic Maps
+ 900913
+ http://${a|b|c}.tile.openstreetmap.us/usgs_scanned_topos/$z/$x/$y.png
+
+
+ OSM US USGS Large Scale Aerial Imagery
+ 900913
+ http://${a|b|c}.tile.openstreetmap.us/usgs_large_scale/$z/$x/$y.jpg
+
+
+ British Columbia bc_mosaic
+ 900913
+ http://${a|b|c|d}.imagery.paulnorman.ca/tiles/bc_mosaic/$z/$x/$y.png
+ http://imagery.paulnorman.ca/tiles/about.html
+ bc_mosaic
+
+
+ OS OpenData Streetview
+ http://os.openstreetmap.org/sv/$z/$x/$y.png
+ OS_OpenData_StreetView
+
+
+ OS OpenData Locator
+ http://tiles.itoworld.com/os_locator/$z/$x/$y.png
+ OS_OpenData_Locator
+ source:name
+
+
+ OS 1:25k historic (OSM)
+ http://ooc.openstreetmap.org/os1/$z/$x/$y.jpg
+ OS 1:25k
+
+
+ OS 1:25k historic (NLS)
+ tms
+ http://geo.nls.uk/mapdata2/os/25000/$z/$x/$y.png
+ icons/logo_nls70-nq8.png
+ http://geo.nls.uk/maps/
+ OS 1:25k
+
+
+ OS 7th Series historic (OSM)
+ http://ooc.openstreetmap.org/os7/$z/$x/$y.jpg
+ OS7
+
+
+ OS 7th Series historic (NLS)
+ tms
+ http://geo.nls.uk/mapdata2/os/seventh/$z/$x/$y.png
+ icons/logo_nls70-nq8.png
+ http://geo.nls.uk/maps/
+ OS7
+
+
+ OS New Popular Edition historic
+ http://ooc.openstreetmap.org/npe/$z/$x/$y.png
+ NPE
+
+
+ OS Scottish Popular historic
+ http://ooc.openstreetmap.org/npescotland/tiles/$z/$x/$y.jpg
+ NPE
+
+
+ Surrey aerial
+ http://gravitystorm.dev.openstreetmap.org/surrey/$z/$x/$y.png
+ Surrey aerial
+
+
+ Haiti - GeoEye Jan 13
+ http://gravitystorm.dev.openstreetmap.org/imagery/haiti/$z/$x/$y.jpg
+ Haiti GeoEye
+
+
+ Haiti - GeoEye Jan 13+
+ http://maps.nypl.org/tilecache/1/geoeye/$z/$x/$y.jpg
+ Haiti GeoEye
+
+
+ Haiti - DigitalGlobe
+ http://maps.nypl.org/tilecache/1/dg_crisis/$z/$x/$y.jpg
+ Haiti DigitalGlobe
+
+
+ Haiti - Street names
+ http://hypercube.telascience.org/tiles/1.0.0/haiti-city/$z/$x/$y.jpg
+ Haiti streetnames
+
+
+ National Agriculture Imagery Program
+ http://cube.telascience.org/tilecache/tilecache.py/NAIP_ALL/$z/$x/$y.png
+ NAIP
+
+
+ National Agriculture Imagery Program
+ http://cube.telascience.org/tilecache/tilecache.py/NAIP_ALL/$z/$x/$y.png
+ NAIP
+
+
+ Ireland - NLS Historic Maps
+ tms
+ NLS Historic Maps
+ http://geo.nls.uk/maps/ireland/gsgs4136/$z/$x/$y.png
+ icons/logo_nls70-nq8.png
+ http://geo.nls.uk/maps/
+
+
+ Denmark - Fugro Aerial Imagery
+ http://tile.openstreetmap.dk/fugro2005/$z/$x/$y.jpg
+ Fugro (2005)
+
+
+ Denmark - Stevns Kommune
+ http://tile.openstreetmap.dk/stevns/2009/$z/$x/$y.jpg
+ Stevns Kommune (2009)
+
+
+ Austria - geoimage.at
+ http://geoimage.openstreetmap.at/4d80de696cd562a63ce463a58a61488d/$z/$x/$y.jpg
+ geoimage.at
+
+
+ Russia - Kosmosnimki.ru IRS Satellite
+ http://irs.gis-lab.info/?layers=irs&request=GetTile&z=$z&x=$x&y=$y
+ Kosmosnimki.ru IRS
+
+
+ Belarus - Kosmosnimki.ru SPOT4 Satellite
+ http://irs.gis-lab.info/?layers=spot&request=GetTile&z=$z&x=$x&y=$y
+ Kosmosnimki.ru SPOT4
+
+
+ Australia - Geographic Reference Image
+ http://agri.openstreetmap.org/$z/$x/$y.png
+ AGRI
+
+
+ Switzerland - Canton Aargau - AGIS 25cm 2011
+ http://tiles.poole.ch/AGIS/OF2011/$z/$x/$y.png
+ AGIS OF2011
+
+
+ Switzerland - Canton Solothurn - SOGIS 2007
+ http://mapproxy.sosm.ch:8080/tiles/sogis2007/EPSG900913/$z/$x/$y.png?origin=nw
+ Orthofoto 2007 WMS Solothurn
+
+
+ Poland - Media-Lab fleet GPS masstracks
+ http://masstracks.media-lab.com.pl/$z/$x/$y.png
+ masstracks
+
+
+ South Africa - CD:NGI Aerial
+ http://${a|b|c}.aerial.openstreetmap.org.za/ngi-aerial/$z/$x/$y.jpg
+ ngi-aerial
+
+
diff --git a/data/imagery_convert.js b/data/imagery_convert.js
new file mode 100644
index 000000000..abc5cbef6
--- /dev/null
+++ b/data/imagery_convert.js
@@ -0,0 +1,87 @@
+var fs = require('fs'),
+ cheerio = require('cheerio');
+
+$ = cheerio.load(fs.readFileSync('imagery.xml'));
+
+var imagery = [];
+
+// CENSORSHIP! No, these are just layers that essentially duplicate other layers
+// or which have no clear use case.
+var censor = {
+ 'MapQuest Open Aerial': true,
+ 'OSM - OpenCycleMap': true,
+ 'OSM - MapQuest': true
+};
+
+var replace = {
+ 'OSM - Mapnik': 'OpenStreetMap',
+ 'National Agriculture Imagery Program': 'NAIP'
+};
+
+var description = {
+ 'MapBox Satellite': 'Satellite and aerial imagery',
+ 'OpenStreetMap': 'The default OpenStreetMap layer.',
+ 'OSM US TIGER 2012 Roads Overlay': 'Public domain road data from the US Government.',
+ 'Bing aerial imagery': 'Satellite imagery.',
+ 'NAIP': 'National Agriculture Imagery Program'
+};
+
+var scaleExtent = {
+ 'MapBox Satellite': [0, 16],
+ 'OpenStreetMap': [0, 18],
+ 'OSM US TIGER 2012 Roads Overlay': [0, 17],
+ 'Bing aerial imagery': [0, 20]
+};
+
+$('set').each(function(i) {
+ var elem = $(this);
+
+ var im = {
+ name: $(this).find('name').first().text(),
+ template: $(this).find('url').first().text()
+ };
+
+ // no luck with mapquest servers currently...
+ if (im.template.match(/mapquest/g)) return;
+ if (censor[im.name]) return;
+
+ im.name = im.name.replace('OSM US', '');
+
+ if (replace[im.name]) im.name = replace[im.name];
+
+ if (description[im.name]) im.description = description[im.name];
+
+ if (scaleExtent[im.name]) im.scaleExtent = scaleExtent[im.name];
+
+ var subdomains = [];
+
+ im.template = im.template
+ .replace('$quadkey', '{u}')
+ .replace(/\$(\w)/g, function(m) {
+ return '{' + m[1] + '}';
+ })
+ .replace(/\$\{([^}.]+)\}/g, function(m) {
+ subdomains = m.slice(2, m.length - 1).split('|');
+ return '{t}';
+ });
+
+ if (subdomains.length) im.subdomains = subdomains;
+
+ if (elem.attr('minlat')) {
+ im.extent = [
+ [+elem.attr('minlon'),
+ +elem.attr('minlat')],
+ [+elem.attr('maxlon'),
+ +elem.attr('maxlat')]];
+ }
+
+ ['default', 'sourcetag', 'logo', 'logo_url', 'terms_url'].forEach(function(a) {
+ if (elem.find(a).length) {
+ im[a] = elem.find(a).first().text();
+ }
+ });
+ imagery.push(im);
+});
+
+fs.writeFileSync('imagery.json', JSON.stringify(imagery, null, 4));
+fs.writeFileSync('imagery.js', 'iD.data.imagery = ' + JSON.stringify(imagery, null, 4) + ';');
diff --git a/icons/tree.png b/icons/tree.png
index 7575bd63b..d88c945d4 100644
Binary files a/icons/tree.png and b/icons/tree.png differ
diff --git a/icons/unknown.png b/icons/unknown.png
index 404602aa4..03fff0c0e 100644
Binary files a/icons/unknown.png and b/icons/unknown.png differ
diff --git a/img/modes.png b/img/modes.png
new file mode 100644
index 000000000..6b5ec8603
Binary files /dev/null and b/img/modes.png differ
diff --git a/img/operations.png b/img/operations.png
new file mode 100644
index 000000000..c1e516b29
Binary files /dev/null and b/img/operations.png differ
diff --git a/img/source/radial-menu.svg b/img/source/radial-menu.svg
index 7c43c61d8..2fa1e44f9 100644
--- a/img/source/radial-menu.svg
+++ b/img/source/radial-menu.svg
@@ -50,15 +50,15 @@
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
- inkscape:zoom="1"
- inkscape:cx="-252.25018"
- inkscape:cy="571.71412"
+ inkscape:zoom="4"
+ inkscape:cx="53.004316"
+ inkscape:cy="144.37657"
inkscape:document-units="px"
inkscape:current-layer="layer1"
showgrid="false"
- inkscape:window-width="1287"
+ inkscape:window-width="1280"
inkscape:window-height="753"
- inkscape:window-x="159"
+ inkscape:window-x="37"
inkscape:window-y="0"
inkscape:window-maximized="0"
inkscape:snap-bbox="true"
@@ -102,6 +102,14 @@
orientation="0,1"
position="1052,739"
id="guide15758" />
+
+
@@ -111,7 +119,7 @@
image/svg+xml
-
+
@@ -119,6959 +127,17 @@
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1">
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
Split way
+
+
+
+
+
+
+
+
+
+
+
+ Delete
+ Circularize
+ Straighten
+
+ Split
+
+
+
+ Unjoin
+ Reverse
+
+
+
+
+
+
+
+
+ Move
+
+
+
+
+
+
+
+
+
+
+
+ Merge
+ Orthogonalize
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/source/sprite.svg b/img/source/sprite.svg
index 5589fc2d5..a8c29982b 100644
--- a/img/source/sprite.svg
+++ b/img/source/sprite.svg
@@ -9,7 +9,7 @@
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
- width="400"
+ width="420"
height="200"
id="svg12393"
version="1.1"
@@ -39,14 +39,14 @@
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="1"
- inkscape:cx="336.77382"
- inkscape:cy="126.79999"
+ inkscape:cx="304.46947"
+ inkscape:cy="116.03146"
inkscape:document-units="px"
inkscape:current-layer="layer12"
showgrid="false"
inkscape:window-width="1280"
- inkscape:window-height="756"
- inkscape:window-x="119"
+ inkscape:window-height="700"
+ inkscape:window-x="48"
inkscape:window-y="0"
inkscape:window-maximized="0"
fit-margin-top="0"
@@ -56,7 +56,7 @@
showguides="false"
inkscape:guide-bbox="true"
inkscape:snap-bbox="true"
- inkscape:snap-nodes="true">
+ inkscape:snap-nodes="false">
+
@@ -181,7 +185,7 @@
image/svg+xml
-
+
@@ -190,11 +194,69 @@
inkscape:groupmode="layer"
id="layer1"
transform="translate(-25,-62.362183)"
- style="display:inline">
+ style="display:none">
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ style="display:inline;fill:#1a1a1a;fill-opacity:1"
+ transform="translate(505,-653.36218)">
+ style="display:inline;color:#000000;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;overflow:visible;enable-background:accumulate" />
-
-
-
-
-
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+ style="opacity:0.50000000000000000;color:#000000;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
-
-
+ style="opacity:0.50000000000000000;fill:#000000;fill-opacity:1;display:inline">
+ style="opacity:0.50000000000000000;fill:#000000;fill-opacity:1;display:inline">
-
@@ -826,9 +790,9 @@
inkscape:connector-curvature="0"
id="path58971"
d="m 35,44 c 0,1 0,4 0,4 0,0 0,0.5 -0.5,0.5 -0.5,0 -0.429283,-0.27516 -0.5,-0.5 -0.304688,-0.96875 -0.867187,-2.36459 -1,-3 -0.204595,-0.97885 -0.666667,-1 -1,-1 -1,0 -1,1 -1,1 l 1,4 0,3 C 32,52 31.5,51.5 30.5,50.5 29.945312,49.94531 29.257659,49.7508 28.8125,50.00781 28.377049,50.25922 28.150942,50.89541 28.5,51.5 28.853553,52.11237 32,56 32,56 c 1,1 2,1 4,1 2.666667,0 1,0 3,0 2,0 2.288488,-2.86546 3,-5 1,-3 1.5,-5 1.5,-5 0.113427,-0.42332 -0.04289,-0.846 -0.5,-1 -0.880461,-0.29662 -1.36006,0.35278 -1.5,1 -0.25,1.15625 -0.5,2 -0.5,2 -0.09375,0.31383 0.0013,0.5 -0.5,0.5 C 39.99086,49.5 40,49 40,49 c 0,0 0,-2.66667 0,-4 0,-1 -1,-1 -1,-1 0,0 -1,0 -1,1 0,1 0,1.66667 0,3 0,0 0.01305,0.5 -0.5,0.5 C 36.998673,48.5 37,48 37,48 c 0,0 0,-3 0,-4 0,-1 -1,-1 -1,-1 0,0 -1,0 -1,1 z"
- style="opacity:0.5;color:#000000;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;filter:url(#filter8013-4);enable-background:accumulate" />
+ style="opacity:0.50000000000000000;color:#000000;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;filter:url(#filter8013-4);enable-background:accumulate" />
+ inkscape:connector-curvature="0" />
-
-
+ transform="translate(25,-3.0625001e-6)" />
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/img/sprite.png b/img/sprite.png
index be9ba0fdb..02aadf2a3 100644
Binary files a/img/sprite.png and b/img/sprite.png differ
diff --git a/index.html b/index.html
index b86d188bb..6941ce008 100644
--- a/index.html
+++ b/index.html
@@ -9,8 +9,8 @@
-
-
+
+
@@ -24,7 +24,6 @@
-
@@ -33,20 +32,24 @@
+
+
+
+
+
-
+
-
@@ -54,15 +57,18 @@
+
+
-
+
+
@@ -70,32 +76,46 @@
+
+
+
+
+
+
-
-
-
-
+
+
+
+
+
+
+
+
+
+
-
+
+
-
-
-
+
+
-
+
+
+
@@ -108,35 +128,56 @@
-
+
+
+
+
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
+
+
+