To solve the optimization problem described, we first need to translate the natural language description into a symbolic representation. This involves defining variables and formulating the objective function and constraints algebraically.

Let's define:
- \(x_1\) as the number of acres of oak trees.
- \(x_2\) as the number of acres of elm trees.

The objective is to maximize profit, given that the profit per acre of oak trees is $1000 and the profit per acre of elm trees is $1200. Thus, the objective function can be written as:
\[ \text{Maximize:} \quad 1000x_1 + 1200x_2 \]

The constraints based on the problem description are:
1. The total land used cannot exceed 300 acres: \( x_1 + x_2 \leq 300 \).
2. At least 50 acres of oak trees must be grown: \( x_1 \geq 50 \).
3. At least 70 acres of elm trees must be grown: \( x_2 \geq 70 \).
4. The amount of elm trees cannot exceed twice the amount of oak trees: \( x_2 \leq 2x_1 \).

Thus, the symbolic representation of the problem is:
```json
{
    'sym_variables': [('x1', 'acres of oak trees'), ('x2', 'acres of elm trees')],
    'objective_function': '1000*x1 + 1200*x2',
    'constraints': [
        'x1 + x2 <= 300',
        'x1 >= 50',
        'x2 >= 70',
        'x2 <= 2*x1'
    ]
}
```

To solve this problem using Gurobi in Python, we will use the following code:

```python
from gurobipy import *

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

# Define variables
x1 = m.addVar(lb=0, vtype=GRB.CONTINUOUS, name="oak_trees")
x2 = m.addVar(lb=0, vtype=GRB.CONTINUOUS, name="elm_trees")

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

# Add constraints
m.addConstr(x1 + x2 <= 300, "total_land")
m.addConstr(x1 >= 50, "min_oak")
m.addConstr(x2 >= 70, "min_elm")
m.addConstr(x2 <= 2*x1, "elm_to_oak_ratio")

# Optimize the model
m.optimize()

# Print the results
for v in m.getVars():
    print(f"{v.varName}: {v.x}")

print("Objective:", m.objVal)
```
```python
from gurobipy import *

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

# Define variables
x1 = m.addVar(lb=0, vtype=GRB.CONTINUOUS, name="oak_trees")
x2 = m.addVar(lb=0, vtype=GRB.CONTINUOUS, name="elm_trees")

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

# Add constraints
m.addConstr(x1 + x2 <= 300, "total_land")
m.addConstr(x1 >= 50, "min_oak")
m.addConstr(x2 >= 70, "min_elm")
m.addConstr(x2 <= 2*x1, "elm_to_oak_ratio")

# Optimize the model
m.optimize()

# Print the results
for v in m.getVars():
    print(f"{v.varName}: {v.x}")

print("Objective:", m.objVal)
```