kopia lustrzana https://github.com/osm2vectortiles/osm2vectortiles
				
				
				
			
		
			
				
	
	
		
			157 wiersze
		
	
	
		
			3.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
			
		
		
	
	
			157 wiersze
		
	
	
		
			3.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
| var fs = require('fs');
 | |
| var VectorTile = require('vector-tile').VectorTile;
 | |
| var Protobuf = require('pbf');
 | |
| 
 | |
| function getTileInfo(layers) {
 | |
| 	var layerCount = 0;
 | |
| 	var featureCount = 0;
 | |
| 	var classSet = new Set();
 | |
| 	var typeSet = new Set();
 | |
| 
 | |
| 	for(var i in layers) {
 | |
| 		++layerCount;
 | |
| 		var layer = layers[i];
 | |
| 		featureCount += layer.length;
 | |
| 		for(var j = 0; j < layer.length; ++j) {
 | |
| 			var feature = layer.feature(j);
 | |
| 			if(feature.properties.class) {
 | |
| 				classSet.add(feature.properties.class);
 | |
| 			}
 | |
| 			if(feature.properties.type) {
 | |
| 				typeSet.add(feature.properties.class);
 | |
| 			}
 | |
| 		}
 | |
| 	}
 | |
| 	return { "layers": layerCount, "features": featureCount, "classes": classSet.size, "types": typeSet.size };
 | |
| }
 | |
| 
 | |
| function containsClass(classSet, className) {
 | |
| 	var containsClass = false;
 | |
| 	for(var item of classSet) {
 | |
| 		if(item.name === className) {
 | |
| 			containsClass = true;
 | |
| 			return containsClass;
 | |
| 		} else {
 | |
| 			containsClass = false;
 | |
| 		}
 | |
| 	}
 | |
| 	return containsClass;
 | |
| }
 | |
| 
 | |
| function addType(classSet, className, type) {
 | |
| 	for(var item of classSet) {
 | |
| 		if(item.name === className) {
 | |
| 			if(type) {
 | |
| 				item.types.add(type);
 | |
| 			} else {
 | |
| 				item.types.add("no type");
 | |
| 			}
 | |
| 		}
 | |
| 	}
 | |
| 	return classSet;
 | |
| }
 | |
| 
 | |
| function addClass(classSet, className, type) {
 | |
| 	var layerClass = {
 | |
| 		"name": className,
 | |
| 		"types": new Set()
 | |
| 	};
 | |
| 
 | |
| 	if(type) {
 | |
| 		layerClass.types.add(type);
 | |
| 	} else {
 | |
| 		layerClass.types.add("no type");
 | |
| 		//layerClass.types.add(layer.feature(i).properties);
 | |
| 	}
 | |
| 	classSet.add(layerClass);
 | |
| 	return classSet;
 | |
| }
 | |
| 
 | |
| function getSortedItems(unsortedItems, sortByName) {
 | |
| 	var sortedItems = [];
 | |
| 	for(var unsortedItem of unsortedItems) {
 | |
| 		sortedItems.push(unsortedItem);
 | |
| 	}
 | |
| 	if(sortByName) {
 | |
| 		sortedItems.sort(function(a, b) { 
 | |
| 		    if(a.name > b.name) {
 | |
| 		      return 1;
 | |
| 		    }
 | |
| 		    if (a.name < b.name) {
 | |
| 		      return -1;
 | |
| 		    }
 | |
| 			return 0;
 | |
| 		});
 | |
| 	} else {
 | |
| 		sortedItems.sort();
 | |
| 	}
 | |
| 	return sortedItems;
 | |
| }
 | |
| 
 | |
| function getSortedLayers(layers) {
 | |
| 	var sortedLayerNames = [];
 | |
| 	for(var i in layers) {
 | |
| 		sortedLayerNames.push(i);
 | |
| 	}
 | |
| 	sortedLayerNames.sort();
 | |
| 	var sortedLayers = [];
 | |
| 	for(var layerName of sortedLayerNames) {
 | |
| 		sortedLayers.push({"name": layerName, "layer": layers[layerName]});
 | |
| 	}
 | |
| 	return sortedLayers;
 | |
| }
 | |
| 
 | |
| function getLayerResult(layerObject, amountOfFeatures) {
 | |
| 	console.log("\n" + layerObject.name + " (features: " + amountOfFeatures + ")");
 | |
| 
 | |
| 	var classSet = new Set();
 | |
| 	for(var j=0; j < layerObject.layer.length; ++j) {
 | |
| 		var properties = layerObject.layer.feature(j).properties;
 | |
| 		var className = properties.class;
 | |
| 		var type = properties.type;
 | |
| 		if(className) {
 | |
| 			if(containsClass(classSet, className)){
 | |
| 				classSet = addType(classSet, className, type);
 | |
| 			} else {
 | |
| 				classSet = addClass(classSet, className, type);
 | |
| 			}
 | |
| 		}
 | |
| 	}
 | |
| 	return classSet;
 | |
| }
 | |
| 
 | |
| function printLayerResult(classSet) {
 | |
| 	if(classSet.size === 0) {
 | |
| 		console.log("\t"+" no class")
 | |
| 	} else {
 | |
| 		for(var item of getSortedItems(classSet, true)) {
 | |
| 			console.log("\t"+item.name);
 | |
| 			for(var sortedType of getSortedItems(item.types)) {
 | |
| 				console.log("\t" + "\t" + sortedType);
 | |
| 			}
 | |
| 		}
 | |
| 	}
 | |
| }
 | |
| 
 | |
| function printProlog(layers) {
 | |
| 	var tileInfo = getTileInfo(layers);
 | |
| 	console.log("name: open-streets");
 | |
| 	console.log("tile: 10/4141/5356");
 | |
| 	console.log("features: " + tileInfo.features);
 | |
| 	console.log("layers: " + tileInfo.layers);
 | |
| 	console.log("classes: " + tileInfo.classes);
 | |
| 	console.log("types: " + tileInfo.types);
 | |
| }
 | |
| 
 | |
| function printResult(layers) {
 | |
| 	var layerArray = getSortedLayers(layers);
 | |
| 	for(var i in layerArray) {
 | |
| 		var layerObject = layerArray[i];
 | |
| 		printLayerResult(getLayerResult(layerObject, layers[layerObject.name].length));
 | |
| 	}
 | |
| }
 | |
| 
 | |
| var tile = new VectorTile(new Protobuf(fs.readFileSync('./vector.pbf')));
 | |
| printProlog(tile.layers);
 | |
| printResult(tile.layers);
 |