Изображение карты SHP и текущие координаты в QGIS

Вопросы по свободной ГИС QGIS. Сообщения об ошибках, предложения по улучшению, локализация.
Ответить
Foma
Участник
Сообщения: 83
Зарегистрирован: 15 апр 2014, 13:31
Репутация: -1

Re: Изображение карты SHP и текущие координаты в QGIS

Сообщение Foma » 01 апр 2015, 12:17

trir писал(а):ProjToDegrees заработал?
По идее, надо устанавливать ту СК, в которой надо отображать карту. Но возникает вопрос - читается ли СК слоя из shp'а?
Плохо дело. Модифицировал приведенный выше код обработчика кнопки ввода слоя следующим образом :

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

// Ввод файла SHP
procedure TForm1.BtnReadMapClick(Sender: TObject);
var
   shp:Shapefile;
   Buf : WideString;
begin
    if ( OpenDialog1.Execute ) then
     begin
      // Создаем и вводим слой карты из файла :
      shp:=CoShapefile.Create;
      shp.Open(OpenDialog1.FileName,nil);
      Map1.AddLayer(shp,true);
      // создаем объект  класса GeoProjection :
      MapProj := CoGeoProjection.Create();
      // Вводим значение из файла .prj слоя в исходной проекции :
      Buf :=
        'GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",' +
        'SPHEROID["WGS_1984",6378137.0,298.257223563]],' +
        'PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]]';

      MapProj.ImportFromESRI( Buf );
      // устанавливаем созданную систему координат в нашу карту :
      Map1.GeoProjection := MapProj;
     end;
end;
При запуске в момент ввода файла возникает ошибка времени исполнения ( скриншот окна ниже )
при исполнении строки
MapProj.ImportFromESRI( Buf );
В то же время, если убрать из строки содержимое файла .prj - сделать ее пустой :
Buf := '';
то ввод слоя проходит нормально.
Исходя из этого, предполагаю, что ошибка связана с синтаксисом вводимого содержимого файла prj.
trir писал(а): Но возникает вопрос - читается ли СК слоя из shp'а?
Вопроса не понял. Поясните поподробнее.
Вложения
Ошибка.jpg
Ошибка.jpg (42.91 КБ) 8890 просмотров

trir
Гуру
Сообщения: 5355
Зарегистрирован: 09 апр 2010, 19:30
Репутация: 1021
Ваше звание: просто мимо прохожу
Откуда: Ё-бург

Re: Изображение карты SHP и текущие координаты в QGIS

Сообщение trir » 01 апр 2015, 12:27

1. Почему WideString?
2. ReadFromFile

Foma
Участник
Сообщения: 83
Зарегистрирован: 15 апр 2014, 13:31
Репутация: -1

Re: Изображение карты SHP и текущие координаты в QGIS

Сообщение Foma » 01 апр 2015, 12:51

trir писал(а):1. Почему WideString?
2. ReadFromFile
По п.1 - потому что функция ImportFromESRI требует в качестве параметра строку именно этого типа.
Строки других типов не пропускаются транслятором - очень строго отслеживается соответствие типов, что поделаешь.
По п. 2 - сейчас разберусь.

Foma
Участник
Сообщения: 83
Зарегистрирован: 15 апр 2014, 13:31
Репутация: -1

Re: Изображение карты SHP и текущие координаты в QGIS

Сообщение Foma » 01 апр 2015, 13:18

trir писал(а): 2. ReadFromFile
Сделал следующий код :

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

var
   MapProj : GeoProjection;

// Ввод файла SHP
procedure TForm1.BtnReadMapClick(Sender: TObject);
var
   shp:Shapefile;
//   Buf : WideString;
begin
    if ( OpenDialog1.Execute ) then
     begin
      // Создаем и вводим слой карты из файла :
      shp:=CoShapefile.Create;
      shp.Open(OpenDialog1.FileName,nil);
      Map1.AddLayer(shp,true);
      // создаем объект  класса GeoProjection :
      MapProj := CoGeoProjection.Create();
      // Вводим значение из файла .prj слоя в исходной проекции :
      MapProj.ReadFromFile( 'c:\Project_GIS\MAP\RUS_adm\RUS_adm3.prj' );
      // устанавливаем созданную систему координат в нашу карту :
      Map1.GeoProjection.StartTransform( MapProj );
     end;
