diff --git a/Makefile b/Makefile index 9fd5afb0e..30c179741 100644 --- a/Makefile +++ b/Makefile @@ -30,6 +30,9 @@ all: \ 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 \ @@ -50,9 +53,7 @@ all: \ js/id/validate.js \ js/id/end.js \ locale/locale.js \ - locale/en.js \ - data/data.js \ - data/deprecated.js + locale/en.js iD.js: Makefile @rm -f $@ diff --git a/css/app.css b/css/app.css index a43133f3d..99904d953 100644 --- a/css/app.css +++ b/css/app.css @@ -93,7 +93,6 @@ a:hover { color:#597be7; } - textarea, input[type=text] { background-color: white; @@ -186,6 +185,8 @@ ul.toggle-list li a { border-top: 1px solid white; display:block; border-top: 1px solid rgba(0, 0, 0, .5); + text-wrap:no-wrap; + overflow:hidden; } ul.toggle-list li a:hover { background-color: #ececec;} @@ -687,6 +688,10 @@ a.selected:hover .toggle.icon { background-position: -40px -180px;} top:190px; } +.layerswitcher-control .map-overlay { + width:250px; +} + .nudge-container { margin-top: 10px; } @@ -1393,6 +1398,13 @@ a.success-action { border-radius: 4px; } +.lasso-box { + fill-opacity:0.2; + fill: #bde5aa; + stroke: #000; + stroke-width: 1; +} + /* Media Queries ------------------------------------------------------- */ @@ -1403,10 +1415,6 @@ a.success-action { .save .label, .apply .label, .cancel .label { display: block;} } - - - - div.combobox { width:155px; z-index: 9999; diff --git a/data/imagery.js b/data/imagery.js new file mode 100644 index 000000000..6c232b626 --- /dev/null +++ b/data/imagery.js @@ -0,0 +1,602 @@ +iD.data.imagery = [ + { + "name": "Bing aerial imagery", + "template": "http://ecn.t0.tiles.virtualearth.net/tiles/a{u}.jpeg?g=587&mkt=en-gb&n=z", + "description": "Satellite imagery.", + "scaleExtent": [ + 0, + 20 + ], + "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" + ] + }, + { + "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 index 2055c1cf5..ee9906d31 100644 --- a/data/imagery.json +++ b/data/imagery.json @@ -1,7 +1,13 @@ [ { "name": "Bing aerial imagery", - "url": "http://ecn.t0.tiles.virtualearth.net/tiles/a{q}uadkey.jpeg?g=587&mkt=en-gb&n=z", + "template": "http://ecn.t0.tiles.virtualearth.net/tiles/a{u}.jpeg?g=587&mkt=en-gb&n=z", + "description": "Satellite imagery.", + "scaleExtent": [ + 0, + 20 + ], + "default": "yes", "sourcetag": "Bing", "logo": "bing_maps.png", "logo_url": "http://www.bing.com/maps", @@ -9,7 +15,12 @@ }, { "name": "MapBox Satellite", - "url": "http://{t}.tiles.mapbox.com/v3/openstreetmap.map-4wvf9l0l/{z}/{x}/{y}.png", + "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", @@ -17,12 +28,13 @@ ] }, { - "name": "MapQuest Open Aerial", - "url": "http://oatile1.mqcdn.com/tiles/1.0.0/sat/{z}/{x}/{y}.jpg" - }, - { - "name": "OSM - Mapnik", - "url": "http://{t}.tile.openstreetmap.org/{z}/{x}/{y}.png", + "name": "OpenStreetMap", + "template": "http://{t}.tile.openstreetmap.org/{z}/{x}/{y}.png", + "description": "The default OpenStreetMap layer.", + "scaleExtent": [ + 0, + 18 + ], "subdomains": [ "a", "b", @@ -30,151 +42,141 @@ ] }, { - "name": "OSM - OpenCycleMap", - "url": "http://tile.opencyclemap.org/cycle/{z}/{x}/{y}.png" - }, - { - "name": "OSM - MapQuest", - "url": "http://otile1.mqcdn.com/tiles/1.0.0/osm/{z}/{x}/{y}.jpg" - }, - { - "name": "OSM - Tiger Edited Map", - "url": "http://tiger-osm.mapquest.com/tiles/1.0.0/tiger/{z}/{x}/{y}.png", - "extent": [ - 24.055, - -124.81, - 49.386, - -66.865 - ] - }, - { - "name": "OSM - Tiger Edited Map", - "url": "http://tiger-osm.mapquest.com/tiles/1.0.0/tiger/{z}/{x}/{y}.png", - "extent": [ - 50.858, - -179.754, - 71.463, - -129.899 - ] - }, - { - "name": "OSM - Tiger Edited Map", - "url": "http://tiger-osm.mapquest.com/tiles/1.0.0/tiger/{z}/{x}/{y}.png", - "extent": [ - 18.702, - -174.46, - 26.501, - -154.516 - ] - }, - { - "name": "OSM US TIGER 2012 Roads Overlay", - "url": "http://{t}.tile.openstreetmap.us/tiger2012_roads_expanded/{z}/{x}/{y}.png", + "name": " TIGER 2012 Roads Overlay", + "template": "http://{t}.tile.openstreetmap.us/tiger2012_roads_expanded/{z}/{x}/{y}.png", "subdomains": [ "a", "b", "c" ], "extent": [ - 24.055, - -124.81, - 49.386, - -66.865 + [ + -124.81, + 24.055 + ], + [ + -66.865, + 49.386 + ] ] }, { - "name": "OSM US TIGER 2012 Roads Overlay", - "url": "http://{t}.tile.openstreetmap.us/tiger2012_roads_expanded/{z}/{x}/{y}.png", + "name": " TIGER 2012 Roads Overlay", + "template": "http://{t}.tile.openstreetmap.us/tiger2012_roads_expanded/{z}/{x}/{y}.png", "subdomains": [ "a", "b", "c" ], "extent": [ - 50.858, - -179.754, - 71.463, - -129.899 + [ + -179.754, + 50.858 + ], + [ + -129.899, + 71.463 + ] ] }, { - "name": "OSM US TIGER 2012 Roads Overlay", - "url": "http://{t}.tile.openstreetmap.us/tiger2012_roads_expanded/{z}/{x}/{y}.png", + "name": " TIGER 2012 Roads Overlay", + "template": "http://{t}.tile.openstreetmap.us/tiger2012_roads_expanded/{z}/{x}/{y}.png", "subdomains": [ "a", "b", "c" ], "extent": [ - 18.702, - -174.46, - 26.501, - -154.516 + [ + -174.46, + 18.702 + ], + [ + -154.516, + 26.501 + ] ] }, { - "name": "OSM US USGS Topographic Maps", - "url": "http://{t}.tile.openstreetmap.us/usgs_scanned_topos/{z}/{x}/{y}.png", + "name": " USGS Topographic Maps", + "template": "http://{t}.tile.openstreetmap.us/usgs_scanned_topos/{z}/{x}/{y}.png", "subdomains": [ "a", "b", "c" ], "extent": [ - 24.005, - -125.991, - 50.009, - -65.988 + [ + -125.991, + 24.005 + ], + [ + -65.988, + 50.009 + ] ] }, { - "name": "OSM US USGS Topographic Maps", - "url": "http://{t}.tile.openstreetmap.us/usgs_scanned_topos/{z}/{x}/{y}.png", + "name": " USGS Topographic Maps", + "template": "http://{t}.tile.openstreetmap.us/usgs_scanned_topos/{z}/{x}/{y}.png", "subdomains": [ "a", "b", "c" ], "extent": [ - 18.902, - -160.579, - 22.508, - -154.793 + [ + -160.579, + 18.902 + ], + [ + -154.793, + 22.508 + ] ] }, { - "name": "OSM US USGS Topographic Maps", - "url": "http://{t}.tile.openstreetmap.us/usgs_scanned_topos/{z}/{x}/{y}.png", + "name": " USGS Topographic Maps", + "template": "http://{t}.tile.openstreetmap.us/usgs_scanned_topos/{z}/{x}/{y}.png", "subdomains": [ "a", "b", "c" ], "extent": [ - 51.255, - -178.001, - 71.999, - -130.004 + [ + -178.001, + 51.255 + ], + [ + -130.004, + 71.999 + ] ] }, { - "name": "OSM US USGS Large Scale Aerial Imagery", - "url": "http://{t}.tile.openstreetmap.us/usgs_large_scale/{z}/{x}/{y}.jpg", + "name": " USGS Large Scale Aerial Imagery", + "template": "http://{t}.tile.openstreetmap.us/usgs_large_scale/{z}/{x}/{y}.jpg", "subdomains": [ "a", "b", "c" ], "extent": [ - 24.496, - -124.819, - 49.443, - -66.931 + [ + -124.819, + 24.496 + ], + [ + -66.931, + 49.443 + ] ] }, { "name": "British Columbia bc_mosaic", - "url": "http://{t}.imagery.paulnorman.ca/tiles/bc_mosaic/{z}/{x}/{y}.png", + "template": "http://{t}.imagery.paulnorman.ca/tiles/bc_mosaic/{z}/{x}/{y}.png", "subdomains": [ "a", "b", @@ -182,55 +184,75 @@ "d" ], "extent": [ - 48.995, - -123.441, - 50.426, - -121.346 + [ + -123.441, + 48.995 + ], + [ + -121.346, + 50.426 + ] ], "sourcetag": "bc_mosaic", "terms_url": "http://imagery.paulnorman.ca/tiles/about.html" }, { "name": "OS OpenData Streetview", - "url": "http://os.openstreetmap.org/sv/{z}/{x}/{y}.png", + "template": "http://os.openstreetmap.org/sv/{z}/{x}/{y}.png", "extent": [ - 49.86, - -8.72, - 60.92, - 1.84 + [ + -8.72, + 49.86 + ], + [ + 1.84, + 60.92 + ] ], "sourcetag": "OS_OpenData_StreetView" }, { "name": "OS OpenData Locator", - "url": "http://tiles.itoworld.com/os_locator/{z}/{x}/{y}.png", + "template": "http://tiles.itoworld.com/os_locator/{z}/{x}/{y}.png", "extent": [ - 49.8, - -9, - 61.1, - 1.9 + [ + -9, + 49.8 + ], + [ + 1.9, + 61.1 + ] ], "sourcetag": "OS_OpenData_Locator" }, { "name": "OS 1:25k historic (OSM)", - "url": "http://ooc.openstreetmap.org/os1/{z}/{x}/{y}.jpg", + "template": "http://ooc.openstreetmap.org/os1/{z}/{x}/{y}.jpg", "extent": [ - 49.8, - -9, - 61.1, - 1.9 + [ + -9, + 49.8 + ], + [ + 1.9, + 61.1 + ] ], "sourcetag": "OS 1:25k" }, { "name": "OS 1:25k historic (NLS)", - "url": "http://geo.nls.uk/mapdata2/os/25000/{z}/{x}/{y}.png", + "template": "http://geo.nls.uk/mapdata2/os/25000/{z}/{x}/{y}.png", "extent": [ - 49.8, - -9, - 61.1, - 1.9 + [ + -9, + 49.8 + ], + [ + 1.9, + 61.1 + ] ], "sourcetag": "OS 1:25k", "logo": "icons/logo_nls70-nq8.png", @@ -238,23 +260,31 @@ }, { "name": "OS 7th Series historic (OSM)", - "url": "http://ooc.openstreetmap.org/os7/{z}/{x}/{y}.jpg", + "template": "http://ooc.openstreetmap.org/os7/{z}/{x}/{y}.jpg", "extent": [ - 49.8, - -9, - 61.1, - 1.9 + [ + -9, + 49.8 + ], + [ + 1.9, + 61.1 + ] ], "sourcetag": "OS7" }, { "name": "OS 7th Series historic (NLS)", - "url": "http://geo.nls.uk/mapdata2/os/seventh/{z}/{x}/{y}.png", + "template": "http://geo.nls.uk/mapdata2/os/seventh/{z}/{x}/{y}.png", "extent": [ - 49.8, - -9, - 61.1, - 1.9 + [ + -9, + 49.8 + ], + [ + 1.9, + 61.1 + ] ], "sourcetag": "OS7", "logo": "icons/logo_nls70-nq8.png", @@ -262,111 +292,153 @@ }, { "name": "OS New Popular Edition historic", - "url": "http://ooc.openstreetmap.org/npe/{z}/{x}/{y}.png", + "template": "http://ooc.openstreetmap.org/npe/{z}/{x}/{y}.png", "extent": [ - 49.8, - -5.8, - 55.8, - 1.9 + [ + -5.8, + 49.8 + ], + [ + 1.9, + 55.8 + ] ], "sourcetag": "NPE" }, { "name": "OS Scottish Popular historic", - "url": "http://ooc.openstreetmap.org/npescotland/tiles/{z}/{x}/{y}.jpg", + "template": "http://ooc.openstreetmap.org/npescotland/tiles/{z}/{x}/{y}.jpg", "extent": [ - 54.5, - -7.8, - 61.1, - -1.1 + [ + -7.8, + 54.5 + ], + [ + -1.1, + 61.1 + ] ], "sourcetag": "NPE" }, { "name": "Surrey aerial", - "url": "http://gravitystorm.dev.openstreetmap.org/surrey/{z}/{x}/{y}.png", + "template": "http://gravitystorm.dev.openstreetmap.org/surrey/{z}/{x}/{y}.png", "extent": [ - 51.071, - -0.856, - 51.473, - 0.062 + [ + -0.856, + 51.071 + ], + [ + 0.062, + 51.473 + ] ], "sourcetag": "Surrey aerial" }, { "name": "Haiti - GeoEye Jan 13", - "url": "http://gravitystorm.dev.openstreetmap.org/imagery/haiti/{z}/{x}/{y}.jpg", + "template": "http://gravitystorm.dev.openstreetmap.org/imagery/haiti/{z}/{x}/{y}.jpg", "extent": [ - 17.95, - -74.5, - 20.12, - -71.58 + [ + -74.5, + 17.95 + ], + [ + -71.58, + 20.12 + ] ], "sourcetag": "Haiti GeoEye" }, { "name": "Haiti - GeoEye Jan 13+", - "url": "http://maps.nypl.org/tilecache/1/geoeye/{z}/{x}/{y}.jpg", + "template": "http://maps.nypl.org/tilecache/1/geoeye/{z}/{x}/{y}.jpg", "extent": [ - 17.95, - -74.5, - 20.12, - -71.58 + [ + -74.5, + 17.95 + ], + [ + -71.58, + 20.12 + ] ], "sourcetag": "Haiti GeoEye" }, { "name": "Haiti - DigitalGlobe", - "url": "http://maps.nypl.org/tilecache/1/dg_crisis/{z}/{x}/{y}.jpg", + "template": "http://maps.nypl.org/tilecache/1/dg_crisis/{z}/{x}/{y}.jpg", "extent": [ - 17.95, - -74.5, - 20.12, - -71.58 + [ + -74.5, + 17.95 + ], + [ + -71.58, + 20.12 + ] ], "sourcetag": "Haiti DigitalGlobe" }, { "name": "Haiti - Street names", - "url": "http://hypercube.telascience.org/tiles/1.0.0/haiti-city/{z}/{x}/{y}.jpg", + "template": "http://hypercube.telascience.org/tiles/1.0.0/haiti-city/{z}/{x}/{y}.jpg", "extent": [ - 17.95, - -74.5, - 20.12, - -71.58 + [ + -74.5, + 17.95 + ], + [ + -71.58, + 20.12 + ] ], "sourcetag": "Haiti streetnames" }, { - "name": "National Agriculture Imagery Program", - "url": "http://cube.telascience.org/tilecache/tilecache.py/NAIP_ALL/{z}/{x}/{y}.png", + "name": "NAIP", + "template": "http://cube.telascience.org/tilecache/tilecache.py/NAIP_ALL/{z}/{x}/{y}.png", + "description": "National Agriculture Imagery Program", "extent": [ - 24.2, - -125.8, - 49.5, - -62.3 + [ + -125.8, + 24.2 + ], + [ + -62.3, + 49.5 + ] ], "sourcetag": "NAIP" }, { - "name": "National Agriculture Imagery Program", - "url": "http://cube.telascience.org/tilecache/tilecache.py/NAIP_ALL/{z}/{x}/{y}.png", + "name": "NAIP", + "template": "http://cube.telascience.org/tilecache/tilecache.py/NAIP_ALL/{z}/{x}/{y}.png", + "description": "National Agriculture Imagery Program", "extent": [ - 55.3, - -168.5, - 71.5, - -140 + [ + -168.5, + 55.3 + ], + [ + -140, + 71.5 + ] ], "sourcetag": "NAIP" }, { "name": "Ireland - NLS Historic Maps", - "url": "http://geo.nls.uk/maps/ireland/gsgs4136/{z}/{x}/{y}.png", + "template": "http://geo.nls.uk/maps/ireland/gsgs4136/{z}/{x}/{y}.png", "extent": [ - 51.32, - -10.71, - 55.46, - -5.37 + [ + -10.71, + 51.32 + ], + [ + -5.37, + 55.46 + ] ], "sourcetag": "NLS Historic Maps", "logo": "icons/logo_nls70-nq8.png", @@ -374,116 +446,156 @@ }, { "name": "Denmark - Fugro Aerial Imagery", - "url": "http://tile.openstreetmap.dk/fugro2005/{z}/{x}/{y}.jpg", + "template": "http://tile.openstreetmap.dk/fugro2005/{z}/{x}/{y}.jpg", "extent": [ - 54.44, - 7.81, - 57.86, - 15.49 + [ + 7.81, + 54.44 + ], + [ + 15.49, + 57.86 + ] ], "sourcetag": "Fugro (2005)" }, { "name": "Denmark - Stevns Kommune", - "url": "http://tile.openstreetmap.dk/stevns/2009/{z}/{x}/{y}.jpg", + "template": "http://tile.openstreetmap.dk/stevns/2009/{z}/{x}/{y}.jpg", "extent": [ - 55.23403, - 12.09144, - 55.43647, - 12.47712 + [ + 12.09144, + 55.23403 + ], + [ + 12.47712, + 55.43647 + ] ], "sourcetag": "Stevns Kommune (2009)" }, { "name": "Austria - geoimage.at", - "url": "http://geoimage.openstreetmap.at/4d80de696cd562a63ce463a58a61488d/{z}/{x}/{y}.jpg", + "template": "http://geoimage.openstreetmap.at/4d80de696cd562a63ce463a58a61488d/{z}/{x}/{y}.jpg", "extent": [ - 46.33, - 9.36, - 49.09, - 17.28 + [ + 9.36, + 46.33 + ], + [ + 17.28, + 49.09 + ] ], "sourcetag": "geoimage.at" }, { "name": "Russia - Kosmosnimki.ru IRS Satellite", - "url": "http://irs.gis-lab.info/?layers=irs&request=GetTile&z={z}&x={x}&y={y}", + "template": "http://irs.gis-lab.info/?layers=irs&request=GetTile&z={z}&x={x}&y={y}", "extent": [ - 40.96, - 19.02, - 70.48, - 77.34 + [ + 19.02, + 40.96 + ], + [ + 77.34, + 70.48 + ] ], "sourcetag": "Kosmosnimki.ru IRS" }, { "name": "Belarus - Kosmosnimki.ru SPOT4 Satellite", - "url": "http://irs.gis-lab.info/?layers=spot&request=GetTile&z={z}&x={x}&y={y}", + "template": "http://irs.gis-lab.info/?layers=spot&request=GetTile&z={z}&x={x}&y={y}", "extent": [ - 51.25, - 23.16, - 56.19, - 32.83 + [ + 23.16, + 51.25 + ], + [ + 32.83, + 56.19 + ] ], "sourcetag": "Kosmosnimki.ru SPOT4" }, { "name": "Australia - Geographic Reference Image", - "url": "http://agri.openstreetmap.org/{z}/{x}/{y}.png", + "template": "http://agri.openstreetmap.org/{z}/{x}/{y}.png", "extent": [ - -44, - 96, - -9, - 168 + [ + 96, + -44 + ], + [ + 168, + -9 + ] ], "sourcetag": "AGRI" }, { "name": "Switzerland - Canton Aargau - AGIS 25cm 2011", - "url": "http://tiles.poole.ch/AGIS/OF2011/{z}/{x}/{y}.png", + "template": "http://tiles.poole.ch/AGIS/OF2011/{z}/{x}/{y}.png", "extent": [ - 47.13, - 7.69, - 47.63, - 8.48 + [ + 7.69, + 47.13 + ], + [ + 8.48, + 47.63 + ] ], "sourcetag": "AGIS OF2011" }, { "name": "Switzerland - Canton Solothurn - SOGIS 2007", - "url": "http://mapproxy.sosm.ch:8080/tiles/sogis2007/EPSG900913/{z}/{x}/{y}.png?origin=nw", + "template": "http://mapproxy.sosm.ch:8080/tiles/sogis2007/EPSG900913/{z}/{x}/{y}.png?origin=nw", "extent": [ - 47.06, - 7.33, - 47.5, - 8.04 + [ + 7.33, + 47.06 + ], + [ + 8.04, + 47.5 + ] ], "sourcetag": "Orthofoto 2007 WMS Solothurn" }, { "name": "Poland - Media-Lab fleet GPS masstracks", - "url": "http://masstracks.media-lab.com.pl/{z}/{x}/{y}.png", + "template": "http://masstracks.media-lab.com.pl/{z}/{x}/{y}.png", "extent": [ - 48.9, - 14, - 55, - 24.2 + [ + 14, + 48.9 + ], + [ + 24.2, + 55 + ] ], "sourcetag": "masstracks" }, { "name": "South Africa - CD:NGI Aerial", - "url": "http://{t}.aerial.openstreetmap.org.za/ngi-aerial/{z}/{x}/{y}.jpg", + "template": "http://{t}.aerial.openstreetmap.org.za/ngi-aerial/{z}/{x}/{y}.jpg", "subdomains": [ "a", "b", "c" ], "extent": [ - -34.95, - 17.64, - -22.05, - 32.87 + [ + 17.64, + -34.95 + ], + [ + 32.87, + -22.05 + ] ], "sourcetag": "ngi-aerial" } diff --git a/data/imagery_convert.js b/data/imagery_convert.js index 16cc23317..abc5cbef6 100644 --- a/data/imagery_convert.js +++ b/data/imagery_convert.js @@ -5,17 +5,58 @@ $ = 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(), - url: $(this).find('url').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.url = im.url + im.template = im.template + .replace('$quadkey', '{u}') .replace(/\$(\w)/g, function(m) { return '{' + m[1] + '}'; }) @@ -28,13 +69,13 @@ $('set').each(function(i) { if (elem.attr('minlat')) { im.extent = [ - +elem.attr('minlat'), - +elem.attr('minlon'), - +elem.attr('maxlat'), - +elem.attr('maxlon')]; + [+elem.attr('minlon'), + +elem.attr('minlat')], + [+elem.attr('maxlon'), + +elem.attr('maxlat')]]; } - ['sourcetag', 'logo', 'logo_url', 'terms_url'].forEach(function(a) { + ['default', 'sourcetag', 'logo', 'logo_url', 'terms_url'].forEach(function(a) { if (elem.find(a).length) { im[a] = elem.find(a).first().text(); } @@ -43,3 +84,4 @@ $('set').each(function(i) { }); fs.writeFileSync('imagery.json', JSON.stringify(imagery, null, 4)); +fs.writeFileSync('imagery.js', 'iD.data.imagery = ' + JSON.stringify(imagery, null, 4) + ';'); diff --git a/index.html b/index.html index a4a2ab5f5..8eca2fae7 100644 --- a/index.html +++ b/index.html @@ -32,12 +32,18 @@ + + + + + + @@ -70,6 +76,7 @@ + @@ -83,6 +90,7 @@ + @@ -97,6 +105,7 @@ + @@ -136,9 +145,6 @@ - - -
+ + + + + @@ -62,6 +67,7 @@ + @@ -80,6 +86,7 @@ + @@ -95,6 +102,7 @@ + @@ -130,17 +138,6 @@ - - - - @@ -157,6 +154,7 @@ + diff --git a/test/index_packaged.html b/test/index_packaged.html index 8dd73d666..778231edd 100644 --- a/test/index_packaged.html +++ b/test/index_packaged.html @@ -18,15 +18,6 @@ - - @@ -42,6 +33,7 @@ + diff --git a/test/spec/actions/connect.js b/test/spec/actions/connect.js index 3838d83c2..fc585b43c 100644 --- a/test/spec/actions/connect.js +++ b/test/spec/actions/connect.js @@ -99,7 +99,7 @@ describe("iD.actions.Connect", function() { '-': iD.Way({id: '-', nodes: ['a', 'b']}), '=': iD.Way({id: '=', nodes: ['c', 'd']}), 'r1': iD.Relation({id: 'r1', members: [{id: 'b', role: 'r1', type: 'node'}]}), - 'r2': iD.Relation({id: 'r2', members: [{id: 'b', role: 'r1', type: 'node'}, {id: 'c', role: 'r2', type: 'node'}]}) + 'r2': iD.Relation({id: 'r2', members: [{id: 'b', role: 'r2', type: 'node'}, {id: 'c', role: 'r2', type: 'node'}]}) }); graph = iD.actions.Connect(['b', 'c'])(graph); diff --git a/test/spec/actions/join.js b/test/spec/actions/join.js index 261fe607d..6951013d3 100644 --- a/test/spec/actions/join.js +++ b/test/spec/actions/join.js @@ -10,7 +10,7 @@ describe("iD.actions.Join", function () { '=': iD.Way({id: '=', nodes: ['b', 'c']}) }); - expect(iD.actions.Join('-', '=').enabled(graph)).to.be.true; + expect(iD.actions.Join(['-', '=']).enabled(graph)).to.be.true; }); it("returns true for ways that share a start/end node", function () { @@ -23,7 +23,7 @@ describe("iD.actions.Join", function () { '=': iD.Way({id: '=', nodes: ['c', 'b']}) }); - expect(iD.actions.Join('-', '=').enabled(graph)).to.be.true; + expect(iD.actions.Join(['-', '=']).enabled(graph)).to.be.true; }); it("returns true for ways that share a start/start node", function () { @@ -36,7 +36,7 @@ describe("iD.actions.Join", function () { '=': iD.Way({id: '=', nodes: ['b', 'c']}) }); - expect(iD.actions.Join('-', '=').enabled(graph)).to.be.true; + expect(iD.actions.Join(['-', '=']).enabled(graph)).to.be.true; }); it("returns true for ways that share an end/end node", function () { @@ -49,7 +49,7 @@ describe("iD.actions.Join", function () { '=': iD.Way({id: '=', nodes: ['c', 'b']}) }); - expect(iD.actions.Join('-', '=').enabled(graph)).to.be.true; + expect(iD.actions.Join(['-', '=']).enabled(graph)).to.be.true; }); it("returns false for ways that don't share the necessary nodes", function () { @@ -65,7 +65,7 @@ describe("iD.actions.Join", function () { '=': iD.Way({id: '=', nodes: ['b', 'd']}) }); - expect(iD.actions.Join('-', '=').enabled(graph)).to.be.false; + expect(iD.actions.Join(['-', '=']).enabled(graph)).to.be.false; }); }); @@ -80,7 +80,7 @@ describe("iD.actions.Join", function () { '=': iD.Way({id: '=', nodes: ['b', 'c']}) }); - graph = iD.actions.Join('-', '=')(graph); + graph = iD.actions.Join(['-', '='])(graph); expect(graph.entity('-').nodes).to.eql(['a', 'b', 'c']); expect(graph.entity('=')).to.be.undefined; @@ -97,7 +97,7 @@ describe("iD.actions.Join", function () { '=': iD.Way({id: '=', nodes: ['c', 'b']}) }); - graph = iD.actions.Join('-', '=')(graph); + graph = iD.actions.Join(['-', '='])(graph); expect(graph.entity('-').nodes).to.eql(['c', 'b', 'a']); expect(graph.entity('=')).to.be.undefined; @@ -112,13 +112,14 @@ describe("iD.actions.Join", function () { 'b': iD.Node({id: 'b'}), 'c': iD.Node({id: 'c'}), '-': iD.Way({id: '-', nodes: ['b', 'a']}), - '=': iD.Way({id: '=', nodes: ['b', 'c']}) + '=': iD.Way({id: '=', nodes: ['b', 'c'], tags: {'lanes:forward': 2}}) }); - graph = iD.actions.Join('-', '=')(graph); + graph = iD.actions.Join(['-', '='])(graph); expect(graph.entity('-').nodes).to.eql(['c', 'b', 'a']); expect(graph.entity('=')).to.be.undefined; + expect(graph.entity('-').tags).to.eql({'lanes:backward': 2}); }); it("joins a --> b <== c", function () { @@ -130,13 +131,14 @@ describe("iD.actions.Join", function () { 'b': iD.Node({id: 'b'}), 'c': iD.Node({id: 'c'}), '-': iD.Way({id: '-', nodes: ['a', 'b']}), - '=': iD.Way({id: '=', nodes: ['c', 'b']}) + '=': iD.Way({id: '=', nodes: ['c', 'b'], tags: {'lanes:forward': 2}}) }); - graph = iD.actions.Join('-', '=')(graph); + graph = iD.actions.Join(['-', '='])(graph); expect(graph.entity('-').nodes).to.eql(['a', 'b', 'c']); expect(graph.entity('=')).to.be.undefined; + expect(graph.entity('-').tags).to.eql({'lanes:backward': 2}); }); it("merges tags", function () { @@ -148,7 +150,7 @@ describe("iD.actions.Join", function () { '=': iD.Way({id: '=', nodes: ['b', 'c'], tags: {a: 'a', b: '=', d: 'd'}}) }); - graph = iD.actions.Join('-', '=')(graph); + graph = iD.actions.Join(['-', '='])(graph); expect(graph.entity('-').tags).to.eql({a: 'a', b: '-; =', c: 'c', d: 'd'}); }); @@ -161,10 +163,10 @@ describe("iD.actions.Join", function () { '-': iD.Way({id: '-', nodes: ['a', 'b']}), '=': iD.Way({id: '=', nodes: ['b', 'c']}), 'r1': iD.Relation({id: 'r1', members: [{id: '=', role: 'r1', type: 'way'}]}), - 'r2': iD.Relation({id: 'r2', members: [{id: '=', role: 'r1', type: 'way'}, {id: '-', role: 'r2', type: 'way'}]}) + 'r2': iD.Relation({id: 'r2', members: [{id: '=', role: 'r2', type: 'way'}, {id: '-', role: 'r2', type: 'way'}]}) }); - graph = iD.actions.Join('-', '=')(graph); + graph = iD.actions.Join(['-', '='])(graph); expect(graph.entity('r1').members).to.eql([{id: '-', role: 'r1', type: 'way'}]); expect(graph.entity('r2').members).to.eql([{id: '-', role: 'r2', type: 'way'}]); diff --git a/test/spec/actions/merge.js b/test/spec/actions/merge.js new file mode 100644 index 000000000..5ea0b3dea --- /dev/null +++ b/test/spec/actions/merge.js @@ -0,0 +1,20 @@ +describe("iD.actions.Merge", function () { + it("merges multiple points to an area", function () { + var graph = iD.Graph({ + 'a': iD.Node({id: 'a', tags: {a: 'a'}}), + 'b': iD.Node({id: 'b', tags: {b: 'b'}}), + 'w': iD.Way({id: 'w', tags: {area: 'yes'}}), + 'r': iD.Relation({id: 'r', members: [{id: 'a', role: 'r', type: 'node'}]}) + }), + action = iD.actions.Merge(['a', 'b', 'w']); + + expect(action.enabled(graph)).to.be.true; + + graph = action(graph); + + expect(graph.entity('a')).to.be.undefined; + expect(graph.entity('b')).to.be.undefined; + expect(graph.entity('w').tags).to.eql({a: 'a', b: 'b', area: 'yes'}); + expect(graph.entity('r').members).to.eql([{id: 'w', role: 'r', type: 'way'}]); + }); +}); diff --git a/test/spec/actions/split.js b/test/spec/actions/split.js index 5ee68e67e..417525941 100644 --- a/test/spec/actions/split.js +++ b/test/spec/actions/split.js @@ -99,6 +99,66 @@ describe("iD.actions.Split", function () { expect(graph.entity('|').nodes).to.eql(['d', 'b']); }); + it("splits a closed way at the given point and its antipode", function () { + // Situation: + // a ---- b + // | | + // d ---- c + // + // Split at a. + // + // Expected result: + // a ---- b + // || | + // d ==== c + // + var graph = iD.Graph({ + 'a': iD.Node({id: 'a'}), + 'b': iD.Node({id: 'b'}), + 'c': iD.Node({id: 'c'}), + 'd': iD.Node({id: 'd'}), + '-': iD.Way({id: '-', nodes: ['a', 'b', 'c', 'd', 'a']}) + }); + + var g1 = iD.actions.Split('a', '=')(graph); + expect(g1.entity('-').nodes).to.eql(['a', 'b', 'c']); + expect(g1.entity('=').nodes).to.eql(['c', 'd', 'a']); + + var g2 = iD.actions.Split('b', '=')(graph); + expect(g2.entity('-').nodes).to.eql(['b', 'c', 'd']); + expect(g2.entity('=').nodes).to.eql(['d', 'a', 'b']); + + var g3 = iD.actions.Split('c', '=')(graph); + expect(g3.entity('-').nodes).to.eql(['c', 'd', 'a']); + expect(g3.entity('=').nodes).to.eql(['a', 'b', 'c']); + + var g4 = iD.actions.Split('d', '=')(graph); + expect(g4.entity('-').nodes).to.eql(['d', 'a', 'b']); + expect(g4.entity('=').nodes).to.eql(['b', 'c', 'd']); + }); + + it("splits an area by converting it to a multipolygon", function () { + var graph = iD.Graph({ + 'a': iD.Node({id: 'a'}), + 'b': iD.Node({id: 'b'}), + 'c': iD.Node({id: 'c'}), + 'd': iD.Node({id: 'd'}), + '-': iD.Way({id: '-', tags: {building: 'yes'}, nodes: ['a', 'b', 'c', 'd', 'a']}) + }); + + graph = iD.actions.Split('a', '=')(graph); + expect(graph.entity('-').tags).to.eql({}); + expect(graph.entity('=').tags).to.eql({}); + expect(graph.parentRelations(graph.entity('-'))).to.have.length(1); + + var relation = graph.parentRelations(graph.entity('-'))[0]; + expect(relation.tags).to.eql({type: 'multipolygon', building: 'yes'}); + expect(relation.members).to.eql([ + {id: '-', role: 'outer', type: 'way'}, + {id: '=', role: 'outer', type: 'way'} + ]); + }); + it("adds the new way to parent relations (no connections)", function () { // Situation: // a ---- b ---- c diff --git a/test/spec/graph/graph.js b/test/spec/graph/graph.js index a357ff360..a099d8b61 100644 --- a/test/spec/graph/graph.js +++ b/test/spec/graph/graph.js @@ -196,10 +196,16 @@ describe('iD.Graph', function() { }); describe("#replace", function () { + it("is a no-op if the replacement is identical to the existing entity", function () { + var node = iD.Node(), + graph = iD.Graph([node]); + expect(graph.replace(node)).to.equal(graph); + }); + it("returns a new graph", function () { var node = iD.Node(), graph = iD.Graph([node]); - expect(graph.replace(node)).not.to.equal(graph); + expect(graph.replace(node.update())).not.to.equal(graph); }); it("doesn't modify the receiver", function () { @@ -257,7 +263,6 @@ describe('iD.Graph', function() { graph = iD.Graph([node, r1]); expect(graph.replace(r1).parentRelations(node)).to.eql([r1]); }); - }); describe("#update", function () { diff --git a/test/spec/graph/relation.js b/test/spec/graph/relation.js index b07f9bee7..39b748e0a 100644 --- a/test/spec/graph/relation.js +++ b/test/spec/graph/relation.js @@ -131,6 +131,35 @@ describe('iD.Relation', function () { }); }); + describe("#replaceMember", function () { + it("returns self if self does not contain needle", function () { + var r = iD.Relation({members: []}); + expect(r.replaceMember({id: 'a'}, {id: 'b'})).to.equal(r); + }); + + it("replaces a member which doesn't already exist", function () { + var r = iD.Relation({members: [{id: 'a', role: 'a'}]}); + expect(r.replaceMember({id: 'a'}, {id: 'b', type: 'node'}).members).to.eql([{id: 'b', role: 'a', type: 'node'}]); + }); + + it("preserves the existing role", function () { + var r = iD.Relation({members: [{id: 'a', role: 'a', type: 'node'}]}); + expect(r.replaceMember({id: 'a'}, {id: 'b', type: 'node'}).members).to.eql([{id: 'b', role: 'a', type: 'node'}]); + }); + + it("uses the replacement type", function () { + var r = iD.Relation({members: [{id: 'a', role: 'a', type: 'node'}]}); + expect(r.replaceMember({id: 'a'}, {id: 'b', type: 'way'}).members).to.eql([{id: 'b', role: 'a', type: 'way'}]); + }); + + it("removes members if replacing them would produce duplicates", function () { + var r = iD.Relation({members: [ + {id: 'a', role: 'b', type: 'node'}, + {id: 'b', role: 'b', type: 'node'}]}); + expect(r.replaceMember({id: 'a'}, {id: 'b', type: 'node'}).members).to.eql([{id: 'b', role: 'b', type: 'node'}]); + }); + }); + describe("#asJXON", function () { it('converts a relation to jxon', function() { var relation = iD.Relation({id: 'r-1', members: [{id: 'w1', role: 'forward', type: 'way'}], tags: {type: 'route'}}); diff --git a/test/spec/modes/add_point.js b/test/spec/modes/add_point.js index 5807a3c0b..62291f8ee 100644 --- a/test/spec/modes/add_point.js +++ b/test/spec/modes/add_point.js @@ -17,13 +17,13 @@ describe("iD.modes.AddPoint", function() { describe("clicking the map", function () { it("adds a node", function() { happen.mousedown(context.surface().node(), {}); - happen.click(window, {}); + happen.mouseup(window, {}); expect(context.changes().created).to.have.length(1); }); it("selects the node", function() { happen.mousedown(context.surface().node(), {}); - happen.click(window, {}); + happen.mouseup(window, {}); expect(context.mode().id).to.equal('select'); expect(context.mode().selection()).to.eql([context.changes().created[0].id]); }); diff --git a/test/spec/renderer/background.js b/test/spec/renderer/background.js index 6ba871d11..4321e861e 100644 --- a/test/spec/renderer/background.js +++ b/test/spec/renderer/background.js @@ -27,27 +27,21 @@ describe('iD.Background', function() { }); }); - describe('iD.BackgroundSource.Bing', function() { - it('generates tiles', function() { - expect(iD.BackgroundSource.Bing([0,0,0])).to.equal('http://ecn.t0.tiles.virtualearth.net/tiles/a.jpeg?g=587&mkt=en-gb&n=z'); - }); - }); - describe('iD.BackgroundSource.Template', function() { it('does not error with blank template', function() { - var source = iD.BackgroundSource.template(''); + var source = iD.BackgroundSource.template({ template: '' }); expect(source([0,1,2])).to.equal(''); }); it('generates a tile-generating source', function() { - var source = iD.BackgroundSource.template('{z}/{x}/{y}'); + var source = iD.BackgroundSource.template({ template: '{z}/{x}/{y}' }); expect(source([0,1,2])).to.equal('2/0/1'); }); it('supports subdomains', function() { - var source = iD.BackgroundSource.template('{t}/{z}/{x}/{y}', ['apples', 'oranges']); + var source = iD.BackgroundSource.template({ template: '{t}/{z}/{x}/{y}', subdomains: ['apples', 'oranges'] }); expect(source([0,1,2])).to.equal('apples/2/0/1'); }); it('distributes requests between subdomains', function() { - var source = iD.BackgroundSource.template('{t}/{z}/{x}/{y}', ['apples', 'oranges']); + var source = iD.BackgroundSource.template({ template: '{t}/{z}/{x}/{y}', subdomains: ['apples', 'oranges'] }); expect(source([0,1,1])).to.equal('oranges/1/0/1'); }); }); diff --git a/test/spec/spec_helpers.js b/test/spec/spec_helpers.js index b8ebdf307..7a62e76b9 100644 --- a/test/spec/spec_helpers.js +++ b/test/spec/spec_helpers.js @@ -1,3 +1,12 @@ +iD.debug = true; + +mocha.setup({ + ui: 'bdd', + globals: ['__onresize.tail-size', '__onmousemove.zoom', '__onmouseup.zoom', '__onclick.draw'] +}); + +var expect = chai.expect; + chai.use(function (chai, utils) { var flag = utils.flag;