Суть проблемы: при отработке утилит вроде
ozi2geotiff получался geotiff который потом не читался в том же QLandkarteGT и утилитами самого gdal (типа того же gdalwarp). Самое печальное, что это коснулось и файлов привязок для карт с росгисцентра (в формате .pgw + .prj (первый - привязка в формате ESRI World file, второй - описание проекции в формате WKT((Well Known Text))), картами и привязками можно разжиться
тут или на
http://rutracker.org поиском по слову ggc).
Печально потому, что если положить рядом файл карты в .png, файл привязки .pgw и описание проекции .prj (имя файла без расширения при этом должно быть одинаковым), то получить geotiff становится проще простого:
gdal_translate -of GTiff -a_srs O-50-103-D.prj O-50-103-D.png O-50-103-D.tiff
Файл .pgw подхватывается автоматически, дополнительно его указывать не нужно (об этом же говорится в официальной документации про поддержку PNG:
http://www.gdal.org/frmt_various.html).
В печали я написал в список рассылки разработчиков gdal, к утру получил ответ от Frank Warmerdam, с уведомлнем, что он попытался на последне версии gdal и проблемы не наблюдает. Попытался собрать и тоже проблема самоустранилась, при этом, gdalinfo выдал корректную информацию для файлов сгенерированных старым gdal_translate, эти же карты после обновления открылись и в QLandkarteGT. Так что, у кого стоит gdal 1.9.0, нужно срочно обновляться (вроде как проблемы нет уже в 1.9.1, но не проверял)
Полезные ссылки:
В интернетах уже есть заметки по этой тематике, например ссылки приводил в
post/2009-03-15_11.42_paru_zametok_o_qlandkartegt, но что бы было под рукой. Опускаться до того, в какой пункт меню заходить не буду, приведу чисто технические моменты.
Исходные данные: лист километровки О-50-103.tiff
На первом шаге нужно указать проекцию карты, для нашего родного генштаба проекция будет примерно такого вида:
+proj=tmerc +lat_0=0 +lon_0=117 +k=1 +x_0=20500000 +y_0=0 +ellps=krass +units=m +no_defs
+proj=tmerc +lat_0=0 +lon_0=117 +k=1 +x_0=20500000 +y_0=0 +ellps=krass +towgs84=23.9,-141.3,-80.9,0,-0.37,-0.85,-0.12 +units=m +no_defs
(параметр towgs84, определяет параметры перехода к датуму wgs84, который используется в том же GPS, этот параметр автоматом добавится, если в мастере настройки проекции выбрать датум Pulkovo 1942)
собственно для каждого листа миллионки она будет своя, жирным выделено то, что будет меняться от листа к листу. Теперь пояснения:
- lon_0 - центральный меридиан
- x_0 - мнимый восток (false easting)
В статье
post/2011-06-26_14.58_gotovim_rastrovuju_kartu_dlja_navigatora_garmin_gpsmap_62s я уже показывал как рассчитывать эти параметры, продублирую и здесь:
lon_0 = Nз * 6 - 3 # центральный меридиан по известной зоне
x_0 = Nз * 1000000 + 500000 # мнимый восток (false easting)
Nз = floor(lon / 6) + 1 # номер зоны по любому значению долготы на листе, floor - взятие целой части от деления
Nз = (lon_0 + 3) / 6 # номер зоны по центральному меридиану (частный случай)
Как видно, оба параметра зависят от номер зоны, что бы не заморачиваться, есть ещё один очень простой способ определения её: по номеру листа, вычитая из него 30. Т.е. лист у нас O-50, значит его номер - 50, тогда:```scilab
Nз = 50 - 30 = 20
Тогда значения центрального меридиана и мнимого востока:```scilab
lon_0 = 20 * 6 - 3 = 117
x_0 = 20 * 1000000 + 500000 = 20500000
Так же, для простоты, можно принять, что мнимый восток это: 500000 перед которым написан номер зоны, как он есть, т.е. как результат объединения двух строк (в программировании):```
“20” + “500000” = “20500000”
Давно пользуюсь услугами cppcheck, но решил поглядеть что есть ещё (как оказалось, лучше, по сути, ничего и нету). Наткнулся на статью по теме на хабре:
http://habrahabr.ru/post/75123
Тезисно:
Далее,
Анализ утилит статического анализа C++ кода, автор рассматривает следующие анализаторы:
- rats (выше писал)
- cppcheck (аналогично)
- Graudit (есть в AUR)
причём рассматривает проблемы, которые они не выявляют.
Список статических анализаторов можно поглядеть на страничке в википедии:
http://en.wikipedia.org/wiki/List_of_tools_for_static_code_analysis, причём не только для C/C++
Для интереса можно почитать перевод статьи Джона Кармака о статическом анализе:
http://habrahabr.ru/post/135234/((Оригинал статьи: altdevblogaday.com/2011/12/24/static-code-analysis/)), где кратко излагается, какими инструментами ему довелось воспользоваться, и какие впечатления остались после них.
И на последок серия из четырёх заметок камрада
Andrey2008((Один из разработчиков PVS-Studio, поэтому малость пропускаем его отсылы к этому продукту)) “Как уменьшить вероятность ошибки на этапе написания кода”:
-
Заметка №1:
- Избегайте функции memset, memcpy, ZeroMemory и им аналогичные
- Внимательно следите, работаете вы со знаковым или беззнаковым типом
- Избегайте большого количества вычислений в одной строке
- Выравнивайте в коде всё, что возможно
- Не размножайте строку более, чем один раз
- Выставляйте высокий уровень предупреждений у компилятора и используйте статические анализаторы
-
Заметка №2
- Не используйте тернарную операцию ‘?:’ в составных выражениях
- Не стесняйтесь использовать скобки
-
Заметка №3 - на примерах ошибок в Qt4
- Обрабатывайте переменные в той же последовательности, как они объявлены
- Табличные методы — это хорошо
- Разное интересное (про разные и интересные ошибки в Qt4)
-
Заметка №4 - на примерах ошибок в Firefox
Проблема странная, проявляется не сразу: вроде при запуске всё отлично работает, потом бац, перестаёт, при этом выводится сообщение слудющего содержания:
Error: in bind call: /home/user/.config/luakit/webview.lua:341: attempt to perform arithmetic on local 'p' (a nil value)
Решение проблемы нашёл тут:
https://github.com/mason-larobina/luakit/issues/68, нормальный рабочий вариант получается этот:
https://github.com/mason-larobina/luakit/issues/68#issuecomment-5528890
На правах заметки: цикл статей о многопоточности в C++.
В цикле рассматриваются создание обёртки над pthreads((ссылки по теме:
- POSIX_Threads
-
POSIX Threads Programming
-
Краткое описание pthread (threads))), использование
boost::thread, а так же использование идиомы RAII|RAII (Захват ресурса есть инициализация)
в контексте потоков.
Вообще, блог
Empty Crate крайне рекомендую к ознакомлению - интересные заметки по программированию на C++.
Так же в тему многопоточности concurency в C++0x (но всё это можно переложить, с небольшими оговорками и на boost::thread) серия статей в блоге Just Software Solution:
Достаточно запустить:
dia –integrated
теперь вполне можно пользоваться.
Ну и чуть ярости: ну какого чёрта не вынести это в настройки!?
Первый тестовый пост после обновления PHP с 5.3.10 на 5.4.3 и отказа BlogTNG.
Причина: BlogTNG использует SQLite2, который выкинули из PHP 5.4.0.
Не всё делается одинаково во всех компиляторах, не на всех платформах, приходится временами городить хитрые конструкции из #if/#elif/#endif. Случайно наткнулся на шпаргалку, в которой описано, какие директивы препроцессора предопределяют конкретные компиляторы:
http://sourceforge.net/p/predef/wiki/Compilers/
С того же ресурса:
А так же определение порядка байтов:
http://sourceforge.net/p/predef/wiki/Endianness/
Другие ссылки на эту тематику:
- C++ Containers Cheat Sheet:
1.
http://homepages.e3.net.nz/~djm/cppcontainers.html
2.
http://habrahabr.ru/company/infopulse/blog/194726/
- C++ Iterators & Algorithms Cheat Sheet:
1.
http://homepages.e3.net.nz/~djm/cppiterators.html
- Shifting from C to C++ strings:
1.
http://homepages.e3.net.nz/~djm/cppstrings.html
- C++03 vs C++11:
1.
http://dl.dropboxusercontent.com/u/13100941/C%2B%2B11.pdf
- C++ Quick Reference:
1.
http://www.dreamincode.net/downloads/ref_sheets/cpp_reference_sheet.pdf
- STL Quick Reference:
1.
http://www.digilife.be/quickreferences/QRC/STL%20Quick%20Reference%201.29.pdf
- C++ Concurency:
1.
http://cpprocks.com/wp-content/uploads/C++-concurrency-cheatsheet.pdf
Отдельно по ANSI C:
http://www.digilife.be/quickreferences/QRC/C%20Reference%20Card%20%28ANSI%29%202.2.pdf
Цикл статей камрада
Игоря Кальницкого для “самых маленький” про плюшки нового стандарта C++:
-
Введение в C++11: auto, decltype, nested templates и range-based-for
-
Введение в C++11: nullptr и нововведения в системе инициализации
-
Введение в C++11: лямбда функции
-
Введение в C++11: умные указатели
-
Введение в C++11: новые спецификаторы
-
Введение в C++11: пользовательские литералы
Так же стоит прочитать статью на Википедии, на удивление информативная: C++11