end;

// Обработчик события - перемещение курсора мыши
procedure TForm1.Map1MouseMove( ASender: TObject; Button, Shift: Smallint;
                                x, y: Integer);
var
   XX, YY : double;
begin
  // пиксельные координаты мыши преобразуем в координаты карты :
  Map1.PixelToProj(x,y,YY,XX);
  // Преобразуем координаты нашей карты в WGS84 :
  Map1.GeoProjection.Transform( YY, XX );
  // преобразованные координаты рисуем в статусной строке :
  StatusBar1.Panels[0].Text := 'Lat='+FloatTostr(XX);
  StatusBar1.Panels[1].Text := 'Long='+FloatTostr(YY);
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  // останавливаем преобразование :
  Map1.GeoProjection.StopTransform();
end;
Результат :
Вложения
Результат2.jpg
Результат2.jpg (68.16 КБ) 8870 просмотров

trir
Гуру
Сообщения: 5355
Зарегистрирован: 09 апр 2010, 19:30
Репутация: 1021
Ваше звание: просто мимо прохожу
Откуда: Ё-бург

Re: Изображение карты SHP и текущие координаты в QGIS

Сообщение trir » 01 апр 2015, 13:42

Издеваешся?

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

Map1.GeoProjection := MapProj;
GeoProjection proj = new GeoProjection(); 
// EPSG code
proj.ImportFromEPSG(4326);  // WGS84
Map1.GeoProjection.StartTransform(Proj);

Foma
Участник
Сообщения: 83
Зарегистрирован: 15 апр 2014, 13:31
Репутация: -1

Re: Изображение карты SHP и текущие координаты в QGIS

Сообщение Foma » 01 апр 2015, 13:44

Следующий вариант :
обработчик кнопки ввода файла - как в последнем случае, обработчик мыши :

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

// Обработчик события - перемещение курсора мыши
procedure TForm1.Map1MouseMove( ASender: TObject; Button, Shift: Smallint; x, y: Integer);
var
   XX, YY : double;
   Xdeg, Ydeg : double;
begin
  // пиксельные координаты мыши преобразуем в координаты карты :
  Map1.PixelToProj(x,y,YY,XX);
   Map1.ProjToDegrees( XX, YY, Xdeg, Ydeg );
  // преобразованные координаты рисуем в статусной строке :
  StatusBar1.Panels[0].Text := 'Lat='+FloatTostr(Xdeg);
  StatusBar1.Panels[1].Text := 'Long='+FloatTostr(Ydeg);
end;
Результат - тот же самый, что и ранее при использовании функции ProjToDegrees -
в верхней части окна - координаты в метрах, в статусной строке - постоянно Lat = 0 и Long = 0
Такая вот петрушка. Фу, в голове - полная каша из всех этих функций ...

Foma
Участник
Сообщения: 83
Зарегистрирован: 15 апр 2014, 13:31
Репутация: -1

Re: Изображение карты SHP и текущие координаты в QGIS

Сообщение Foma » 01 апр 2015, 13:47

trir писал(а):Издеваешся?

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

Map1.GeoProjection := MapProj;
GeoProjection proj = new GeoProjection(); 
// EPSG code
proj.ImportFromEPSG(4326);  // WGS84
Map1.GeoProjection.StartTransform(Proj);
Не понял юмора - голова трещит ... Укажи конкретно.

trir
Гуру
Сообщения: 5355
Зарегистрирован: 09 апр 2010, 19:30
Репутация: 1021
Ваше звание: просто мимо прохожу
Откуда: Ё-бург

Re: Изображение карты SHP и текущие координаты в QGIS

Сообщение trir » 02 апр 2015, 05:15

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

// Ввод файла SHP
procedure TForm1.BtnReadMapClick(Sender: TObject);
var
   shp:Shapefile;
