Страница 1 из 1

Назначение проекции

Добавлено: 25 авг 2020, 15:04
Slinger
QGIS 3.10.8. Имеется кастомная проекция МСК 47, зона 2

Код: Выделить всё

+proj=tmerc +lat_0=0 +lon_0=30.95 +k=1 +x_0=2250000 +y_0=-6211057.628 +ellps=krass +towgs84=24,-123,-94,0.02,-0.25,-0.13,1.1 +units=m +no_defs
имеется шейп в нужных мне координатах, но без проекции. Выбираю "Вектор - назначить проекцию", выбираю МСК-47, создаю временный слой. Проверяю, что он в нормальной, выбранной мной проекции. И попадает он туда, куда нужно мне. После чего экспортирую временный слой в нормальный шейп. Открыв шейп, обнаруживаю, что потерялся параметр towgs84. И полученная проекция выглядит так.
image.PNG
image.PNG (90.67 КБ) 6447 просмотров
Соответственно, как бы я не бился, towgs не попадает в проекцию.

1) Как быть в данном случае и правильно назначать проекцию шейпам, чтобы запоминались все настройки (эллипсоид + датум), а не только настройки проекции ?

2) Возможно ли в сам шейп прописать проекцию, как это делает ArcGis, а не оставлять всю проекцию в .prj файлах, которые подсасываются при открытии ?


Ну и да, понятно, что можно назначит проекцию и сохранить рабочее пространство кугиса. Но хотелось бы понять, в чём суть бага с кугисом.

Re: Назначение проекции

Добавлено: 25 авг 2020, 15:24
trir
Забудьте про формат PROJ.4, в данном случае он больше не работает.
Про параметр TOWGS84 тем более забудьте, трансформация теперь не является атрибутом проекции.
GDAL вслед за PROJ перешёл на формат описания систем координат WKT.
https://gis-lab.info/forum/viewtopic.php?t=26178

Re: Назначение проекции

Добавлено: 25 авг 2020, 16:44
Slinger
Неслабо так. Я видел эту тему, но даже не предполагал, что и на обычном определении проекции это скажется. Что в данном случае предполагается делать, можно ли решить эту задачу через дефолтный кугис, не используя консоль и ogr2ogr ?

Я посмотрел пользовательские проекции. Отобразил проекцию в WKT. Получил дофига строчек

Код: Выделить всё

BOUNDCRS[
    SOURCECRS[
        PROJCRS["unknown",
            BASEGEOGCRS["unknown",
                DATUM["Unknown based on Krassovsky, 1942 ellipsoid",
                    ELLIPSOID["Krassovsky, 1942",6378245,298.3,
                        LENGTHUNIT["metre",1,
                            ID["EPSG",9001]]]],
                PRIMEM["Greenwich",0,
                    ANGLEUNIT["degree",0.0174532925199433],
                    ID["EPSG",8901]]],
            CONVERSION["unknown",
                METHOD["Transverse Mercator",
                    ID["EPSG",9807]],
                PARAMETER["Latitude of natural origin",0,
                    ANGLEUNIT["degree",0.0174532925199433],
                    ID["EPSG",8801]],
                PARAMETER["Longitude of natural origin",30.95,
                    ANGLEUNIT["degree",0.0174532925199433],
                    ID["EPSG",8802]],
                PARAMETER["Scale factor at natural origin",1,
                    SCALEUNIT["unity",1],
                    ID["EPSG",8805]],
                PARAMETER["False easting",2250000,
                    LENGTHUNIT["metre",1],
                    ID["EPSG",8806]],
                PARAMETER["False northing",-6211057.628,
                    LENGTHUNIT["metre",1],
                    ID["EPSG",8807]]],
            CS[Cartesian,2],
                AXIS["(E)",east,
                    ORDER[1],
                    LENGTHUNIT["metre",1,
                        ID["EPSG",9001]]],
                AXIS["(N)",north,
                    ORDER[2],
                    LENGTHUNIT["metre",1,
                        ID["EPSG",9001]]]]],
    TARGETCRS[
        GEOGCRS["WGS 84",
            DATUM["World Geodetic System 1984",
                ELLIPSOID["WGS 84",6378137,298.257223563,
                    LENGTHUNIT["metre",1]]],
            PRIMEM["Greenwich",0,
                ANGLEUNIT["degree",0.0174532925199433]],
            CS[ellipsoidal,2],
                AXIS["geodetic latitude (Lat)",north,
                    ORDER[1],
                    ANGLEUNIT["degree",0.0174532925199433]],
                AXIS["geodetic longitude (Lon)",east,
                    ORDER[2],
                    ANGLEUNIT["degree",0.0174532925199433]],
            ID["EPSG",4326]]],
    ABRIDGEDTRANSFORMATION["Transformation from unknown to WGS84",
        METHOD["Position Vector transformation (geog2D domain)",
            ID["EPSG",9606]],
        PARAMETER["X-axis translation",24,
            ID["EPSG",8605]],
        PARAMETER["Y-axis translation",-123,
            ID["EPSG",8606]],
        PARAMETER["Z-axis translation",-94,
            ID["EPSG",8607]],
        PARAMETER["X-axis rotation",0.02,
            ID["EPSG",8608]],
        PARAMETER["Y-axis rotation",-0.25,
            ID["EPSG",8609]],
        PARAMETER["Z-axis rotation",-0.13,
            ID["EPSG",8610]],
        PARAMETER["Scale difference",1.0000011,
            ID["EPSG",8611]]]]
