Сгенерированный Flopy шейп-файл не учитывает значение MODFLOW DIS lenuni? - PullRequest
0 голосов
/ 08 апреля 2020

Я использовал Flopy для генерации шейп-файла полигональных объектов, представляющих функции пакета MODFLOW River. Однако размер объектов многоугольника ячейки сетки в шейп-файле в 3,28 раза больше, чем должен быть. Единицы длины моей модели указаны в футах (переменная LENUNI в пакете дискретизации MODFLOW моей модели равна 1), и я использую зону NN83 / UTM 16N (единица длины - метры, EPSG: 26916). Таким образом, похоже, что преобразование между единицами измерения MODFLOW (в футах) и системой координат ГИС (в метрах) по какой-то причине не происходит.

Начало координат и поворот сетки в сгенерированном Flopy шейп-файле выглядят хорошо. Вот код Flopy, используемый для генерации шейп-файла:

model_ws = os.getcwd()
m = flopy.modflow.Modflow.load("model.nam", model_ws=model_ws, verbose=False,
                               check=False, exe_name="MODFLOW-NWT_64.exe")

grid = m.modelgrid
delr = grid.delr
delc = grid.delc
xll =  660768.2212
yll = 3282397.889
rot = -16.92485016
model_epsg = 26916
m.modelgrid.set_coord_info(xoff=xll, yoff=yll, angrot=rot, epsg='EPSG:26916')

m.riv.stress_period_data.export('{0}/riv_features.shp'.format(model_ws), sparse=True)

Когда выполняется последняя строка кода, шейп-файл записывается на диск, но следующие сообщения об ошибках предшествуют сообщению, подтверждающему, что шейп-файл был выведен :

(<class 'urllib.error.HTTPError'>, <HTTPError 404: 'NOT FOUND'>, <traceback object at 0x11646208>)
No internet connection or epsg code EPSG:26916 not found at https://spatialreference.org/ref/epsg/EPSG:26916/esriwkt
No internet connection or epsg code EPSG:26916 not found at https://spatialreference.org/ref/esri/EPSG:26916/esriwkt

URL-адрес, связанный с вышеуказанными сообщениями об ошибках: https://spatialreference.org/ref/epsg/EPSG: 26916 / esriwkt . Этот URL отображал следующее:

Не найдено, / ref / epsg / EPSG: 26916 / esriwkt.

Так может ли быть проблема в том, что Flopy не получает нужную информацию с пространственного пространства.org? Если да, является ли URL, который генерирует Flopy, неверным? Есть ли в моем коде что-то неправильное?

Большое спасибо.

1 Ответ

0 голосов
/ 08 апреля 2020

Таким образом, соответствующий код в get_spatialreference объекта CRS находится в shapefile_utils.py. Таким образом, очевидно, что этот epsg не хранится в локальной базе данных epsg. json, поэтому он вызывает пространственную привязку.org. Я не знаю всех подробностей, почему, но похоже, что проекция, которую вы ищете, кодируется на веб-сайте по-разному:

https://spatialreference.org/ref/epsg/nad83-utm-zone-16n/

Более того , если вы нажмете на ссылку esri wkt, вы получите следующий рабочий URL:

https://spatialreference.org/ref/epsg/nad83-utm-zone-16n/esriwkt/

Может быть, это должно быть решено в некоторый момент в коде дискеты как проблема, если вы хотите открыть ее (хотя учет всех крайних случаев CRS является сложной задачей). Однако в то же время, я думаю, вы можете обойти это, назначив epsg следующее значение:

m.modelgrid.set_coord_info(xoff=xll, yoff=yll, angrot=rot, epsg='nad83-utm-zone-16n')

Или, если это не идеально, вы сможете добавить его в функцию экспорта:

.riv.stress_period_data.export('{0}/riv_features.shp'.format(model_ws), sparse=True, epsg='nad83-utm-zone-16n')

Таким образом, правильный URL будет вызываться при получении информации CRS. Дайте мне знать, если у вас есть какие-либо проблемы.

РЕДАКТИРОВАТЬ:

Я посмотрю, если Flopy может обрабатывать преобразования длины единицы. В то же время, поскольку вы являетесь пользователем python, вы можете сделать следующее, чтобы масштабировать свои векторы, если вы установите geo pandas:

import geopandas as gpd
from shapely.ops import unary_union
df = gpd.read_file(proj_path + '/polytest.shp') #replace with your file location
union = unary_union(df.geometry.values)
df.geometry = df.geometry.scale(xfact=.304878,yfact=.304878, origin=union.centroid)  #You may require another origin possibly
df.to_file(proj_path + '/new_shapes.shape')

Это должно помочь вам в этом.

...