Hatred's Log Place

DON'T PANIC!

Oct 16, 2011 - 2 minute read - туризм maps programming

Поломанная привязка карт в QLandkarteGT

Сегодня столкнулся с тем, что привязывая карту в QLandkarteGT, получаю такую ошибку:

/usr/bin/gdal_translate -a_srs +proj=merc +a=6378245.0000 +b=6356863.0188 +towgs84=24,-123,-94,-0.02,0.25,0.13,1.1,0 +units=m  +no_defs -gcp 108 182 inf inf -gcp 3310 189 inf inf -gcp 3308 3126 inf inf -gcp 93 3119 inf inf -gcp 1704 1657 inf inf /home/hatred/maps/1/src/K-53-26-view-raw.tiff /tmp/qt_temp.B12852
Input file size is 3402, 3428
0...10...20...30...40...50...60...70...80...90...100 - done.

/usr/bin/gdalwarp -order 1 -r cubic -dstnodata "255" /tmp/qt_temp.B12852 /tmp/qt_temp.u12852

ERROR 1: Attempt to create -2147483648x-2147483648 dataset is illegal,sizes must be larger than zero.
Creating output file that is -2147483648P x -2147483648L.

Неудачно!

Сначала было подумал, что поломано в SVN версии, однако, в релизной 1.2.4 ситуация точно такая же.

Сразу и сходу смутили параметры inf в опции -gcp. Так что решил поглядеть в коде, благо собираю из SVN и он у меня всегда под рукой.

Немного времени, расстановка логов, анализ привели к тому что обнаружилось двойное преобразование координат в функции

bool GPS_Math_Str_To_LongLat(const QString& str, float& lon, float& lat, const QString& srcproj, const QString& tarproj)

в файле GeoMath.cpp

Первое преобразование было в блоке кода:

if(GPS_Math_Str_To_Deg(str, lon, lat,true))
 {
   if(pjTar)
   {
       u = lon * DEG_TO_RAD;
       v = lat * DEG_TO_RAD;
        pj_transform(pjSrc,pjTar,1,0,&u,&v,0);
   }   
 }
 else

а второе преобразование в следующем блоке кода:

if(pjTar && pjSrc)
 {
   pj_transform(pjSrc,pjTar,1,0,&u,&v,0);
 }

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

Сменил первый блок на такой:

if(GPS_Math_Str_To_Deg(str, lon, lat,true))
 {
    u = lon * DEG_TO_RAD;
    v = lat * DEG_TO_RAD;
 }
 else

пересобрал и всё заработало отлично и замечательно.

UPD: а теперь всё то же самое, но в виде патча:

Index: src/GeoMath.cpp
===================================================================
--- src/GeoMath.cpp	(revision 3010)
@@ -392,12 +392,8 @@
 
     if(GPS_Math_Str_To_Deg(str, lon, lat,true))
     {
-        if(pjTar)
-        {
-            u = lon * DEG_TO_RAD;
-            v = lat * DEG_TO_RAD;
-            pj_transform(pjSrc,pjTar,1,0,&u,&v,0);
-        }
+        u = lon * DEG_TO_RAD;
+        v = lat * DEG_TO_RAD;
     }
     else
     {

PS автору письмо отправлено