Какой-то довольно хардкорный текст. Я так понимаю, мне здесь нужно что-то где-то поменять, чтобы привязать датум ? Но при этом он ведь здесь всё равно прописан, в ABRIDGEDTRANSFORMATION

Re: Назначение проекции

Добавлено: 25 авг 2020, 16:59
Игорь Белов
Slinger писал(а):
25 авг 2020, 16:44
не предполагал, что и на обычном определении проекции это скажется
Это не обычное определение проекции. Трансформации датума "Pulkovo 1942" находятся в EPSG. Нужно их просто выбирать или одну из них назначить по умолчанию.

Необычность в том, что Вы хотите использовать одну из трансформаций датума "Pulkovo 1942(83)". Можете использовать этот датум, но при экспорте в "MapInfo file" GDAL будет писать #104, а не #1001.
Slinger писал(а):
25 авг 2020, 16:44
можно ли решить эту задачу через дефолтный кугис, не используя консоль и ogr2ogr ?
Можно. Добавьте пользовательскую проекцию "MI1001 / MSK47 zone 2":

Код: Выделить всё

BOUNDCRS[
    SOURCECRS[
        PROJCRS["Pulkovo 1942 / MSK47 zone 2",
            BASEGEOGCRS["Pulkovo 1942",
                DATUM["Pulkovo 1942",
                    ELLIPSOID["Krassowsky 1942",6378245,298.3,
                        LENGTHUNIT["metre",1,
                            ID["EPSG",9001]]]],
                PRIMEM["Greenwich",0,
                    ANGLEUNIT["degree",0.0174532925199433],
                    ID["EPSG",8901]]],
            CONVERSION["MSK47 zone 2",
                METHOD["Transverse Mercator",
                    ID["EPSG",9807]],
                PARAMETER["Latitude of natural origin",0.1,
                    ANGLEUNIT["degree",0.0174532925199433],
                    ID["EPSG",8801]],
                PARAMETER["Longitude of natural origin",30.95,
                    ANGLEUNIT["degree",0.0174532925199433],
                    ID["EPSG",8802]],
                PARAMETER["Scale factor at natural origin",1,
                    SCALEUNIT["unity",1],
                    ID["EPSG",8805]],
                PARAMETER["False easting",2250000,
                    LENGTHUNIT["metre",1],
                    ID["EPSG",8806]],
                PARAMETER["False northing",-6200000,
                    LENGTHUNIT["metre",1],
                    ID["EPSG",8807]]],
            CS[Cartesian,2],
                AXIS["(E)",east,
                    ORDER[1],
                    LENGTHUNIT["metre",1,
                        ID["EPSG",9001]]],
                AXIS["(N)",north,
                    ORDER[2],
                    LENGTHUNIT["metre",1,
                        ID["EPSG",9001]]]]],
    TARGETCRS[
        GEOGCRS["WGS 84",
            DATUM["World Geodetic System 1984",
                ELLIPSOID["WGS 84",6378137,298.257223563,
                    LENGTHUNIT["metre",1]]],
            PRIMEM["Greenwich",0,
                ANGLEUNIT["degree",0.0174532925199433]],
            CS[ellipsoidal,2],
                AXIS["latitude",north,
                    ORDER[1],
                    ANGLEUNIT["degree",0.0174532925199433]],
                AXIS["longitude",east,
                    ORDER[2],
                    ANGLEUNIT["degree",0.0174532925199433]],
            ID["EPSG",4326]]],
    ABRIDGEDTRANSFORMATION["Transformation from MI1001 to WGS84",
        METHOD["Coordinate Frame rotation (geog2D domain)",
            ID["EPSG",9607]],
        PARAMETER["X-axis translation",24,
            ID["EPSG",8605]],
        PARAMETER["Y-axis translation",-123,
            ID["EPSG",8606]],
        PARAMETER["Z-axis translation",-94,
            ID["EPSG",8607]],
        PARAMETER["X-axis rotation",-0.02,
            ID["EPSG",8608]],
        PARAMETER["Y-axis rotation",0.25,
            ID["EPSG",8609]],
        PARAMETER["Z-axis rotation",0.13,
            ID["EPSG",8610]],
        PARAMETER["Scale difference",1.0000011,
            ID["EPSG",8611]]]]
