To solve the given optimization problem, we first need to convert the natural language description into a symbolic representation. Let's denote the number of cars washed as $x_1$ and the number of buses washed as $x_2$. The objective is to maximize earnings.

The earnings from washing cars can be calculated as $50x_1$ since each car earns $50, and the earnings from washing buses can be calculated as $75x_2$ since each bus earns $75. Therefore, the total earnings, which we want to maximize, can be represented by the objective function: $50x_1 + 75x_2$.

The constraints are based on the available resources:
1. Time for watering: Each car takes 30 minutes, and each bus takes 50 minutes. The company has 5000 minutes available. This constraint can be written as $30x_1 + 50x_2 \leq 5000$.
2. Soap cost: Each car requires $10 worth of soap, and each bus requires $20 worth of soap. The company has $1500 worth of soap available. This constraint can be written as $10x_1 + 20x_2 \leq 1500$.

Additionally, the number of cars and buses washed cannot be negative, so we have non-negativity constraints: $x_1 \geq 0$ and $x_2 \geq 0$.

Now, let's represent this problem symbolically:
```json
{
    'sym_variables': [('x1', 'number of cars'), ('x2', 'number of buses')],
    'objective_function': '50*x1 + 75*x2',
    'constraints': ['30*x1 + 50*x2 <= 5000', '10*x1 + 20*x2 <= 1500', 'x1 >= 0', 'x2 >= 0']
}
```

To solve this linear programming problem using Gurobi in Python, we will use the following code:
```python
from gurobipy import *

# Create a new model
m = Model("Car_Bus_Washing")

# Add variables to the model
x1 = m.addVar(lb=0, vtype=GRB.INTEGER, name="cars")
x2 = m.addVar(lb=0, vtype=GRB.INTEGER, name="buses")

# Set the objective function
m.setObjective(50*x1 + 75*x2, GRB.MAXIMIZE)

# Add constraints to the model
m.addConstr(30*x1 + 50*x2 <= 5000, "watering_time")
m.addConstr(10*x1 + 20*x2 <= 1500, "soap_cost")

# Optimize the model
m.optimize()

# Print the results
if m.status == GRB.OPTIMAL:
    print(f"Optimal solution found: {x1.varName} = {x1.x}, {x2.varName} = {x2.x}")
    print(f"Maximum earnings: {m.objVal}")
else:
    print("No optimal solution found")
```