public void simplificarNodos(String key, List<Shape> shapes, double threshold) {
		
		// Recorremos todos los shapes
		for(Shape shape : shapes){
			// Todos sus poligonos
			for(int pos = 0; pos < shape.getPoligons().size(); pos++)
				// De cada poligono todos sus ways
				for(WayOsm way : utils.getWays(key, shape.getWaysIds(pos))){
						// Recorrer todos los nodos en grupos de 3
						for(int nodePos = 0; nodePos < way.getNodes().size()-2; nodePos++){
							
							// Nodo intermedio
							long nodeId = way.getNodes().get(nodePos+1);
							NodeOsm b = 
									((NodeOsm) utils.getKeyFromValue((Map< String, Map <Object, Long>>) ((Object)utils.getTotalNodes()), key, nodeId));
							
							// Si existe el nodo y no tiene tags (o solo tiene las de source=catastro y fecha)
								if(b != null && !Cat2OsmUtils.hasRelevantTags(b.getTags())){

									// Coger su anterior y siguiente
									NodeOsm a = 
											((NodeOsm) utils.getKeyFromValue((Map< String, Map <Object, Long>>) ((Object)utils.getTotalNodes()), key, way.getNodes().get(nodePos)));
									NodeOsm c = 
											((NodeOsm) utils.getKeyFromValue((Map< String, Map <Object, Long>>) ((Object)utils.getTotalNodes()), key, way.getNodes().get(nodePos+2)));

									if (a != null && c != null){
										// Calcular si estan en linea recta
										double result = (b.getX()-a.getX())/(c.getX()-b.getX()) - (b.getY()-a.getY())/(c.getY()-b.getY());

										// Si se cumple, eliminar el nodo intermedio
										if(Math.abs(result) <= threshold){
											// nodeId tiene el ID del nodo b
											way.getNodes().remove(nodeId);
											nodePos = 0;
										}
									}
									else
										System.out.println(a + " " + c);
							}
						}
				}
		}
	}