Build iD.Way.areaKeys from presets

This eliminates the possibility that a feature will
flip from area to line when you apply a preset.

Fixes #1996
This commit is contained in:
John Firebaugh
2013-11-21 13:53:06 -08:00
parent bc91c430a8
commit 8ec53185df
7 changed files with 101 additions and 30 deletions

View File

@@ -90,6 +90,12 @@ function generateFields() {
function generatePresets() {
var presets = {};
// A closed way is considered to be an area if it has a tag with one
// of the following keys, and the value is _not_ one of the associated
// values for the respective key.
var areaKeys = {};
glob.sync(__dirname + '/data/presets/presets/**/*.json').forEach(function(file) {
var preset = read(file),
id = file.match(/presets\/presets\/([^.]*)\.json/)[1];
@@ -101,10 +107,22 @@ function generatePresets() {
terms: (preset.terms || []).join(',')
};
for (var key in preset.tags) break;
var value = preset.tags[key];
if (['highway', 'footway', 'railway', 'type'].indexOf(key) === -1) {
if (preset.geometry.indexOf('area') >= 0) {
areaKeys[key] = areaKeys[key] || {};
} else if (key in areaKeys && value !== '*') {
areaKeys[key][value] = true;
}
}
presets[id] = preset;
});
fs.writeFileSync('data/presets/presets.json', stringify(presets));
fs.writeFileSync('js/id/core/area_keys.js', 'iD.Way.areaKeys = ' + stringify(areaKeys) + ';');
var presetsYaml = _.cloneDeep(translations);
_.forEach(presetsYaml.presets, function(preset) {

View File

@@ -1484,8 +1484,7 @@
"boundary/administrative": {
"name": "Administrative Boundary",
"geometry": [
"line",
"area"
"line"
],
"tags": {
"boundary": "administrative"

View File

@@ -1,8 +1,7 @@
{
"name": "Administrative Boundary",
"geometry": [
"line",
"area"
"line"
],
"tags": {
"boundary": "administrative"

View File

@@ -204,6 +204,7 @@
<script src='js/id/core/relation.js'></script>
<script src='js/id/core/way.js'></script>
<script src='js/id/core/tree.js'></script>
<script src='js/id/core/area_keys.js'></script>
<script src='js/id/presets.js'></script>
<script src='js/id/presets/preset.js'></script>

79
js/id/core/area_keys.js Normal file
View File

@@ -0,0 +1,79 @@
iD.Way.areaKeys = {
"aeroway": {
"gate": true,
"taxiway": true
},
"amenity": {
"atm": true,
"bench": true,
"drinking_water": true,
"post_box": true,
"telephone": true,
"vending_machine": true,
"waste_basket": true
},
"area": {},
"barrier": {
"block": true,
"bollard": true,
"cattle_grid": true,
"cycle_barrier": true,
"entrance": true,
"gate": true,
"kissing_gate": true,
"lift_gate": true,
"stile": true,
"toll_booth": true
},
"building": {
"entrance": true
},
"emergency": {
"fire_hydrant": true,
"phone": true
},
"historic": {
"boundary_stone": true
},
"landuse": {},
"leisure": {
"slipway": true
},
"man_made": {
"cutline": true,
"embankment": true,
"flagpole": true,
"pipeline": true,
"survey_point": true
},
"military": {},
"natural": {
"coastline": true,
"peak": true,
"spring": true,
"tree": true
},
"office": {},
"place": {},
"power": {
"line": true,
"minor_line": true,
"pole": true,
"tower": true
},
"public_transport": {
"stop_position": true
},
"shop": {},
"tourism": {
"viewpoint": true
},
"waterway": {
"canal": true,
"ditch": true,
"drain": true,
"river": true,
"stream": true,
"weir": true
}
};

View File

@@ -189,29 +189,3 @@ _.extend(iD.Way.prototype, {
});
}
});
// A closed way is considered to be an area if it has a tag with one
// of the following keys, and the value is _not_ one of the associated
// values for the respective key.
iD.Way.areaKeys = {
aeroway: { taxiway: true},
amenity: {},
area: {},
'area:highway': {},
building: {},
'building:part': {},
historic: {},
landuse: {},
leisure: {},
man_made: { cutline: true, embankment: true, pipeline: true},
military: {},
natural: { coastline: true },
office: {},
place: {},
power: {},
public_transport: {},
ruins: {},
shop: {},
tourism: {},
waterway: {}
};

View File

@@ -184,6 +184,7 @@
<script src='../js/id/core/relation.js'></script>
<script src='../js/id/core/way.js'></script>
<script src='../js/id/core/tree.js'></script>
<script src='../js/id/core/area_keys.js'></script>
<script src='../js/id/presets.js'></script>
<script src='../js/id/presets/preset.js'></script>