Как отобразить контуры просадки, рассчитанные с помощью уравнения Тейса, для отображения на интерактивной карте в Dash сPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Как отобразить контуры просадки, рассчитанные с помощью уравнения Тейса, для отображения на интерактивной карте в Dash с

Сообщение Anonymous »

Я создал приложение Dash, используя Python, с интерактивной картой, используя Mapbox. Я хочу сгенерировать контуры просадки с интервалом 10 футов до просадки в 1 фут вокруг заданной широты/долготы, используя уравнение Тайса. Я только начал учиться программировать несколько месяцев назад, поэтому уверен, что есть простое решение, но я действительно борюсь с этим. Буду очень признателен за любую помощь в этом вопросе!
Пока моя карта отображает контуры просадки, но это не настоящие круги. В настоящее время код генерирует точки по кругу вокруг широты и долготы с интервалом 10 футов на расстоянии до 10 000 футов, вычисляет просадку в каждой точке с помощью Theis, затем соединяет точки с помощью прямых линий и отображает их на карте с помощью Scattermapbox.
Проблема в том, что я не хочу каждый раз указывать это точное расстояние для расчета просадки. Что мне действительно нужно, так это генерировать концентрические круги вокруг широты/долготы до контура просадки на 1 фут, независимо от того, насколько далеко этот круг просадки должен находиться от исходной точки широты/долготы. Мне посоветовали использовать matplotlib вместоplotly, но я не уверен, возможно ли это в Dash.
Выше раздела @app.callback я использую это :
# Contour lines
distance = np.append(np.arange(1,1000,10), np.append(np.arange(100, 2500, 100), np.arange(2500,10000,250)))
distance = np.append(distance, np.arange(10000,105000,1000)) # distance, feet
ci = 10 # default contour interval, feet

def generate_contour_points(lat, lon, distance, angles):
"""
Generate points in a circular pattern around a given lat/lon for the contour lines.
Parameters:
- lat: Latitude of the center point (decimal degrees).
- lon: Longitude of the center point (decimal degrees).
- distance: Array of radial distances for contour levels (in feet).
- angles: Array of angles (in degrees) to calculate the radial points.
Returns:
- List of points representing contour lines.
"""
contour_points = []

for i in distance: # Loop over each distance (for each contour level)
contour_level_points = [] # List to store points for each contour level

for angle in angles: # Loop over each angle
# Convert angle to radians
angle_rad = np.deg2rad(angle)

# Calculate the new x, y coordinates using polar to Cartesian conversion
x_offset = i * np.sin(angle_rad)
y_offset = i * np.cos(angle_rad)

# Convert to geographic coordinates (lat/lon) using distance
lat_offset = x_offset / 364000.0 # Approximate conversion from feet to degrees latitude
lon_offset = y_offset / (364000.0 * np.cos(np.radians(lat))) # Approximate conversion for longitude

contour_level_points.append([lat + lat_offset, lon + lon_offset])

contour_points.append(contour_level_points)

return contour_points

def calculate_drawdown_at_points(lat, lon, distance, angles, transmissivity, storativity, discharge, time):
"""
Calculate the drawdown at each point generated by generate_contour_points.
"""
contour_points = generate_contour_points(lat, lon, distance, angles)
drawdowns = []

for contour_level_points in contour_points:
drawdown_level = []
for point in contour_level_points:
r = np.sqrt((point[0] - lat)**2 + (point[1] - lon)**2) * 3963.0 # Convert to miles
drawdown = theis_con(transmissivity, storativity, r, discharge, time)
drawdown_level.append(drawdown)
drawdowns.append(drawdown_level)

return drawdowns, contour_points

def plot_contours_on_map(contour_points, drawdowns):
"""
Plot the contour lines on the map.
"""
contour_traces = []

for contour_level, drawdown_level in zip(contour_points, drawdowns):
contour_traces.append(go.Scattermapbox(
lat=[point[0] for point in contour_level],
lon=[point[1] for point in contour_level],
mode='lines',
line=dict(width=2, color='blue'),
name=f"Drawdown: {min(drawdown_level)} to {max(drawdown_level)} ft"
))

return contour_traces

В моем разделе @app.callback я сейчас использую это:
inc = 20
angles = np.arange(inc,360+inc, inc)

# Generate points for contour lines
distanceone = np.arange(10, 10000, 1000) # Example distance array (1 ft to 1000 ft)
angles = np.linspace(0, 360, 36) # Angles from 0° to 360° (every 10 degrees)

# Calculate drawdowns at the generated points
drawdowns, contour_points = calculate_drawdown_at_points(lat, lon, distanceone, angles, transmissivity, storativity, discharge, time=365)

# Plot contour lines on the map
contour_traces = plot_contours_on_map(contour_points, drawdowns)


Подробнее здесь: https://stackoverflow.com/questions/793 ... -display-o
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»