Честно говоря, мне непонятно стремление непременно воспроизвести эту трансформацию. Она действует на территории Восточной Германии, а не России. Если важно передать данные в WGS 84, передавайте в WGS 84. Если же важно сохранить координаты МСК47, создайте проекцию на основе "Pulkovo 1942" без этих странных оглядок на MapInfo.

Re: Назначение проекции

Добавлено: 25 авг 2020, 17:15
gamm
Игорь Белов писал(а):
25 авг 2020, 16:59
Это не обычное определение проекции.
Игорь, а нельзя ли попросить Вас написать статью на данную тему? Типа "О возможности и методах перехода от теплого лампового +proj к чудесам постмодернизма". По мере перехода на новый формат число вопросов будет расти, ИМХО ...

Re: Назначение проекции

Добавлено: 25 авг 2020, 17:30
trir

Re: Назначение проекции

Добавлено: 25 авг 2020, 17:42
Игорь Белов
О статье можно подумать. Но, на мой взгляд, в данных двух темах люди хотят странного.
  • ГИС нужны для электронной картографии. В масштабе 1:1000 метр на местности соответствует миллиметру на экране/бумаге.
  • Сантиметровая точность передачи координат при передаче данных между разными ГИС может интересовать только геодезистов. На самом деле и их не интересует (см. ниже).
  • В нулевом приближении геодезисты в MapInfo не используют датум #1001, а создают проекции на основе ГОСТа. В EPSG этот ГОСТ есть.
  • Практически трансформации, в том чисте из ГОСТа, аналогичны средней температуре по больнице. Они не могут быть использованы для точной связи геодезической основы с ГНСС. Эта связь устанавливается из геодезических измерений.
  • В результате установления такой связи можно создать матрицы деформаций и использовать их в ГИС, если очень неймётся. Правда, непонятно зачем (см. пункт первый).
Резюмирую. Мне представляется бессмысленной попытка воспроизведения стандартного датума из MapInfo. Могу раскрыть это шире, но лень.

Re: Назначение проекции

Добавлено: 25 авг 2020, 17:45
Игорь Белов
trir писал(а):
25 авг 2020, 17:30
gamm писал(а):
25 авг 2020, 17:15
Вас написать статью на данную тему?
есть уже
По сути в статье о представлении проекций в WKT ничего не сказано.

Re: Назначение проекции

Добавлено: 25 авг 2020, 18:09
trir
По сути в статье о представлении проекций в WKT ничего не сказано.
ага, ну так я и ссылку дал не на неё :mrgreen:

Re: Назначение проекции

Добавлено: 25 авг 2020, 18:12
Slinger
Понимание начинает понемногу приходить. Если я все правильно понимаю, то чтобы старые проекции, уже созданные мной в кугисе, подхватились и заработали, нужно:

1) в PROJCRS занести любое адекватное наименование
2) в BASEGEOGCRS и DATUM занести "Pulkovo 1942". Этим я объявлю хоть какой-то датум, который потом смогу скорректировать с помощью параметров в ABRIDGEDTRANSFORMATION. Не понимаю, зачем его объявлять, если я эти же семь параметров потом корректирую в ABRIDGEDTRANSFORMATION
3) в CONVERSION занести любое адекватное наименование
4) в ABRIDGEDTRANSFORMATION занести "Transformation from MI1001 to WGS84". Не пойму, то официальное наименование метода трансформации или здесь может быть любой текст ?
5) в METHOD занести "Coordinate Frame rotation (geog2D domain)". Видимо это строгое наименование метода трансформации.


