空間數據庫,是為了存儲和分析空間數據的,也有一些GIS系統采用空間文件來(lái)實(shí)現,如mapinfo、shape文件格式,但是空間數據庫有著(zhù)其特有的優(yōu)勢,其實(shí)基本也就數據庫系統與文件系統的特點(diǎn)比較:
1、數據庫設計時(shí)面向數據模型對象,數據庫設計的基礎是數據模型。
2、數據庫系統的數據冗余度小、數據共享度高。
3、數據庫系統的數據和程序之間具有較高的獨立性。
4、數據庫系統通過(guò)DBMS進(jìn)行數據安全性和完整性的控制。
5、數據庫中數據的最小存取單位是數據項。
簡(jiǎn)單舉個(gè)例子,實(shí)現數據庫的多表查詢(xún),一句sql搞定的問(wèn)題,換成文件格式處理就麻煩多了。
然而,那也只是簡(jiǎn)單的數據庫,空間數據庫多了空間信息存儲與分析能力,為簡(jiǎn)單的屬性信息,打上了地理維度的標簽,就此使得它具有了質(zhì)的區別。
目前常見(jiàn)的空間數據庫有Oracle Spatial、MS Server(2008或以上)、postgreSQL(postGis)、mysql、sqlite Spatial,其中Oracle Spatial、MS Server(2008或以上)功能強大,但是收費昂貴,mysql、sqlite Spatial免費,但是空間處理能力比較弱,綜合比較開(kāi)源的postgreSQL(postGis)最好,很多GIS項目對此有廣泛支持,在本系列選擇它。
PostgreSQL的下載地址為:http://www.postgresql.org/,下載安裝后有個(gè)向導程序建議你安裝一些插件,勾選PostGis,其它的可以自行考慮是否勾選。其實(shí)PostGis是PostgreSQL的空間插件,就像是Oracle Spatial是Oracle的插件一樣。
當安裝成功之后,你會(huì )發(fā)現,它給你安裝了數據庫管理客戶(hù)端pgAdmin(當然你不喜歡或者用不習慣你可以用回navicat),左邊目錄樹(shù)展開(kāi)如下:
其中cell_region、cellcover_region、site_font_points是我用postGis上傳shape文件到PostgreSQL時(shí)生成的表,其中spatial_ref_sys是自動(dòng)生成了,記錄了空間數據和屬性數據的關(guān)聯(lián)。好了,我們試著(zhù)用用它的空間查詢(xún)能力:
well done,數據出來(lái)了,代碼很好理解,ST_Within是PG自帶的空間包含函數,意思是查詢(xún)cellcover_region面圖層包含gid為1的點(diǎn)的記錄。在此基本大功告成了。
然而,既然說(shuō)到C#打造,怎么都要給個(gè)C#調用的樣例吧?在此我們要借用Npgsql,搜索之并下載,然后新建一個(gè)winform程序,把以下文件拷貝進(jìn)去并添加引用(提醒一下:可能分開(kāi)在不同目錄,當初我就是沒(méi)有添加Mono.Security.dll,搞到編譯不了):
然后測試代碼:
- private void TryQuery()
- {
- try
- {
- // PostgeSQL-style connection string
- string connstring = String.Format("Server={0};Port={1};User Id={2};Password={3};Database={4};", "localhost", "5432", "postgres", "sa", "postgis20");
- // Making connection with Npgsql provider
- NpgsqlConnection conn = new NpgsqlConnection(connstring);
- conn.Open();
- // quite complex sql statement
- // data adapter making request from our connection
- //string sql = "SELECT * from cellcover_region";
- string sql = "SELECT a.* FROM public.cellcover_region as a, site_font_point as b where b.gid=1 and ST_Within(b.geom,a.geom)";
- NpgsqlDataAdapter da = new NpgsqlDataAdapter(sql, conn);
- // i always reset DataSet before i do
- // something with it.... i don't know why :-)
- ds.Reset();
- // filling DataSet with result from NpgsqlDataAdapter
- da.Fill(ds);
- // since it C# DataSet can handle multiple tables, we will select first
- dt = ds.Tables[0];
- // connect grid to DataTable
- dataGridView1.DataSource = dt;
- // since we only showing the result we don't need connection anymore
- conn.Close();
- }
- catch (Exception ex)
- {
- MessageBox.Show(ex.Message.ToString());
- }
- }
運行一下,效果如圖,可見(jiàn)和我們數據庫查詢(xún)是一致的:
聯(lián)系客服