merged from master

This commit is contained in:
Thomas Hervey
2018-06-21 11:06:57 -04:00
14 changed files with 280 additions and 39 deletions
+1 -1
View File
@@ -19,4 +19,4 @@ land.html
/test/css
/test/img
.vscode/launch.json
\.vscode/
+5
View File
@@ -3074,6 +3074,11 @@ en:
name: Fire Hydrant
# 'terms: fire plug'
terms: '<translate with synonyms or related terms for ''Fire Hydrant'', separated by commas>'
emergency/first_aid:
# emergency=first_aid
name: First Aid Kit
# 'terms: bandage,first aid,med,med kit,medic*,medkit'
terms: '<translate with synonyms or related terms for ''First Aid Kit'', separated by commas>'
emergency/life_ring:
# emergency=life_ring
name: Life Ring
+2 -1
View File
@@ -314,8 +314,9 @@
"emergency/defibrillator": {"icon": "maki-defibrillator", "fields": ["indoor", "ref", "operator"], "geometry": ["point", "vertex"], "terms": ["AED"], "tags": {"emergency": "defibrillator"}, "name": "Defibrillator"},
"emergency/fire_extinguisher": {"icon": "fas-fire-extinguisher", "fields": ["indoor", "ref", "operator"], "geometry": ["point", "vertex"], "tags": {"emergency": "fire_extinguisher"}, "name": "Fire Extinguisher"},
"emergency/fire_hydrant": {"icon": "temaki-fire_hydrant", "fields": ["fire_hydrant/type", "fire_hydrant/position", "ref", "operator"], "geometry": ["point", "vertex"], "terms": ["fire plug"], "tags": {"emergency": "fire_hydrant"}, "name": "Fire Hydrant"},
"emergency/first_aid": {"icon": "fas-medkit", "fields": ["indoor", "ref", "operator"], "geometry": ["point", "vertex"], "terms": ["bandage", "first aid", "med", "med kit", "medic*", "medkit"], "tags": {"emergency": "first_aid"}, "name": "First Aid Kit"},
"emergency/life_ring": {"icon": "fas-life-ring", "fields": ["ref", "operator"], "geometry": ["point", "vertex"], "terms": ["life buoy", "kisby ring", "kisbie ring", "perry buoy"], "tags": {"emergency": "life_ring"}, "name": "Life Ring"},
"emergency/phone": {"icon": "maki-emergency-phone", "fields": ["operator"], "geometry": ["point", "vertex"], "tags": {"emergency": "phone"}, "name": "Emergency Phone"},
"emergency/phone": {"icon": "maki-emergency-phone", "fields": ["indoor", "ref", "operator"], "geometry": ["point", "vertex"], "tags": {"emergency": "phone"}, "name": "Emergency Phone"},
"emergency/water_tank": {"icon": "maki-water", "fields": ["name", "ref", "operator"], "geometry": ["point", "vertex"], "terms": ["water tank", "cistern", "reservoir"], "tags": {"emergency": "water_tank"}, "name": "Emergency Water Tank"},
"entrance": {"icon": "maki-entrance-alt1", "geometry": ["vertex"], "tags": {"entrance": "*"}, "fields": ["entrance", "access_simple", "address"], "name": "Entrance/Exit"},
"footway/crossing-raised": {"fields": ["crossing", "access", "surface", "kerb", "tactile_paving"], "geometry": ["line"], "tags": {"highway": "footway", "footway": "crossing", "traffic_calming": "table"}, "reference": {"key": "traffic_calming", "value": "table"}, "terms": ["flat top", "hump", "speed", "slow"], "name": "Raised Street Crossing"},
@@ -0,0 +1,24 @@
{
"icon": "fas-medkit",
"fields": [
"indoor",
"ref",
"operator"
],
"geometry": [
"point",
"vertex"
],
"terms": [
"bandage",
"first aid",
"med",
"med kit",
"medic*",
"medkit"
],
"tags": {
"emergency": "first_aid"
},
"name": "First Aid Kit"
}
@@ -1,6 +1,8 @@
{
"icon": "maki-emergency-phone",
"fields": [
"indoor",
"ref",
"operator"
],
"geometry": [
+7
View File
@@ -2143,6 +2143,13 @@
"object_types": ["node"],
"icon_url": "https://raw.githubusercontent.com/bhousel/temaki/master/icons/fire_hydrant.svg?sanitize=true"
},
{
"key": "emergency",
"value": "first_aid",
"description": "First Aid Kit",
"object_types": ["node"],
"icon_url": "https://raw.githubusercontent.com/openstreetmap/iD/master/svg/fontawesome/fas-medkit.svg?sanitize=true"
},
{
"key": "emergency",
"value": "life_ring",
+4
View File
@@ -4076,6 +4076,10 @@
"name": "Fire Hydrant",
"terms": "fire plug"
},
"emergency/first_aid": {
"name": "First Aid Kit",
"terms": "bandage,first aid,med,med kit,medic*,medkit"
},
"emergency/life_ring": {
"name": "Life Ring",
"terms": "life buoy,kisby ring,kisbie ring,perry buoy"
+1 -1
View File
@@ -718,7 +718,7 @@ export function rendererMap(context) {
if (!isFinite(extent.area())) return;
var z2 = map.trimmedExtentZoom(extent);
zoomLimits = zoomLimits || [context.minEditableZoom(), 24];
zoomLimits = zoomLimits || [context.minEditableZoom(), 19];
map.centerZoom(extent.center(), Math.min(Math.max(z2, zoomLimits[0]), zoomLimits[1]));
};
+1 -1
View File
@@ -247,7 +247,7 @@ function getBubbles(url, tile, callback) {
jsCallback: '{callback}'
});
jsonpRequest(urlForRequest, function (data) {
return jsonpRequest(urlForRequest, function (data) {
if (!data || data.error) {
callback(null);
} else {
+1 -1
View File
@@ -322,7 +322,7 @@ export function uiFeatureList(context) {
function click(d) {
d3_event.preventDefault();
if (d.location) {
context.map().centerZoom([d.location[1], d.location[0]], 20);
context.map().centerZoom([d.location[1], d.location[0]], 19);
}
else if (d.entity) {
if (d.entity.type === 'node') {
+52 -34
View File
@@ -1,43 +1,61 @@
import { select as d3_select } from 'd3-selection';
var jsonpCache = {};
window.jsonpCache = jsonpCache;
export function jsonpRequest(url, callback) {
if (window.JSONP_FIX) {
if (window.JSONP_DELAY === 0) {
callback(window.JSONP_FIX);
} else {
setTimeout(function() {
callback(window.JSONP_FIX);
}, window.JSONP_DELAY || 0);
}
return;
}
function rand() {
var chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz',
c = '', i = -1;
while (++i < 15) c += chars.charAt(Math.floor(Math.random() * 52));
return c;
}
function create(url) {
var e = url.match(/callback=(\w+)/),
c = e ? e[1] : rand();
jsonpCache[c] = function(data) {
callback(data);
delete jsonpCache[c];
script.remove();
var request = {
abort: function() {}
};
return 'jsonpCache.' + c;
}
var cb = create(url),
script = d3_select('head')
.append('script')
.attr('type', 'text/javascript')
.attr('src', url.replace(/(\{|%7B)callback(\}|%7D)/, cb));
if (window.JSONP_FIX) {
if (window.JSONP_DELAY === 0) {
callback(window.JSONP_FIX);
} else {
var t = window.setTimeout(function() {
callback(window.JSONP_FIX);
}, window.JSONP_DELAY || 0);
request.abort = function() { window.clearTimeout(t); };
}
return request;
}
function rand() {
var chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';
var c = '';
var i = -1;
while (++i < 15) c += chars.charAt(Math.floor(Math.random() * 52));
return c;
}
function create(url) {
var e = url.match(/callback=(\w+)/);
var c = e ? e[1] : rand();
jsonpCache[c] = function(data) {
if (jsonpCache[c]) {
callback(data);
}
finalize();
};
function finalize() {
delete jsonpCache[c];
script.remove();
}
request.abort = finalize;
return 'jsonpCache.' + c;
}
var cb = create(url);
var script = d3_select('head')
.append('script')
.attr('type', 'text/javascript')
.attr('src', url.replace(/(\{|%7B)callback(\}|%7D)/, cb));
return request;
}
+1
View File
@@ -0,0 +1 @@
<svg aria-hidden="true" data-prefix="fas" data-icon="medkit" class="svg-inline--fa fa-medkit fa-w-16" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><path fill="currentColor" d="M96 480h320V128h-32V80c0-26.51-21.49-48-48-48H176c-26.51 0-48 21.49-48 48v48H96v352zm96-384h128v32H192V96zm320 80v256c0 26.51-21.49 48-48 48h-16V128h16c26.51 0 48 21.49 48 48zM64 480H48c-26.51 0-48-21.49-48-48V176c0-26.51 21.49-48 48-48h16v352zm288-208v32c0 8.837-7.163 16-16 16h-48v48c0 8.837-7.163 16-16 16h-32c-8.837 0-16-7.163-16-16v-48h-48c-8.837 0-16-7.163-16-16v-32c0-8.837 7.163-16 16-16h48v-48c0-8.837 7.163-16 16-16h32c8.837 0 16 7.163 16 16v48h48c8.837 0 16 7.163 16 16z"></path></svg>

After

Width:  |  Height:  |  Size: 695 B

+1
View File
@@ -106,6 +106,7 @@
<script src='spec/services/nominatim.js'></script>
<script src='spec/services/openstreetcam.js'></script>
<script src='spec/services/osm.js'></script>
<script src='spec/services/streetside.js'></script>
<script src='spec/services/taginfo.js'></script>
<script src='spec/svg/areas.js'></script>
+178
View File
@@ -0,0 +1,178 @@
describe('iD.serviceStreetside', function() {
var dimensions = [64, 64],
context, server, streetside;
before(function() {
iD.services.streetside = iD.serviceStreetside;
});
after(function() {
delete iD.services.streetside;
});
beforeEach(function() {
context = iD.Context().assetPath('../dist/');
context.projection
.scale(667544.214430109) // z14
.translate([-116508, 0]) // 10,0
.clipExtent([[0,0], dimensions]);
server = sinon.fakeServer.create();
streetside = iD.services.streetside;
streetside.reset();
});
afterEach(function() {
window.JSONP_FIX = undefined;
server.restore();
});
describe('#init', function() {
it('Initializes cache one time', function() {
var cache = streetside.cache();
expect(cache).to.have.property('bubbles');
expect(cache).to.have.property('sequences');
streetside.init();
var cache2 = streetside.cache();
expect(cache).to.equal(cache2);
});
});
describe('#reset', function() {
it('resets cache', function() {
streetside.cache().foo = 'bar';
streetside.reset();
expect(streetside.cache()).to.not.have.property('foo');
});
});
describe('#loadBubbles', function() {
it('fires loadedBubbles when bubbles are loaded', function() {
// adjust projection so that only one tile is fetched
// (JSONP hack will return the same data for every fetch)
context.projection
.scale(10680707.430881744) // z18
.translate([-1863988.9381333336, 762.8270222954452]) // 10.002,0.002
.clipExtent([[0,0], dimensions]);
var spy = sinon.spy();
streetside.on('loadedBubbles', spy);
window.JSONP_DELAY = 0;
window.JSONP_FIX = [{
elapsed: 0.001
}, {
id: 1, la: 0, lo: 10.001, al: 0, ro: 0, pi: 0, he: 0, bl: '',
cd: '1/1/2018 12:00:00 PM', ml: 3, nbn: [], pbn: [], rn: [],
pr: undefined, ne: 2
}, {
id: 2, la: 0, lo: 10.002, al: 0, ro: 0, pi: 0, he: 0, bl: '',
cd: '1/1/2018 12:00:01 PM', ml: 3, nbn: [], pbn: [], rn: [],
pr: 1, ne: 3
}, {
id: 3, la: 0, lo: 10.003, al: 0, ro: 0, pi: 0, he: 0, bl: '',
cd: '1/1/2018 12:00:02 PM', ml: 3, nbn: [], pbn: [], rn: [],
pr: 2, ne: undefined
}
];
streetside.loadBubbles(context.projection);
expect(spy).to.have.been.calledOnce;
});
it('does not load bubbles around null island', function() {
context.projection
.scale(10680707.430881744) // z18
.translate([0, 0])
.clipExtent([[0,0], dimensions]);
var spy = sinon.spy();
streetside.on('loadedBubbles', spy);
window.JSONP_DELAY = 0;
window.JSONP_FIX = [{
elapsed: 0.001
}, {
id: 1, la: 0, lo: 0, al: 0, ro: 0, pi: 0, he: 0, bl: '',
cd: '1/1/2018 12:00:00 PM', ml: 3, nbn: [], pbn: [], rn: [],
pr: undefined, ne: 2
}, {
id: 2, la: 0, lo: 0, al: 0, ro: 0, pi: 0, he: 0, bl: '',
cd: '1/1/2018 12:00:01 PM', ml: 3, nbn: [], pbn: [], rn: [],
pr: 1, ne: 3
}, {
id: 3, la: 0, lo: 0, al: 0, ro: 0, pi: 0, he: 0, bl: '',
cd: '1/1/2018 12:00:02 PM', ml: 3, nbn: [], pbn: [], rn: [],
pr: 2, ne: undefined
}
];
streetside.loadBubbles(context.projection);
expect(spy).to.have.been.not.called;
});
});
describe('#bubbles', function() {
it('returns bubbles in the visible map area', function() {
var features = [
{ minX: 10, minY: 0, maxX: 10, maxY: 0, data: { key: 1, loc: [10, 0], ca: 90, pr: undefined, ne: 2, pano: true, sequenceKey: 1 } },
{ minX: 10, minY: 0, maxX: 10, maxY: 0, data: { key: 2, loc: [10, 0], ca: 90, pr: 1, ne: 3, pano: true, sequenceKey: 1 } },
{ minX: 10, minY: 1, maxX: 10, maxY: 1, data: { key: 3, loc: [10, 1], ca: 90, pr: 2, ne: undefined, pano: true, sequenceKey: 1 } }
];
streetside.cache().bubbles.rtree.load(features);
var res = streetside.bubbles(context.projection);
expect(res).to.deep.eql([
{ key: 1, loc: [10, 0], ca: 90, pr: undefined, ne: 2, pano: true, sequenceKey: 1 },
{ key: 2, loc: [10, 0], ca: 90, pr: 1, ne: 3, pano: true, sequenceKey: 1 }
]);
});
it('limits results no more than 3 stacked bubbles in one spot', function() {
var features = [
{ minX: 10, minY: 0, maxX: 10, maxY: 0, data: { key: 1, loc: [10, 0], ca: 90, pr: undefined, ne: 2, pano: true, sequence_id: 1 } },
{ minX: 10, minY: 0, maxX: 10, maxY: 0, data: { key: 2, loc: [10, 0], ca: 90, pr: 1, ne: 3, pano: true, sequence_id: 1 } },
{ minX: 10, minY: 0, maxX: 10, maxY: 0, data: { key: 3, loc: [10, 0], ca: 90, pr: 2, ne: 4, pano: true, sequence_id: 1 } },
{ minX: 10, minY: 0, maxX: 10, maxY: 0, data: { key: 4, loc: [10, 0], ca: 90, pr: 3, ne: 5, pano: true, sequence_id: 1 } },
{ minX: 10, minY: 0, maxX: 10, maxY: 0, data: { key: 5, loc: [10, 0], ca: 90, pr: 4, ne: undefined, pano: true, sequence_id: 1 } }
];
streetside.cache().bubbles.rtree.load(features);
var res = streetside.bubbles(context.projection);
expect(res).to.have.length.of.at.most(3);
});
});
describe('#sequences', function() {
it('returns sequence linestrings in the visible map area', function() {
var features = [
{ minX: 10, minY: 0, maxX: 10, maxY: 0, data: { key: 1, loc: [10, 0], ca: 90, pr: undefined, ne: 2, pano: true, sequenceKey: 1 } },
{ minX: 10, minY: 0, maxX: 10, maxY: 0, data: { key: 2, loc: [10, 0], ca: 90, pr: 1, ne: 3, pano: true, sequenceKey: 1 } },
{ minX: 10, minY: 1, maxX: 10, maxY: 1, data: { key: 3, loc: [10, 1], ca: 90, pr: 2, ne: undefined, pano: true, sequenceKey: 1 } }
];
streetside.cache().bubbles.rtree.load(features);
var seq = {
key: 1,
bubbles: features.map(function(f) { return f.data; }),
geojson: {
type: 'LineString',
properties: { key: 1 },
coordinates: features.map(function(f) { return f.data.loc; }),
}
};
streetside.cache().sequences[1] = seq;
var res = streetside.sequences(context.projection);
expect(res).to.deep.eql([seq.geojson]);
});
});
});