//   Buf : WideString;
begin
    if ( OpenDialog1.Execute ) then
     begin
      // Создаем и вводим слой карты из файла :
      shp:=CoShapefile.Create;
      shp.Open(OpenDialog1.FileName,nil);
      Map1.AddLayer(shp,true);
      // создаем объект  класса GeoProjection :
      MapProj := CoGeoProjection.Create();
      // Вводим значение из файла .prj слоя в исходной проекции :
      MapProj.ReadFromFile( 'c:\Project_GIS\MAP\RUS_adm\RUS_adm3.prj' );
      // устанавливаем созданную систему координат в нашу карту :
      Map1.GeoProjection := MapProj;
     end;
end;

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

// Обработчик события - перемещение курсора мыши
procedure TForm1.Map1MouseMove( ASender: TObject; Button, Shift: Smallint; x, y: Integer);
var
   XX, YY : double;
   Xdeg, Ydeg : double;
begin
  // пиксельные координаты мыши преобразуем в координаты карты :
  Map1.PixelToProj(x,y,YY,XX);
   Map1.ProjToDegrees( XX, YY, Xdeg, Ydeg );
  // преобразованные координаты рисуем в статусной строке :
  StatusBar1.Panels[0].Text := 'Lat='+FloatTostr(Xdeg);
  StatusBar1.Panels[1].Text := 'Long='+FloatTostr(Ydeg);
end;
Если не сработает, значит проекция не загрузилась

Foma
Участник
Сообщения: 83
Зарегистрирован: 15 апр 2014, 13:31
Репутация: -1

Re: Изображение карты SHP и текущие координаты в QGIS

Сообщение Foma » 02 апр 2015, 09:19

trir писал(а):

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

// Ввод файла SHP
procedure TForm1.BtnReadMapClick(Sender: TObject);
var
   shp:Shapefile;
//   Buf : WideString;
begin
    if ( OpenDialog1.Execute ) then
     begin
      // Создаем и вводим слой карты из файла :
      shp:=CoShapefile.Create;
      shp.Open(OpenDialog1.FileName,nil);
      Map1.AddLayer(shp,true);
      // создаем объект  класса GeoProjection :
      MapProj := CoGeoProjection.Create();
      // Вводим значение из файла .prj слоя в исходной проекции :
      MapProj.ReadFromFile( 'c:\Project_GIS\MAP\RUS_adm\RUS_adm3.prj' );
      // устанавливаем созданную систему координат в нашу карту :
      Map1.GeoProjection := MapProj;
     end;
end;

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

// Обработчик события - перемещение курсора мыши
procedure TForm1.Map1MouseMove( ASender: TObject; Button, Shift: Smallint; x, y: Integer);
var
   XX, YY : double;
   Xdeg, Ydeg : double;
begin
  // пиксельные координаты мыши преобразуем в координаты карты :
  Map1.PixelToProj(x,y,YY,XX);
   Map1.ProjToDegrees( XX, YY, Xdeg, Ydeg );
  // преобразованные координаты рисуем в статусной строке :
  StatusBar1.Panels[0].Text := 'Lat='+FloatTostr(Xdeg);
  StatusBar1.Panels[1].Text := 'Long='+FloatTostr(Ydeg);
end;
Если не сработает, значит проекция не загрузилась
Камрад, этот вариант ( со строкой Map1.GeoProjection := MapProj ) у меня ранее уже был. Сейчас повторил его еще раз. Результат - все тот же, что и ранее : в статусной строке высвечиваются те же цифры, что и в верхней части окна - миллионные значения. Причем, обрати внимание ( см. скриншот ниже ) - если ранее, на скриншоте выше, в верхней части окна было : " x = ... y = ... ", то теперь : " Lat : ... Lng : ... ".
Если строку Map1.GeoProjection := MapProj зарубить, то снова светится : " x = ... y = ... ". Такое впечатление,
что код работает корректно, но из-за отсутствия СК такой вот результат.
И еще одно. Объясни, пожалуйста :
1. Система координат в метрах - где ее начало ( нули по обеим осям ) ? Оно привязывается к определенным точкам на поверхности или может задаваться произвольно для каждой карты ?
2. Обозначения осей СК в метрах - как у градусных координат : ось Y по горизонтали, ось X по вертикали, или наоборот ?
3. Для СК в метрах масштаб метра одинаков в каждой точке карты и зависит только от текущего масштаба изображения карты или имеет место зависимость от конкретной проекции карты и текущего места на карте ?
Вложения
Результат3.jpg
Результат3.jpg (70.33 КБ) 8803 просмотра

