Геоинформационная система
Хочу начать создание ГИС - системы. Не знаю с чего начать. Для начала хотелось бы получить ответы на нижеприведенные вопросы. А может и получить дополнительные рекомендации.
Надо учесть следующее:
1. Объем данных - в идеале все дома, улицы, коммуникации целого города.
2. Скорость перерисовки при панаромировании и зумировании.
3. Поиск объектов.
4. Создание объектов
Вопросы:
1. где хранить данные.
2. на каком движке писать.
3. как рисовать и манипулировать системой (выбор, создание системы, зумирование)
Хочу начать создание ГИС - системы.
Зачем? во первых без внятного ответа на этот вопрос все ваши вопросы просто бессмыслица. Во вторых - те вопросы которые вы задали, это собственно вы должны и ответить - потому что именно вы сказали
Хочу начать создание ГИС - системы.
если вы не в состоянии внятно ответить ни на первый ни на второй вопрос - то вероятно ваш проект обречен.
В крайнем случайте используйте любой удобный вам картографический сервис типа гуглмапа, написав к нему оболочку с нужной вам функциональностью (предполагается что вы ответили на первый вопрос)
На самом деле для таких целей скорее подойдут продукты ArcGIS для разработики. Собственно там как раз решены проблемы заданные автором давно и умными людьми. )
http://www.esri.com/software/arcgis/index.html
Установка MapInfo MapX в RAD 2007 и 2009 чуть сложнее:
[FONT=monospace]Import and and compile Mapx50.dll[/FONT]
[FONT=monospace]tlibimp -P- -C+ "C:\Program Files\MapInfo\MapX 5.0\MAPX50.DLL"[/FONT]
[FONT=monospace]bcc32 -c MapXLib_OCX.cpp[/FONT]
[FONT=monospace]//exp:[/FONT]
[FONT=monospace]No errors[/FONT]
[FONT=monospace]//act:[/FONT]
[FONT=monospace]Error E2316 MapXLib_OCX.h 698: 'set_Width' is not a member of 'TField'[/FONT]
[FONT=monospace]Error E2316 MapXLib_OCX.h 699: 'set_Decimals' is not a member of 'TField'[/FONT]
[FONT=monospace][FONT=monospace]Edit the generated code to look like the code generated in BCB6:[/FONT]
[FONT=monospace]CHANGE:[/FONT]
[FONT=monospace]__property short Width={ read=get_Width, write=set_Width, stored=false };[/FONT]
[FONT=monospace]__property short Decimals={ read=get_Decimals, write=set_Decimals, stored=false };[/FONT]
[FONT=monospace]TO:[/FONT]
[FONT=monospace]__property short Width={ read=get_Width, stored=false };[/FONT]
[FONT=monospace]__property short Decimals={ read=get_Decimals, stored=false };[/FONT]
[FONT=monospace]There is another change necessary to enable installing the components.[/FONT]
[FONT=monospace]It is necessary to alias "Label" to some other name to avoid a name[/FONT]
[FONT=monospace]clash with VCL TLabel. To do that aliasing, open ..\bin\tlibimp.sym[/FONT]
[FONT=monospace]and add an alias under C++ typenames.[/FONT]
[FONT=monospace][C++:TypeNames][/FONT]
[FONT=monospace]Label=MapXLabel[/FONT]
[FONT=monospace]After that change to tlibimp.sym subsequent imports will alias[/FONT]
[FONT=monospace]TLabel and the components can be installed without conflict with[/FONT]
[FONT=monospace]VCL TLabel.[/FONT]
[/FONT]
"Аффтар", безусловно, "жжот", но ведь он ни о целях проекта, ни о полноте его реализации ничего не говорил. Может быть, это коллективный проект, а может быть, какая-нибудь дипломная работа, от которой не требуется законченность коммерческого продукта.
1. где хранить данные.
Можно использовать Oracle или DB2. Обе упомянутые СУБД очень мощные (если кто не знает ;) ) и имеют поставляемые отдельно средства хранения данных GIS. Для первой из них написано множество разных библиотек "прямого доступа" из C++ Builder (мне больше всего нравится ODAC)
Только разбираться с этими СУБД, если нет опыта или знающего товарища, немного хлопотно, особенно с DB2.
извиняй, конечно, если обидел. но просто этих ГИС систем... как собак не резанных.
даже общедоступные - Google Maps, Yandex.Карты, даж у MS что-то было...
первое что на ум приходит - ДубльГИС (www.2gis.ru)
http://www.dataplus.ru/industries/100_GIS/GIS.htm тут почитай
http://www.gisinfo.ru/ - тут
http://ru.wikipedia.org/wiki/%D0%93%D0%B5%D0%BE%D0%B8%D0%BD%D1%84%D0%BE%D1%80%D0%BC%D0%B0%D1%86%D0%B8%D0%BE%D0%BD%D0%BD%D0%B0%D1%8F_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D0%B0 - тут
http://gisexpert.ru/ - тут
http://ru.wikipedia.org/wiki/%D0%A1%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D0%B0_%D1%83%D0%BF%D1%80%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D0%B1%D0%B0%D0%B7%D0%B0%D0%BC%D0%B8_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85 - тут (а отсюда по ссылкам СУБД пройдись)
и вопросы твои сами отпадут...
UPD: компоненты для разработки ГИС
http://gislab.wharton.upenn.edu/LINKS/components.html
http://www.vclcomponents.com/s/0__/EzGIS
http://www.torry.net/pages.php?id=625
http://www.tatukgis.com/products/summary/products.aspx - еще какой-то KIT
Неинтересная статья. Про мои любимые Oracle и DB2 сказано только, что такие существуют.
1. Вывод графики. Что использовать канву для рисования (формы или имаджа) или библиотеку OpenGL. Или без разницы? И еще: представим что у нас порядка 20000 домов. Каждый из них имеет как минимум 4 координаты, т.е. надо отрисовать порядка 80000 линий. Я предполагаю, что отрисовка будет проходить в цикле, который будет иметь порядка 80000 итераций. А ведь это только дома! Еще сети, дороги, зоны и т.д...
Как можно оптимизировать вывод? если можно, то с примером, хотя бы образно.
2. Чтение-запись данных. При прорисовке графики или поиске выводить сразу из базы или использовать промежуточные массивы? Или продумать какой либо класс? если можно с примером...
Извиняюсь если обидел глупыми вопросами...
Спасибо.
1. Вывод графики. Что использовать канву для рисования (формы или имаджа) или библиотеку OpenGL. Или без разницы? И еще: представим что у нас порядка 20000 домов. Каждый из них имеет как минимум 4 координаты, т.е. надо отрисовать порядка 80000 линий. Я предполагаю, что отрисовка будет проходить в цикле, который будет иметь порядка 80000 итераций. А ведь это только дома! Еще сети, дороги, зоны и т.д...
Как можно оптимизировать вывод? если можно, то с примером, хотя бы образно.
:eek: Так зачем тебе рисовать все 20000 домов? Рисуй те которые на экране видны + небольшую область за пределами экрана.
2. Чтение-запись данных. При прорисовке графики или поиске выводить сразу из базы или использовать промежуточные массивы? Или продумать какой либо класс? если можно с примером...
Извиняюсь если обидел глупыми вопросами...
Я бы использовал заранее закэшированную дополнительную область вокруг отображаемой в окне - шириной в 1-2 экрана. Для более гладкого прокручивания. Соотвественно регулярно обновляемую по мере движения по карте.
А вобще все эти вещи давно реализованны в различных gis движках. Да хоть того же arcgis. =)
вывод идет примерно след образом:
for(i=1; i<количество домов; i++)
{
LineTo(x,y);
MoveTo(x,y);
}
Допустим определить находится дом в экране или нет можно тупо анализируя координаты экрана (еще if() появится). А как избежать лишней итерации цикла?
Спасибо.
struct Dom{
int X1,X2,Y1,Y2;
}
struct Dom masDom[20000];
Примерно так планирую.
А дальше в цикле рисую как выше. Т.е. при рисовании идет перебор всех элементов структуры.
Да, это координаты дома. И привязать можно. Однако, это же займет много времени - допустим после панарамирования надо открыть БД, сделать выборку, заполнить структуру, а лишь потом рисовать. Или я не прав?
Это явно займет меньше времени чем отрисовка всего.
Зачем что то открывать и обратно закрывать в процессе работы тоже не понятно.
Плюс, как я уже говорил, кэшировать близлежащие области - делать для них выборку в фоне.
На разных же зумах у тебя должны быть разные объекты - на более детальном появиться те, которых нет на крупном плане.
Ну вобщем изобретаем вилосепед? =)
вывод идет примерно след образом:
for(i=1; i<количество домов; i++)
{
LineTo(x,y);
MoveTo(x,y);
}
Допустим определить находится дом в экране или нет можно тупо анализируя координаты экрана (еще if() появится). А как избежать лишней итерации цикла?
Спасибо.
загуглим?
и:
- нет, не лучше рисовать на канве линиями и точечками вручную
- да, лучше использовать какой-нить движок, там всё уже придумано до тебя (например GDI+)
PS: aks прав, зачем изобретать велосипед и тот с одним колесом и без руля? (не в обиду)