???? 剛剛開始學習GeoTools得時候就是感覺關于這方面的資料真是少的可憐,無奈之中翻E文資料,苦學E文。。。唉。。。但是如果說一個知名的開源項目文檔中錯誤百出,我真的很是無奈。。。
???? 這段時間公司的工作也是很忙,所以只能抽空晚上慢慢研究GeoTools了。。。
???? 將今天的測試用的GeoTools讀取PostGis內容的代碼發布出來,希望能對和我一樣想去學習GeoTools的同仁起到幫助作用,也希望各位WEBGIS大拿多給我一些意見。。。畢竟以前不是搞GIS,現在很是吃力。。。
package
?com.geotools.test;

/**?*/
/**
?*?
?*?CopyRight?(C)?All?rights?reserved.
?*?<p>
?*?
?*?WuHan?Inpoint?Information?Technology?Development,Inc.
?*?<p>
?*?
?*?Author?sinoly
?*?<p>
?*?Project?Name:?PostGeo
?*?
?*?
@version
?1.0?2006-11-13
?*?
?*?<p>
?*?Base?on?:?JDK1.5
?*?<p>
?*?
?
*/
import
?java.io.IOException;
import
?java.util.HashMap;
import
?java.util.Map;
import
?java.util.NoSuchElementException;

import
?org.geotools.data.DataStore;
import
?org.geotools.data.DataStoreFinder;
import
?org.geotools.data.FeatureReader;
import
?org.geotools.data.FeatureResults;
import
?org.geotools.data.FeatureSource;
import
?org.geotools.feature.AttributeType;
import
?org.geotools.feature.Feature;
import
?org.geotools.feature.FeatureType;
import
?org.geotools.feature.IllegalAttributeException;
import
?org.geotools.geometry.Geometry;