trir
Гуру
Сообщения: 5355
Зарегистрирован: 09 апр 2010, 19:30
Репутация: 1021
Ваше звание: просто мимо прохожу
Откуда: Ё-бург

Re: Изображение карты SHP и текущие координаты в QGIS

Сообщение trir » 02 апр 2015, 10:08

У GeoProjection есть метод .ExportToWKT() - что он выдаёт на всех этапах?

http://gis-lab.info/qa/proj-sk-faq.html

Foma
Участник
Сообщения: 83
Зарегистрирован: 15 апр 2014, 13:31
Репутация: -1

Re: Изображение карты SHP и текущие координаты в QGIS

Сообщение Foma » 02 апр 2015, 10:55

trir писал(а):У GeoProjection есть метод .ExportToWKT() - что он выдаёт на всех этапах?

http://gis-lab.info/qa/proj-sk-faq.html
Камрад. по этой ссылке я ранее уже читал. Интересно, конечно, но ... ответов на поставленные вопросы так и не нашел. Уж будь так добр, в двух словах, больше не надо ...
Сделал код :

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

// Ввод файла SHP
procedure TForm1.BtnReadMapClick(Sender: TObject);
var
   shp:Shapefile;
   Buf1 : WideString;
   Buf2 : WideString;
   Buf3 : WideString;
begin
    if ( OpenDialog1.Execute ) then
     begin
      // Создаем и вводим слой карты из файла :
      shp:=CoShapefile.Create;
      shp.Open(OpenDialog1.FileName,nil);
      Map1.AddLayer(shp,true);
      // создаем объект  класса GeoProjection :
      MapProj := CoGeoProjection.Create();
      Buf1 := Map1.GeoProjection.ExportToWKT();
      Memo1.Lines.Add( 'Buf1 :' );
      Memo1.Lines.Add( Buf1 );
      Memo1.Lines.Add( '-------------------------------------' );
      // Вводим значение из файла .prj слоя в исходной проекции :
      MapProj.ReadFromFile( 'c:\Project_GIS\MAP\RUS_adm\RUS_adm3.prj' );
      Buf2 := Map1.GeoProjection.ExportToWKT();
      Memo1.Lines.Add( 'Buf2 :' );
      Memo1.Lines.Add( Buf2 );
      Memo1.Lines.Add( '-------------------------------------' );
      // устанавливаем созданную систему координат в нашу карту :
      Map1.GeoProjection := MapProj;
      Buf3 := Map1.GeoProjection.ExportToWKT();
      Memo1.Lines.Add( 'Buf3 :' );
      Memo1.Lines.Add( Buf3 );
      Memo1.Lines.Add( '-------------------------------------' );
     end;
end;
( Обработчик мыши - без изменений ).
Результат выводится в Memo1 :
Buf1 :
PROJCS["Albers",GEOGCS["GCS_Krassovsky, 1942",
DATUM["D_unknown",SPHEROID["krass",6378245,298.3]],
PRIMEM["Greenwich",0],UNIT["Degree",0.017453292519943295]],
PROJECTION["Albers"],PARAMETER["standard_parallel_1",52],
PARAMETER["standard_parallel_2",64],PARAMETER["latitude_of_origin",0],
PARAMETER["central_meridian",105],PARAMETER["false_easting",18500000],
PARAMETER["false_northing",0],UNIT["Meter",1]]
-------------------------------------
Buf2 :
PROJCS["Albers",GEOGCS["GCS_Krassovsky, 1942",
DATUM["D_unknown",SPHEROID["krass",6378245,298.3]],
PRIMEM["Greenwich",0],UNIT["Degree",0.017453292519943295]],
PROJECTION["Albers"],PARAMETER["standard_parallel_1",52],
PARAMETER["standard_parallel_2",64],PARAMETER["latitude_of_origin",0],
PARAMETER["central_meridian",105],PARAMETER["false_easting",18500000],
PARAMETER["false_northing",0],UNIT["Meter",1]]
-------------------------------------
Buf3 :
GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",
SPHEROID["WGS_1984",6378137.0,298.257223563]]
,PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]]
-------------------------------------

