Программирование с помощью GDAL и MapInfo (+PostGRES)

Не знаете, где задать вопрос? Задавайте здесь.
Ответить
glax2020
Активный участник
Сообщения: 175
Зарегистрирован: 19 ноя 2012, 15:59
Репутация: 6

Программирование с помощью GDAL и MapInfo (+PostGRES)

Сообщение glax2020 » 24 ноя 2012, 19:06

Добрый день!

Я только начал заниматься программированием с использованием библиотеки GDAL,
и столкнулся с проблемами:

1) в результате экспорта таблицы MapInfo в таблицу MapInfo у меня потерялись графические атрибуты (стили) для объектов (геометрия и атрибутика по полям переносится).

В чем может быть проблема? Что неправильно?

Вот примерный текст кода (исходный код почерпнул у Барышникова Дмитрия):

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

 OGRCoordinateTransformation *poCT = OGRCreateCoordinateTransformation( pSrcSpaRef, &oDstSpaRef);
    if(poCT)
    { 
        OGRFeature* pSrcFeature;
        while((pSrcFeature = pSrcLayer->GetNextFeature()) != NULL)
        {
            OGRGeometry *pSrcGeom = pSrcFeature->GetGeometryRef();
            if(pSrcGeom)
            {
            	  OGRGeometry* pDstGeom = NULL;
            	  if ( pCutGeom )
                    pDstGeom = pSrcGeom->Intersection(pCutGeom);
                else
                	  pDstGeom = pSrcGeom;
                if(pDstGeom && pDstGeom->transform(poCT) == OGRERR_NONE)
                {
                    OGRFeature *poDstFeature = OGRFeature::CreateFeature( poDstLayer->GetLayerDefn() );                     
                    OGRFeatureDefn* pSrcFeatureDefn = pSrcFeature->GetDefnRef();
                    for(size_t j = 0; j < pSrcFeatureDefn->GetFieldCount(); ++j)
                    {
                        poDstFeature->SetField(j, pSrcFeature->GetRawFieldRef(j));
                    }
                    poDstFeature->SetGeometryDirectly(pDstGeom);

                    if( poDstLayer->CreateFeature( poDstFeature ) != OGRERR_NONE )
                    {
                        printf( "[%d] Failed to create feature in shapefile.\n" , nRows);
                        exit( 1 );
                    }

                    OGRFeature::DestroyFeature( poDstFeature );
                    nRows++;	
                }
            }
        }

        OCTDestroyCoordinateTransformation(poCT);
        printf( "[%d] Exported.\n" , nRows);
    }
2) Пока не обнаружил и не разобрался, как я могу найти и подключить драйвера для PostGRES и как с ними работать в этой библиотеке GDAL ?

Буду благодарен за любые советы и рекомендации

С уважением, Александр
Последний раз редактировалось Voltron 24 ноя 2012, 19:28, всего редактировалось 1 раз.
Причина: не забываем про теги форматирования

Voltron
Гуру
Сообщения: 2627
Зарегистрирован: 29 мар 2007, 14:12
Репутация: 34
Откуда: Ukraine

Re: Программирование с помощью GDAL и MapInfo (+PostGRES)

Сообщение Voltron » 24 ноя 2012, 19:32

Лучше не валить вопросы в кучу, а каждый оформлять отдельной темой.

Теперь касательно драйверов. Тут смотрели?

glax2020
Активный участник
Сообщения: 175
Зарегистрирован: 19 ноя 2012, 15:59
Репутация: 6

Re: Программирование с помощью GDAL и MapInfo (+PostGRES)

Сообщение glax2020 » 24 ноя 2012, 22:45

Спасибо за ответ.

Вот уже несколько часов борюсь и пытаюсь преодолеть проблему -- Linker Tools Error LNK1107, когда присоединил PostGress'овские библиотеки, включая libpq.dll.

У меня: "Microsoft Visual Studio 2008" и "PostgreSQL 9.2".