public
?
class
?GetPostgisData?
{
?
?
static
?DataStore?pgDatastore;
?
static
?FeatureSource?fsBC;
?@SuppressWarnings(
"
unchecked
"
)
?
private
?
static
?
void
?ConnPostGis(String?dbtype,String?URL,
int
?port,String?database,

???String?user,String?password)
{
??Map?params?
=
?
new
?HashMap();
??params.put(
"
dbtype
"
,?
"
postgis
"
);
??params.put(
"
host
"
,?URL);
??params.put(
"
port
"
,?
new
?Integer(port));
??params.put(
"
database
"
,?database);
??params.put(
"
user
"
,?user);
??params.put(
"
passwd
"
,?password);??

??
try
?
{
???pgDatastore?
=
?DataStoreFinder.getDataStore(params);

???
if
(pgDatastore
!=
null
)
{
????System.out.println(
"
系統連接到位于:
"
+
URL
+
"
的空間數據庫
"
+
database
+
"
成功!
"
);

???}
else
{
????System.out.println(
"
系統連接到位于:
"
+
URL
+
"
的空間數據庫
"
+
database
+
"
失敗!請檢查相關參數
"
);
???}
??}
?
catch
?(IOException?e)?
{
???e.printStackTrace();
???System.out.println(
"
系統連接到位于:
"
+
URL
+
"
的空間數據庫
"
+
database
+
"
失敗!請檢查相關參數
"
);
??}
?}
?
//
從數據容器中讀取所有的特征屬性?
?@SuppressWarnings(
"
deprecation
"
)?

?
public
?
static
?
void
?PostGisReading()
{

??
try
?
{
???FeatureResults?fsRU?
=
?fsBC.getFeatures();
???FeatureReader?reader?
=
?fsRU.reader();

???
while
?(reader.hasNext())?
{
???????Feature?feature;

????
try
?
{
?????feature?
=
?reader.next();
????????System.out.print(feature.getID()?
+
?
"
\t
"
);

????????
for
?(
int
?i?
=
?
0
;?i?
<
?feature.getNumberOfAttributes();?i
++
)?
{
????????????Object?attribute?
=
?feature.getAttribute(?i?);
????????????
if
?(
!
(attribute?
instanceof
?Geometry))
????????????????System.out.print(attribute?
+
?
"
\t
"
);
????????}
????????System.out.println();

????}
?
catch
?(NoSuchElementException?e)?
{
?????e.printStackTrace();

????}
?
catch
?(IllegalAttributeException?e)?
{
?????e.printStackTrace();
????}
???}
???reader.close();

??}
?
catch
?(IOException?e1)?
{
???e1.printStackTrace();
??}
?}
?
?
//
讀取指定類型名的地理特征
?
public
?
static
?
void
?getFeatureSource(String?sourceName)
{

??
try
?
{
???fsBC?
=
?pgDatastore.getFeatureSource(sourceName);
//
???System.out.println(fsBC.getFeatures().size());
//
計算本圖層中所有特征的數量
??}
?
catch
?(IOException?e)?
{
???e.printStackTrace();
??}
??
?}
?
//
取得POSTGIS中所有的地理圖層
?
public
?
static
?
void
?getAllLayers()
{

??
try
?
{
???String[]?typeName?
=
?pgDatastore.getTypeNames();

???
for
(
int
?i
=
0
;i
<
typeName.length;i
++
)
{
????System.out.println(typeName[i]);
???}
??}
?
catch
?(IOException?e)?
{
???e.printStackTrace();
??}
?}
?
public
?
static
?
void
?getAttribute()
{
??FeatureType?ftBC
=
fsBC.getSchema();
??System.out.println(ftBC.getAttributeCount());

??
for
?(
int
?i?
=
?
0
;?i?
<
?ftBC.getAttributeCount();?i
++
)?
{
??????AttributeType?at?
=
?ftBC.getAttributeType(?i?);
??????
//
判斷屬性類型是否為可分配
??????
if
?(
!
Geometry.
class
.isAssignableFrom(at.getType()))
??????????System.out.print(at.getType()?
+
?
"
\t
"
);
??}
??System.out.println();

??
for
?(
int
?i?
=
?
0
;?i?
<
?ftBC.getAttributeCount();?i
++
)?
{
??????AttributeType?at?
=
?ftBC.getAttributeType(?i?);
??????
if
?(
!
Geometry.
class
.isAssignableFrom(at.getType()))
??????????System.out.print(at.getName()?
+
?
"
\t
"
);
??}
?}
?
public
?
static
?
void
?main(String[]?args)?
throws
?IOException
{
??ConnPostGis(
""
,
"
localhost
"
,
5432
,
"
navigation
"
,
"
root
"
,
"
aaaaa
"
);

??
/**/
/*
讀取指定類型名的地理特征?
*/
??getFeatureSource(
"
roads
"
);

??
/**/
/*
得到空間數據庫中所有特征表的表名
*/
//
??PostGisReading();
????getAllLayers();
?}
}
??????? 到周末了,這個周末事情貌似很多,明天,哦,不對,是今天要去老婆公司幫他們把動漫在線制作工廠的服務器配置起來。很是不爽的是拖了我的款一直沒有結算,感覺很是對不起和我一起做這個兼職項目的兄弟。周日可能會去看看一片空置的地,呵呵,研究一下看看怎么能用這片地改善一下生活地說:)
?????? 如果有空,周末將GeoTools寫PostGis數據的代碼整理一下。連接、讀、寫這都屬于基本操作,不過對于資料嚴重匱乏的GeoTools而言我想還是能對志同道合的兄弟們一些幫助的。自己將這些代碼貼出來的目的有二:一來監督自己的學習過程;二來希望能找到一批志同道合的朋友一起做一個基于開源項目的通用GIS/平臺,平臺的內容目前正在規劃,感覺還是很不錯的。
?????? 2007年的一月就快要過去了,這個月感覺怎么說那。。。除了項目中有些很讓人煩惱的事情以外,個人感覺還好,算是慢慢在又在望一線開發上靠攏。。。個人興趣和工作之間的協調不是很好解決,目前唯一的調節方式就是。。。犧牲自己的睡眠時間了。。。
????? 唉。。。。兩個星期沒有回家了,這個星期又很困難。。。但愿老爸老媽不要怪我。。。LP這段時間對我意見很大,畢竟婚期就在4月,過了年就快要到了,對我的意見就是到現在我都不知道結婚到底應該怎么搞。。。。
???? 夜深了,感覺很是對不起自己的家人。。。。在這個賣身又賣藝的年代。。。真的好困惑!