trir
Гуру
Сообщения: 5355
Зарегистрирован: 09 апр 2010, 19:30
Репутация: 1021
Ваше звание: просто мимо прохожу
Откуда: Ё-бург

Re: Изображение карты SHP и текущие координаты в QGIS

Сообщение trir » 02 апр 2015, 12:01

В Buf3 - неправильный результат, значит Map1.GeoProjection := MapProj; - ненужно

По твоим вопросам

1. Точка отсчёта - пересечение нулевого мередиана с экватором, нулевой мередиан задан как PRIMEM["Greenwich",0].
НО! Есть параметры Нулевая долгота/Нулевая широта - они задают смещение нулевой точки
+ Восточное смещение/Северное смещение(PARAMETER["false_easting",18500000],
PARAMETER["false_northing",0],) - эти значения просто прибавляются к координатам
+ PARAMETER["standard_parallel_1",52],PARAMETER["standard_parallel_2",64],PARAMETER["central_meridian",105]
2. Везде по разному
3. зависит от проекции

Foma
Участник
Сообщения: 83
Зарегистрирован: 15 апр 2014, 13:31
Репутация: -1

Re: Изображение карты SHP и текущие координаты в QGIS

Сообщение Foma » 02 апр 2015, 12:38

trir писал(а): По твоим вопросам
Большое спасибо за ответы. Хоть немного в голове проясняется от всех этих несчастных СК ...
trir писал(а):В Buf3 - неправильный результат, значит Map1.GeoProjection := MapProj; - ненужно
Так ведь, если эту строку убрать, то тогда MapProj - нигде не используется, и, следовательно, вообще не нужен, и, следовательно, предмет обсуждения исчезает !... Ну, хорошо, зарубил эту строку, результат - в строке статуса рисуется : Lat = 0 и Long = 0 ...

Foma
Участник
Сообщения: 83
Зарегистрирован: 15 апр 2014, 13:31
Репутация: -1

Re: Изображение карты SHP и текущие координаты в QGIS

Сообщение Foma » 06 апр 2015, 09:45

Поскольку, как я вижу, обсуждение проблемы явно заглохло, то, думаю, можно подвести некоторые итоги. Значит, пришли к выводу о том, что отображение преобразованной проекции в градусной мере координат невозможно из-за отсутствия в оной соответствующей системы координат. Ну что ж, неприятно, конечно, но не принципиально. Непривычный вид проекций карт - и областей РФ, и России - в исходной системе координат выглядит неудобно, но ко всему можно привыкнуть. Более существенная особенность - отрезанная и закинутая налево Чукотка - это уже более важно, но тоже непринципиально, поскольку все необходимые геометрические координатные построения и в такой проекции выполняются, тем не менее, правильно, хотя и имеют несколько неэстетичный вид - непрерывные линии обрываются на правом краю карты и продолжаются на левом ( и наоборот ). Поскольку градксная мера координат имеет для меня большее значение, чем красивый вид проекции, то прихожу к выводу - оставить все так, как есть. Жить с такой проекцией вполне можно. Я очень признателен камраду Trir за желание помочь разобраться с проблемой. Ну а то, что с решением проблемы не вышло - так ведь, отрицательный результат - это тоже результат... Тему оставляю открытой на случай неожиданного появления какого-нибудь спасителя ...

Аватара пользователя
Максим Дубинин
MindingMyOwnBusiness
Сообщения: 9129
Зарегистрирован: 06 окт 2003, 20:20
Репутация: 748
Ваше звание: NextGIS
Откуда: Москва
Контактная информация:

Re: Изображение карты SHP и текущие координаты в QGIS

Сообщение Максим Дубинин » 06 апр 2015, 10:25

Вы, с учетом обсуждения выше можете еще раз сформулировать "проблему"? По ходу обсуждения было поднято штук 15 разных тем.
пристегивайтесь, турбулентность прямо по курсу

Ответить

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

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 3 гостя