Проблема весьма известная в инете, как я вижу, но я пробую выполнять рекомендации - устанавливать опции компиляции, и переименовывать "libpq.dll" в " libpq.lib" -- и позитивного результата пока нет увы никакого :(

Аватара пользователя
Дмитрий Барышников
Гуру
Сообщения: 2572
Зарегистрирован: 17 ноя 2009, 19:17
Репутация: 261
Откуда: Москва

Re: Программирование с помощью GDAL и MapInfo (+PostGRES)

Сообщение Дмитрий Барышников » 24 ноя 2012, 22:57

1) GDAL имеет ограниченную поддержку стилей (в моем коде вообще стили не учитывались, ведь это пример). http://www.gdal.org/ogr/ogr_feature_style.html
2) С любыми данными GDAL работает одинаково через GDALDatasedt/OGRLayer. Т.е. нет специальных классов под PostGIS. А вот поддержку Postgres/PostGIS в виде драйвера компилировать надо - если хотите пользоваться.

Вот вывод всех поддерживаемых драйверов.

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


for(size_t i = 0; i < OGRSFDriverRegistrar::GetRegistrar()->GetDriverCount(); ++i)
{
OGRSFDriver *pDrv = OGRSFDriverRegistrar::GetRegistrar()->GetDriver(i);
printf(pDrv->GetName());
}
Последний раз редактировалось Дмитрий Барышников 24 ноя 2012, 23:01, всего редактировалось 1 раз.

Аватара пользователя
Дмитрий Барышников
Гуру
Сообщения: 2572
Зарегистрирован: 17 ноя 2009, 19:17
Репутация: 261
Откуда: Москва

Re: Программирование с помощью GDAL и MapInfo (+PostGRES)

Сообщение Дмитрий Барышников » 24 ноя 2012, 22:59

glax2020 писал(а): Проблема весьма известная в инете, как я вижу, но я пробую выполнять рекомендации - устанавливать опции компиляции, и переименовывать "libpq.dll" в " libpq.lib" -- и позитивного результата пока нет увы никакого :(
Никогда так не делайте. Вам нужен libpq.lib (обычно ставится вместе с Postgres - у меня путь такой: C:\Program Files\PostgreSQL\9.1\lib). Поищите поиском в его директории установки. *.dll != *.lib

glax2020
Активный участник
Сообщения: 175
Зарегистрирован: 19 ноя 2012, 15:59
Репутация: 6

Re: Программирование с помощью GDAL и MapInfo (+PostGRES)

Сообщение glax2020 » 24 ноя 2012, 23:42

Дмитрий Барышников писал(а):
glax2020 писал(а): Проблема весьма известная в инете, как я вижу, но я пробую выполнять рекомендации - устанавливать опции компиляции, и переименовывать "libpq.dll" в " libpq.lib" -- и позитивного результата пока нет увы никакого :(
Никогда так не делайте. Вам нужен libpq.lib (обычно ставится вместе с Postgres - у меня путь такой: C:\Program Files\PostgreSQL\9.1\lib). Поищите поиском в его директории установки. *.dll != *.lib
Спасибо за рекомендацию.

Компиляция у меня уже проходит.

Но, после выполнения команд:

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

   RegisterOGRPG();
    // OGRSFDriverRegistrar::GetRegistrar()->RegisterDriver( new OGRPGDriver() );

    printf("postgresql %s\r\n",OGRSFDriverRegistrar::GetRegistrar()->GetDriverByName("PostgreSQL"));
НЕ ПОЛУЧАЮ, информацию что драйвер доступен (печатается: "(null)")

нет его и в списке:

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

    //выведем список драйверов которые поддерживает GDAL 
	for(size_t i = 0; i < OGRSFDriverRegistrar::GetRegistrar()->GetDriverCount(); ++i)
	{
		OGRSFDriver *pDrv = OGRSFDriverRegistrar::GetRegistrar()->GetDriver(i);
		const char* pszDrvName = pDrv->GetName();
        printf(pszDrvName);
        printf("\n");
	}
НО печатается сообщение (!):

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

Sun Nov 25 00:38:46 2012: OGR: Auto register C:\postgres\gdal\bin\gdal\plugins\ogr_PG.dll using RegisterOGRPG.
Пытаюсь с этой ситуацией разобраться...

Буду благодарен за любые советы и рекомендации
Последний раз редактировалось Voltron 25 ноя 2012, 11:25, всего редактировалось 1 раз.
Причина: не забываем про теги форматирования!

glax2020
Активный участник
Сообщения: 175
Зарегистрирован: 19 ноя 2012, 15:59
Репутация: 6

Re: Программирование с помощью GDAL и MapInfo (+PostGRES)

Сообщение glax2020 » 25 ноя 2012, 02:19

Добрый вечер!

Может кто то из вас сможет мне посоветовать.

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

1) Мне не удалось найти готовую бинарную сборку gdal 1.9.2.

2) Я нашел source версию gdal 1.9.2, но когда я выполняю полную компиляцию для Microsoft Visual Studio 2008,
то все проходит без ошибок, но НЕ генерируется к примеру "GDAL\bin" ???