После назначения и открытия шейпа я получил тот же каверзный вопрос, который задаёт QGIS при открытии файлов mapinfo в этом самом кугисе.
image2.PNG
image2.PNG (78.92 КБ) 6363 просмотра
Вопросы:

1) Что нужно выбирать, когда кугис выдаёт такое окно ? Он его выдаёт даже когда в проекте нет слоёв.
2) Слой падает куда надо, но система по-прежнему определяется как Unknown CRS. Возможно ли ему как-то обозначить, чтобы он понимал назначаемую им же проекцию ?
3) Если я хочу создать эту же проекцию с параметрами ГОСТа, я меняю параметры в разделе ABRIDGEDTRANSFORMATION, оставив при этом тот же датум ? Или есть какой-то ГОСТовский датум, где уже не надо добавлять трансформацию ABRIDGEDTRANSFORMATION ?
Игорь Белов писал(а):
25 авг 2020, 17:42
В нулевом приближении геодезисты в MapInfo не используют датум #1001, а создают проекции на основе ГОСТа. В EPSG этот ГОСТ есть
Так и есть. У нас были отдельные варианты проекции с 9999 на основе параметров ГОСТа. ИХ мы использовали, когда нужно было пересчитать в WGS. В остальные случаях, особенно в условиях кадастра, датум влияния не давал. Достаточно было правильных параметров проекции. Ведь все расчёты велись в пределах одного планового пространства, используя только различные параметры проекции. Разумеется, если переходили от датума 1942 к датуму 1995, то использовали 9999.

Re: Назначение проекции

Добавлено: 25 авг 2020, 18:19
Slinger
Забавно, но в проекциях моего кугиса эллипсоид записан как "Krassovsky", а у уважаемого Игоря как "Krassowsky". И в обоих случаях если нажать Validate WKT, то ошибки не будет. Чудные дела

Re: Назначение проекции

Добавлено: 25 авг 2020, 18:49
Игорь Белов
Slinger писал(а):
25 авг 2020, 18:12
система по-прежнему определяется как Unknown CRS
trir дело говорит, не используйте шейпфайлы. GeoPackage наш новый формат, и в нём полноценное описание систем координат.

ГОСТовская трансформация есть на Вашей картинке: Pulkovo 1942 to WGS 84 (20). Чтобы ей пользоваться, надо создать нормальную проекцию "Pulkovo 1942 / MSK47 zone 2":

Код: Выделить всё

PROJCRS["Pulkovo 1942 / MSK47 zone 2",
    BASEGEOGCRS["Pulkovo 1942",
        DATUM["Pulkovo 1942",
            ELLIPSOID["Krassowsky 1940",6378245,298.3,
                LENGTHUNIT["metre",1]]],
        PRIMEM["Greenwich",0,
            ANGLEUNIT["degree",0.0174532925199433]],
        ID["EPSG",4284]],
    CONVERSION["MSK47 zone 2",
        METHOD["Transverse Mercator",
            ID["EPSG",9807]],
        PARAMETER["Latitude of natural origin",0.1,
            ANGLEUNIT["degree",0.0174532925199433],
            ID["EPSG",8801]],
        PARAMETER["Longitude of natural origin",30.95,
            ANGLEUNIT["degree",0.0174532925199433],
            ID["EPSG",8802]],
        PARAMETER["Scale factor at natural origin",1,
            SCALEUNIT["unity",1],
            ID["EPSG",8805]],
        PARAMETER["False easting",2250000,
            LENGTHUNIT["metre",1],
            ID["EPSG",8806]],
        PARAMETER["False northing",-6200000,
            LENGTHUNIT["metre",1],
            ID["EPSG",8807]]],
    CS[Cartesian,2],
        AXIS["northing (X)",north,
            ORDER[1],
            LENGTHUNIT["metre",1]],
        AXIS["easting (Y)",east,
            ORDER[2],
            LENGTHUNIT["metre",1]],
    USAGE[
        SCOPE["unknown"],
        AREA["Europe - Russia - MSK47 zone 2"],
        BBOX[58.41,29.45,61.26,32.45]]]
Чтобы не отвечать на вопрос о трансформации каждый раз для данной системы координат, выберите нужную, поднимите флажок
[ ] Make default
После этого преобразование добавится в список используемых по умолчанию.

N. B.: Это нужно делать для каждой используемой проекции на данном датуме.

Если в настройках снять флажок
[ ] Ask for datum transformation if several are available
то QGIS никогда не будет спрашивать. Удобно, если работаешь в "Pulkovo 1995".