Страница 1 из 2
Проблема чтения SXF (предполож., когда PROJCS = "unnamed",.)
Добавлено: 21 мар 2016, 16:23
glax2020
Уже несколько лет пользуюсь драйвером GDAL для SXF (Панорама), и драйвер работает более менее хорошо. Стал работать с картами Росреестра 2015 (например, 2 км) и при построении карты для Чукотского региона столкнулся с новой проблемой:
При конвертации в формат MIF координаты для некоторых номенклатурных листов имеют вид (как будто в метрическом представлении), например:
PLINE MULTIPLE 1
2
28553018.5667654 7388224.78870856
28551428.5618826 7388534.78870856
а должны быть градусы типа 179.*** и т.д.
Лог драйвера густо пересыпан сообщениями об ошибках типа:
ERROR: Failed transform
И я обратил внимание, что SXF которые читаются нормально и обычно, то и сообщение об проекции типа:
exportToPrettyWkt: PROJCS["Pulkovo 1942 / Gauss-Kruger zone 29",
GEOGCS["Pulkovo 1942",
DATUM["Pulkovo_1942",
SPHEROID["Krassowsky 1940",6378245,298.3,
AUTHORITY["EPSG","7024"]],
TOWGS84[23.92,-141.27,-80.9,-0,0.35,0.82,-0.12],
AUTHORITY["EPSG","6284"]],
PRIMEM["Greenwich",0,
AUTHORITY["EPSG","8901"]],
UNIT["degree",0.0174532925199433,
AUTHORITY["EPSG","9122"]],
AUTHORITY["EPSG","4284"]],
PROJECTION["Transverse_Mercator"],
PARAMETER["latitude_of_origin",0],
PARAMETER["central_meridian",171],
PARAMETER["scale_factor",1],
PARAMETER["false_easting",29500000],
PARAMETER["false_northing",0],
UNIT["metre",1,
AUTHORITY["EPSG","9001"]],
AUTHORITY["EPSG","28429"]]
а в тех, которые не читаются, то подобный текст выглядит как, к примеру:
exportToPrettyWkt: PROJCS["unnamed",
GEOGCS["Pulkovo 1942",
DATUM["Pulkovo_1942",
SPHEROID["Krassowsky 1940",6378245,298.3,
AUTHORITY["EPSG","7024"]],
TOWGS84[23.92,-141.27,-80.9,-0,0.35,0.82,-0.12],
AUTHORITY["EPSG","6284"]],
PRIMEM["Greenwich",0,
AUTHORITY["EPSG","8901"]],
UNIT["degree",0.0174532925199433,
AUTHORITY["EPSG","9122"]],
AUTHORITY["EPSG","4284"]],
PROJECTION["Transverse_Mercator"],
PARAMETER["latitude_of_origin",0],
PARAMETER["central_meridian",0],
PARAMETER["scale_factor",1],
PARAMETER["false_easting",1500000],
PARAMETER["false_northing",0],
UNIT["Meter",1]]
Может из-за этого что не указана точно проекция ("unnamed" - значит не указана) и происходит ошибка в координатах?
Проверил как смотрится и экспортируются SXF в Панораме -- там все мною рассматриваемые SXF и экспортируются в MIF хорошо, с нормальными координатами (в градусах).
Обратим внимание, что часть номенклатурных листов для Чукотского региона граничит с градусом 180 (и здесь может быть скачок от 180 к -180, т.е. рядом могут быть координаты типа 179.998 и -179.998), но это у меня не вызывает проблемы, и проблемные SXF не граничат с координатой 180.0.
Моя версия программы опирается на версию GDAL SXF от 2014 года (в начале года писал, в конце года переносил правку для обновлений) и несколько недель назад проверял исправления для GDAL SXF и не заметил существенных исправлений.
Может Панорама умеет каким то образом обрабатывать корректно проекцию типа "unnamed", но я смотрел коды в драйвере и для меня сложно, как не специалисту по метрическим проекциям, в этом самостоятельно разобраться.
Может кто то сможет подсказать как быть в этом случае и есть ли возможность подправить версию драйвера GDAL SXF (возможно это уже исправлено, а я не обратил внимание, так как процесс адаптации новых изменений для меня не быстр и не прост к текущей версии GDAL) ?
Буду очень благодарен за ваши советы и замечания.
Спасибо
С уважением, Александр
Re: Проблема чтения SXF (предполож., когда PROJCS = "unnamed
Добавлено: 21 мар 2016, 19:24
glax2020
Проверил для последней стабильной версии GDAL (1700-gdal-1-11-3;
http://www.gisinternals.com/release.php):
Для SXF который зачитывается:
c:ogr2ogr -t_srs EPSG:4326 -f "MapInfo File" test2.mid "R-60-35,36.sxf" LAYER4
в результате, все успешно и test2.mid/mif успешно сформировался, с нормальными координатами в градусах
Для SXF который не зачитывается:
c:ogr2ogr -t_srs EPSG:4326 -f "MapInfo File" test.mid "Q-58-17,18.sxf" LAYER4
в результате : сформировались test.mid/mif
БЕЗ ДАННЫХ!
И сообщение об ошибке:
Warning 6: SXF. Given material may be rotated in the conditional system of coordinates
Failed to reproject feature 492 (geometry probably out of source or destination SRS).
ERROR 1: Terminating translation prematurely after failed
translation of layer LAYER4 (use -skipfailures to skip errors)
То есть следовательно, проблема существует и в текущей версии?
А в Панораме этот "Q-58-17,18.sxf" нормально открывается и экспортируется...
Re: Проблема чтения SXF (предполож., когда PROJCS = "unnamed
Добавлено: 21 мар 2016, 22:04
Дмитрий Барышников
Надо карту смотреть. Так с ходу не понятно, что не так. Если не для распространения - киньте в личку сбойные карты. Но быстро исправить не обещаю. Там еще вон по SXF тикет висит:
https://trac.osgeo.org/gdal/ticket/6357
Re: Проблема чтения SXF (предполож., когда PROJCS = "unnamed
Добавлено: 22 мар 2016, 08:47
glax2020
Добрый день, Дмитрий. Сбросил Вам в личку ссылку на сбойный SXF. Спасибо.
Re: Проблема чтения SXF (предполож., когда PROJCS = "unnamed
Добавлено: 04 апр 2016, 12:36
glax2020
Добрый день.
Не получается конвертировать в проекцию Пулково 1942, EPSG 4284 (CoordSys Earth Projection 1, 1001):
не работает:
c:ogr2ogr -t_srs EPSG:4284 -f "MapInfo File" test_1001.mid "Q-58-17,18.sxf" LAYER4
Warning 6: SXF. Given material may be rotated in the conditional system of coordinates
работает:
c:ogr2ogr -t_srs EPSG:4326 -f "MapInfo File" test.mid "Q-58-17,18.sxf" LAYER4
---
Хочу попробовать самостоятельно в драйвере посчитать координаты и оценить погрешность, но "точные" координаты для номенклатурных листов в градусах у меня представлены в проекции Пулково 1942, EPSG 4284 (CoordSys Earth Projection 1, 1001)) в виде таблицы MapInfo, и чтобы провести простую линейную интерполяцию при расчете, полагаю что надо научиться проводить и выводить расчеты и экспорт таблиц в формате EPSG:4284 в драйвере при работе с форматом SXF, но пока у меня не получается.
Может кто подскажет как это делать правильно, или в чем у меня ошибка. Спасибо.
Re: Проблема чтения SXF (предполож., когда PROJCS = "unnamed
Добавлено: 04 апр 2016, 13:09
glax2020
Может быть, можно информацией из MapInfo воспользоваться:
OGRFeature(Datum8parameters):2
Datum# (String) = 1001
Datum_Name (String) = Pulkovo 1942
Ellipsoid_Name (String) = ELLIPSOID_KRASSOVSKY
ShiftX (Real) = 24
ShiftY (Real) = -123
ShiftZ (Real) = -94
RotationX (Real) = -0.02
RotationY (Real) = 0.25
RotationZ (Real) = 0.13
scale_ppm (Real) = 1.1
Prime_Meridian (Real) = 0
Но как из нее получить строку в формате GDAL по аналогии с (WGS 84, EPSG 4326 (CoordSys Earth Projection 1, 104)):
oDstSpaRef.SetProjection("+proj=utm +zone=36 +datum=WGS84 +units=m +no_defs ");
Непонятно 
Может кто то сможет помочь? Спасибо
Re: Проблема чтения SXF (предполож., когда PROJCS = "unnamed
Добавлено: 04 апр 2016, 13:46
glax2020
Нашел в инете строку
+proj=longlat +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +no_defs
ссылка:
https://trac.osgeo.org/gdal/ticket/3176
но по прежнему не работает
Пример:
Version 300
Charset "Neutral"
Delimiter ","
CoordSys NonEarth Units "m"
Columns 10
ogc_fid Integer
CLCODE Integer
CLNAME Char(32)
OBJECTNUMB Integer
ANGLE Float
TEXT Char(254)
SC_75 Float
SC_3 Float
SC_76 Char(254)
SC_77 Float
Data
PLINE MULTIPLE 1
71
28368794.8805774 7429613.13321382
28369156.3503039 7429976.64883882
...
Примечание: в принципе границы номенклатурного листа в градусах мне известны: 162, 66.666666666, 164, 67.333333333 (Q-58-07,08.sxf - 2 км. номенклатурный лист)
Re: Проблема чтения SXF (предполож., когда PROJCS = "unnamed
Добавлено: 04 апр 2016, 20:11
glax2020
Попробовал идею "по простому" использовать для номенклатурных листов, с неопределенной проекцией типа PROJCS "unnamed", использовать линейную интерполяцию и результате, как и ожидалось -- "простое" решение не привело к удовлетворительному результату.
Взял один контрольный участок из Layer1 в проекции Пулково 1942, EPSG 4284 (CoordSys Earth Projection 1, 1001):
C помощью корректного GDAL (версия GDAL от 2014 года, экспорт в EPSG 4326, а затем с использованием MapInfo в 4284 ):
Код: Выделить всё
Region 1
10
162.17268 67.262529
162.175448 67.262903
162.182794 67.264913
162.185526 67.266363
162.183153 67.267963
162.180373 67.267948
162.17531 67.266846
162.170733 67.265209
162.170319 67.263773
162.17268 67.262529
Pen (1,2,0)
Brush (1,0,16777215)
Center 162.177922 67.265246
C помощью стандартного GDAL (версия от 2016 года, экспорт в EPSG 4326, а затем с использованием MapInfo в 4284 ):
Код: Выделить всё
Region 1
10
162.17268 67.262529
162.175448 67.262903
162.182794 67.264913
162.185526 67.266363
162.183153 67.267963
162.180373 67.267948
162.17531 67.266846
162.170733 67.265209
162.170319 67.263773
162.17268 67.262529
Pen (1,2,0)
Brush (1,0,16777215)
Center 162.177922 67.265246
C помощью стандартного GDAL ( версия от 2016 года, экспорт в EPSG 4284, напрямую ):
c:ogr2ogr -s_srs EPSG:28428 -t_srs EPSG:4284 -f "MapInfo File" test.mid "Q-58-07,08.sxf" LAYER1
Код: Выделить всё
Region 1
10
162.17268 67.262529
162.175448 67.262903
162.182794 67.264913
162.185526 67.266363
162.183153 67.267963
162.180373 67.267948
162.17531 67.266846
162.170733 67.265209
162.170319 67.263773
162.17268 67.262529
Pen (1,2,0)
Brush (1,0,16777215)
Center 162.177922 67.265246
С помощью Панорамы:
Код: Выделить всё
Region 1
10
162.172147 67.262283
162.174914 67.262656
162.182260 67.264666
162.184992 67.266115
162.182619 67.267717
162.179839 67.267702
162.174777 67.266600
162.170200 67.264962
162.169785 67.263526
162.172147 67.262283
Pen (1,2,0)
Brush (2,43008,0)
Линейная интерполяция для 2 км. листа (упрощенный алгоритм). Мне известны границы в градусах, и из SXF могу извлечь границы в метрах:
MaxX = 28456978.921929
MinX = 28367390.334679
MaxY = 7474776.448233
MinY = 7397663.720806
Итак, в результате:
Код: Выделить всё
Region 1
10
162.23712704492 67.2618797139006
162.239832663857 67.2621926857718
162.24713045533 67.2640048325868
162.249923278454 67.2653544024171
162.247820349462 67.2669373292078
162.245143616913 67.2669701714138
162.240147470975 67.2659941078037
162.235557587548 67.2644941730145
162.23499501153 67.2631178397412
162.23712704492 67.2618797139006
Pen (1,2,0)
Brush (1,0,16777215)
Примечание: как можно видеть версии за разные годы GDAL работают одинаково, и нет разницы если выводить напрямую в формат 4284, или опосредовано через формат 4326 и используя MapInfo.
Как можно видеть, GDAL и Панорама работают более менее согласовано, а для линейной интерполяции (упрощенный метод) погрешность неудовлетворительная
Так что мне пока самостоятельно с этой проблемой справится на программном уровне не удалось
Примечание: выводить с помощью GDAL в проекции Пулково 1942, EPSG 4284 (CoordSys Earth Projection 1, 1001) так и не научился (корректировал в качестве "врезки" функции "TransformEx" и "MIFFile::WriteMIFHeader")

Re: Проблема чтения SXF (предполож., когда PROJCS = "unnamed
Добавлено: 04 апр 2016, 20:50
Игорь Белов
А почему не использовать опцию "-s_srs"?
Re: Проблема чтения SXF (предполож., когда PROJCS = "unnamed
Добавлено: 04 апр 2016, 21:25
glax2020
Идею принимаю. Попробовал:
c:ogr2ogr -s_srs EPSG:4284 -f "MapInfo File" test_1001s.mid "Q-58-17,18.sxf" LAYER4
Usage: ogr2ogr [--help-general] [-skipfailures] [-append] [-update]
[-select field_list] [-where restricted_where]
[-progress] [-sql <sql statement>] [-dialect dialect]
[-preserve_fid] [-fid FID]
[-spat xmin ymin xmax ymax] [-geomfield field]
[-a_srs srs_def] [-t_srs srs_def] [-s_srs srs_def]
[-f format_name] [-overwrite] [[-dsco NAME=VALUE] ...]
dst_datasource_name src_datasource_name
[-lco NAME=VALUE] [-nln name] [-nlt type] [-dim 2|3|layer_dim] [layer [layer ...]]
Advanced options :
[-gt n]
[-clipsrc [xmin ymin xmax ymax]|WKT|datasource|spat_extent]
[-clipsrcsql sql_statement] [-clipsrclayer layer]
[-clipsrcwhere expression]
[-clipdst [xmin ymin xmax ymax]|WKT|datasource]
[-clipdstsql sql_statement] [-clipdstlayer layer]
[-clipdstwhere expression]
[-wrapdateline][-datelineoffset val]
[[-simplify tolerance] | [-segmentize max_dist]]
[-addfields]
[-relaxedFieldNameMatch]
[-fieldTypeToString All|(type1[,type2]*)] [-unsetFieldWidth]
[-fieldmap identity | index1[,index2]*]
[-splitlistfields] [-maxsubfields val]
[-explodecollections] [-zfield field_name]
[-gcp pixel line easting northing [elevation]]* [-order n | -tps]
Note: ogr2ogr --long-usage for full help.
FAILURE: if -s_srs is specified, -t_srs must also be specified
---
Итого: не получилось.
Насколько я представляю: -s_srs -- уже "зашит" в SXF, и наши возможности -- управлять -t_srs , т.е. проекцией вывода.
Re: Проблема чтения SXF (предполож., когда PROJCS = "unnamed
Добавлено: 04 апр 2016, 21:25
glax2020
del
Re: Проблема чтения SXF (предполож., когда PROJCS = "unnamed
Добавлено: 04 апр 2016, 21:41
Игорь Белов
Вашего файла не видел, просто предположил, что из этого
Warning 6: SXF. Given material may be rotated in the conditional system of coordinates
и этого
CoordSys NonEarth Units "m"
следует, что ogr2ogr не видит его систему координат. А текст
FAILURE: if -s_srs is specified, -t_srs must also be specified
может означать: «назвал исходную проекцию, назови выходную». Тем более что в цифрах у Вас на входе что-то похожее на EPSG:28428 "Pulkovo 1942 / Gauss-Kruger zone 28", а на выходе EPSG:4284 "Pulkovo 1942", что совсем не одно и то же.
Re: Проблема чтения SXF (предполож., когда PROJCS = "unnamed
Добавлено: 04 апр 2016, 21:52
glax2020
del
Re: Проблема чтения SXF (предполож., когда PROJCS = "unnamed
Добавлено: 04 апр 2016, 22:01
glax2020
Спасибо. Получилось!
c:ogr2ogr -s_srs EPSG:28428 -t_srs EPSG:4284 -f "MapInfo File" test_1001s.mid "Q-58-17,18.sxf" LAYER
Re: Проблема чтения SXF (предполож., когда PROJCS = "unnamed
Добавлено: 06 апр 2016, 19:07
glax2020
Дмитрий Барышников писал(а):Надо карту смотреть. Так с ходу не понятно, что не так. Если не для распространения - киньте в личку сбойные карты. Но быстро исправить не обещаю. Там еще вон по SXF тикет висит:
https://trac.osgeo.org/gdal/ticket/6357
Добрый день, Дмитрий!
Кажется для моего алгоритма есть позитивный результат, и похоже этот результат меня сможет удовлетворить, до времени когда предположительно будет исправлено.
Суть моего решения:
Предварительно самостоятельно вычисляю параметр "-s_srs" и передаю в программу GDAl-CPP (кажется Ваш модуль за основу взял и его развивал , причем основную обработку семантики веду в независимой программе на C#). Далее моя правка (в модуле "ogr_sxfdriver.cpp"; в реальном коде вероятно буду делать две попытки: стандартную "pSrcSpaRef->exportToPrettyWkt(&pSpaRefDef)", там же по коду и в случае ошибки делать вторую попытку по параметру типа "-s_srs", в моем коде "glushko_s_srs"):
Код: Выделить всё
OGRSpatialReference* pSrcSpaRef = glushko_s_srs[0] ? (OGRSpatialReference*)OSRNewSpatialReference(NULL) : pSrcLayer->GetSpatialRef(); // - glushko_s_srs
if ( glushko_s_srs[0] ) {
if( pSrcSpaRef->SetFromUserInput( glushko_s_srs ) != OGRERR_NONE ) // - glushko_s_srs
{
fprintf( stderr, "Failed to process SRS definition: %s (glushko_s_srs)\n",
glushko_s_srs );
exit( 1 );
}
}
После этого заработало. Пример: был сбой в обработке "Q-58-09,10.sxf" ( это 2 км. номенклатурный лист). После моей правки:
в качестве параметра передал (glushko_s_srs): EPSG:28428
Контрольный фрагмент (из LAYER1.mif).
расчет с помощью этого модуля GDAL:
Код: Выделить всё
11
164.504043 67.333578
164.502786 67.332507
164.501414 67.331427
164.49911 67.330514
164.495402 67.329981
164.493543 67.329966
164.489353 67.330312
164.488392 67.331744
164.487888 67.33358
164.500556 67.333576
164.504043 67.333578
Вывод с помощью Панорама
Код: Выделить всё
11
164.503489 67.333334
164.502232 67.332263
164.500860 67.331183
164.498555 67.330270
164.494848 67.329739
164.492989 67.329724
164.488798 67.330069
164.487838 67.331501
164.487334 67.333337
164.500002 67.333332
164.503489 67.333334
По моему качество погрешности удовлетворительное и обычное.
Надеюсь, что это послужит решению моей проблемы.
Всем спасибо.
p.s. А в стандартном GDAL соответствующая команда работает:
c:ogr2ogr -s_srs EPSG:28428 -t_srs EPSG:4284 -f "MapInfo File" problem_test1001.mid "Q-58-09,10.sxf" LAYER1
Только в этом случае на пользователя возлагается необходимость использования параметра "-s_srs", а умение правильно устанавливать этот параметр кажется не совсем элементарно для общего пользоавателя.