ПРОБЛЕМА:

a) как с генерировать директорию "GDAL\bin" из source ?
b) как с генерировать "ogr_pg.dll" ?

3) Для работы я использовал GDAL "GDAL 2.0dev, released 2011/12/29", и базовые библиотеки от Baryshnikov Dmitriy,
которые как мне кажется происходят от gdal 1.9.2.

Причем "ogr_pg.dll" брал из "GDAL 2.0dev, released 2011/12/29" -- другого варианта, впрочем у меня и нет.

4) Я попробовал работать с gdal-19-1500-core.msi ( Generic installer for the GDAL core components;
http://www.gisinternals.com/sdk/Package ... er-6-2.zip )

НО там нет собственного драйвера "ogr_pg.dll", а также на сайте нет предложение загрузить драйвер для PostgreSQL.


Итого: из программы после оператора "RegisterOGRPG()", драйвер для PostgreSQL по прежнему не загружается и не перечисляется в списке доступных драйверов :(

Может у кого - нибудь из Вас, будут советы и предложения? Буду очень благодарен. Спасибо

glax2020
Активный участник
Сообщения: 175
Зарегистрирован: 19 ноя 2012, 15:59
Репутация: 6

Re: Программирование с помощью GDAL и MapInfo (+PostGRES)

Сообщение glax2020 » 25 ноя 2012, 10:31

Дмитрий Барышников писал(а): 2) С любыми данными GDAL работает одинаково через GDALDatasedt/OGRLayer. Т.е. нет специальных классов под PostGIS. А вот поддержку Postgres/PostGIS в виде драйвера компилировать надо - если хотите пользоваться.
Добрый день, Дмитрий!

Вы не смогли бы посоветовать, как можно скомпилировать или найти библиотеку файлов "gdal-1.9.2\lib\x86", которую Вы использовали в качестве исходников на конференции.

При компиляции source из "gdal-1.9.2" (http://download.osgeo.org/gdal/) у меня во первых, не генерируется папка "\x86", и тот набор библиотек, который генерируется отличается по составу от вашего (например не генерируется gdal19d.dll, или к примеру geos_c.dll). Для генерации "source" использую проект "gdal-1.9.2\makegdal90.vcproj".

Спасибо.

С уважением, Александр

Voltron
Гуру
Сообщения: 2627
Зарегистрирован: 29 мар 2007, 14:12
Репутация: 34
Откуда: Ukraine

Re: Программирование с помощью GDAL и MapInfo (+PostGRES)

Сообщение Voltron » 25 ноя 2012, 11:30

Ещё раз обращаю ваше внимание, что сваливание вопросов в кучу не способствует быстрому и качественному ответу.
  1. gdal19d.dll — отладочная версия, собирается в режиме Debug
  2. geos_c.dll — библиотека GEOS, собирается отдельно, не входит в состав GDAL.
  3. версии 2.0 и 1.9.2 это разные версии одной библиотеки. Используйте одну из них, не делайте сборную солянку
  4. на сайте есть как миниму 2 статьи, описывающих сборку GDAL из исходников, ознакомьтесь с ними

glax2020
Активный участник
Сообщения: 175
Зарегистрирован: 19 ноя 2012, 15:59
Репутация: 6

Re: Программирование с помощью GDAL и MapInfo (+PostGRES)

Сообщение glax2020 » 25 ноя 2012, 12:17

Посмотрел я статьи и в том числе Сборка GDAL используя Visual C++ Express Edition 2008 и FAQ - Installation and Building.

мне кажется я тоже примерно так делаю (тем текстам уже несколько лет). Проблема не в том в частности - что код не компилируется - код компилируется, и к примеру предлагаемая контрольный тест работает: "gdalinfo --version".

Проблема в том, что не генерируются "gdal\bin" папка и ее вложения. Причем НЕТ ССЫЛОК НА "gdal\bin" в проектных файлах для построителя: "makegdal90.vcproj" и "makefile.vc". -- Вот в этом хочется разобраться !!! Существует ли для версии gdal 9.2.1 полный source build с папками "gdal\bin", и включая драйвера, в том числе драйвер для PostGRES ???

В настоящее время я параллельно выполнил сборки gdal 9.2.1 для Microsoft Visual Studio 2008 и для Microsoft Visual Studio 2010 Express. А также собрал и под настроил программу, которая загружает и использует драйвер PostGRES тоже в компиляциях для Microsoft Visual Studio 2008 и для Microsoft Visual Studio 2010 Express (исходный текст это программа Baryshnikov Dmitriy с конференции).

Проблема как я и рассказывал ранее: нет драйвера PostGRES в списке доступных (хотя и грузится "ogr_pg.dll" в build "GDAL 2.0dev, released 2011/12/29").
Sun Nov 25 12:37:45 2012: OGR: Auto register C:\postgres\gdal\bin\gdal\plugins\ogr_PG.dll using RegisterOGRPG.
//выведем список драйверов которые поддерживает GDAL
for(size_t i = 0; i < OGRSFDriverRegistrar::GetRegistrar()->GetDriverCount(); ++i)
{
OGRSFDriver *pDrv = OGRSFDriverRegistrar::GetRegistrar()->GetDriver(i);
const char* pszDrvName = pDrv->GetName();
printf(pszDrvName);
printf("\n");
}
Я понимаю, что это разные сборки gdal 9.2.1 и "GDAL 2.0dev, released 2011/12/29", и вижу перед собою проблему и цель - собрать полноценную сборку gdal 9.2.1 с папками "gdal\bin", и включая драйвера, в том числе драйвер для PostGRES.

У меня складывается впечатление что в текущей версии source ( http://download.osgeo.org/gdal/ ), это не предусмотрено.

Поэтому у меня сейчас основной вопрос: как собрать полноценную сборку gdal 9.2.1 с папками "gdal\bin", и включая драйвера, в том числе драйвер для PostGRES. Это возможно ???

Спасибо. С уважением, Александр

Voltron
Гуру
Сообщения: 2627
Зарегистрирован: 29 мар 2007, 14:12
Репутация: 34
Откуда: Ukraine

Re: Программирование с помощью GDAL и MapInfo (+PostGRES)

Сообщение Voltron » 25 ноя 2012, 12:50

glax2020 писал(а):Существует ли для версии gdal 9.2.1 полный source build с папками "gdal\bin", и включая драйвера, в том числе драйвер для PostGRES ???
Архив с исходниками содержит все полный исходный код GDAL, в том числе и код всех драйверов. Причин, по которым они (драйвера) могут не собраться не так много: либо у вас отсутствуют необходимые зависимости, либо вы отключили сборку драйвера на этапе конфигурирования.

glax2020
Активный участник
Сообщения: 175
Зарегистрирован: 19 ноя 2012, 15:59
Репутация: 6

Re: Программирование с помощью GDAL и MapInfo (+PostGRES)

Сообщение glax2020 » 25 ноя 2012, 17:42

директория "bin" появилась,

но нет директории "plugin", и не вижу скомпилированных драйверов,

но просматривается директория "gdal-1.9.2\ogr\ogrsf_frmts" где находятся драйверы, в том числе и для "PostGRES",

но непонятно как их компилировать, и что надо сделать, чтобы с генерировалась директория "plugin" ^(

Аватара пользователя
Дмитрий Барышников
Гуру
Сообщения: 2572
Зарегистрирован: 17 ноя 2009, 19:17
Репутация: 261
Откуда: Москва

Re: Программирование с помощью GDAL и MapInfo (+PostGRES)

Сообщение Дмитрий Барышников » 25 ноя 2012, 19:37

Я собирал так: http://gis-lab.info/qa/gdal19-vs2010.html
Причем исходники для 1.9.2
Там есть поддержка PostGIS.

По поводу bin/plugin - обычно все драйвера собираются монилитно в dll и папка plugin не используется. Я не встречал версии скомпилированной иначе, хотя функционал загрузки отдельных dll драйверов из папки plugin имеется.

А вообще нет единого подхода к компиляции GDAL - каждый разработчик делает как удобнее ему.

glax2020
Активный участник
Сообщения: 175
Зарегистрирован: 19 ноя 2012, 15:59
Репутация: 6

Re: Программирование с помощью GDAL и MapInfo (+PostGRES)

Сообщение glax2020 » 25 ноя 2012, 21:55

Мне удалось собрать желаемую сборку. Проверил, действительно и драйвер PostGRES загружается, и контакт с PostGRES базой данных происходит.

По поводу bin/plugin -- действительно, сам скомпилировал ogr_pg.dll, сам создал такую папку и положил в нее откомпилированный dll, ну а в вызове программы через известный параметр установил с нею связь, и это работает меня меня.

Советы участников в теме и Ваши мне помогли. Большое спасибо.

----

в дальнейшем у меня еще будут вопросы, в развитие этой темы.

1) Меня интересует вопрос компиляции gdal - библиотек, и связанного с ним программного кода, с Windows программами. С первой попытки не получилось.

2) По поводу gdal и стилей MapInfo - еще вероятно буду изучать ситуацию. При первой попытке, с обрезанием по рамке - сработало но криво - цвета хорошие, но регионы стали дробиться на квадратики, хотя в программе кажется удалил операторы, которые могли бы к этому приводить... Но когда без вырезки - то происходил полный облом и exception при обработке каждого объекта (пользовался оператором типа " poDstFeature->SetFrom(pSrcFeature);".

Вероятно со временем открою новую тему, специально по поводу gdal и стилей MapInfo.

Большое спасибо. С уважением, Александр

Аватара пользователя
Дмитрий Барышников
Гуру
Сообщения: 2572
Зарегистрирован: 17 ноя 2009, 19:17
Репутация: 261
Откуда: Москва

Re: Программирование с помощью GDAL и MapInfo (+PostGRES)

Сообщение Дмитрий Барышников » 25 ноя 2012, 22:54

По сути вопросов я честно ничего не понял в чем проблема. Посему по вашим вопросам:
1) Отдельная тема - описание более конкретное. Что делали, примеры кода, скриншоты и т.п.
2) Отдельная тема - описание более конкретное. Что делали, примеры кода, скриншоты и т.п.

Ответить

Вернуться в «Я новичок!»

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

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