????? 唉,這幾天撒事情都沒有做,就搞定了GeoTools的一些bug的刪除。2.3版本問題比較多,上次在GT上和Richard聊天,他也對GeoTools目前的狀況表示很是不滿,但是為了PostGis的推廣更順利(畢竟,大多數(shù)使用Postgis的兄臺還是在geotools平臺上),很多時候很多事情都不是我們能決定的。。。所以只能自己動手去將GeoTools在文檔中沒有說清楚的,或者無法編譯的程序根據(jù)新的API從新做一次。
???? 這幾天搞定了GeoTools的PostgisDataStore操作。包含連接、讀取、新建、插入等等。其實很多功能比如新建和插入都可以用SQL語句去完成,不過這樣做對postgis即將推出的空間索引還是有很大影響的。所以我們沒有使用SQL去完成這些工作。
???

/**//*
?*?POSTGEO?
?*/
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.apache.log4j.Logger;
import?org.geotools.data.FeatureReader;
import?org.geotools.data.FeatureResults;
import?org.geotools.data.FeatureSource;
import?org.geotools.data.FeatureStore;
import?org.geotools.data.FeatureWriter;
import?org.geotools.data.postgis.PostgisDataStore;
import?org.geotools.data.postgis.PostgisDataStoreFactory;
import?org.geotools.factory.FactoryRegistryException;
import?org.geotools.feature.AttributeType;
import?org.geotools.feature.AttributeTypeFactory;
import?org.geotools.feature.Feature;
import?org.geotools.feature.FeatureType;
import?org.geotools.feature.FeatureTypeFactory;
import?org.geotools.feature.IllegalAttributeException;
import?org.geotools.feature.SchemaException;
import?org.geotools.geometry.Geometry;

import?com.vividsolutions.jts.geom.LineString;
import?com.vividsolutions.jts.io.ParseException;
import?com.vividsolutions.jts.io.WKTReader;


public?class?GetPostgisData?
{
????private?static?final?Logger?LOGGER?=?Logger.getLogger("org.geotools.postgis");

????static?PostgisDataStore?pgDatastore;
????static?PostgisDataStoreFactory?factory=new?PostgisDataStoreFactory();
????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=(PostgisDataStore)?factory.createDataStore(?params?);

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

????????????}else
{
????????????????System.out.println("系統(tǒng)連接到位于:"+URL+"的空間數(shù)據(jù)庫"+database+"失敗!請檢查相關參數(shù)");
????????????}

????????}?catch?(IOException?e)?
{
????????????e.printStackTrace();
????????????System.out.println("系統(tǒng)連接到位于:"+URL+"的空間數(shù)據(jù)庫"+database+"失敗!請檢查相關參數(shù)");
????????}
????}

????//讀取指定類型名的地理特征?

????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();
????????}
????}
????//獲取圖層地理元素屬性(Feature?Attribute)

????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");
????????}
????}
????
????//從數(shù)據(jù)容器中讀取所有的特征屬性?
????@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();
????????}
????}
????
????//添加特征值到新的特征對象中。等同于新建一個postgis數(shù)據(jù)表并向其中插入數(shù)據(jù)
????@SuppressWarnings("deprecation")

????public?static?void?createFeatures()
{

????????try?
{
????????????AttributeType?geom?=?AttributeTypeFactory.newAttributeType("the_geom",LineString.class);
????????????AttributeType?name?=?AttributeTypeFactory.newAttributeType("name",String.class);
????????????FeatureType?ftRoad?=?FeatureTypeFactory.newFeatureType

????????????????????????????????(new?AttributeType[]?
{geom,name},?"tem_road");
????????????WKTReader?wktReader?=?new?WKTReader();

????????????try?
{
????????????????LineString?geometry?=?(LineString)?wktReader.read("LINESTRING?(0?0,?10?10)");
????????????????String?roadName="武絡路";
????????????????pgDatastore.createSchema(ftRoad);
????????????????FeatureWriter?aWriter?=?pgDatastore.getFeatureWriter("tem_road",
????????????????????????((FeatureStore)?pgDatastore.getFeatureSource("tem_road")).getTransaction());

????????????????/**?*//**如有批量導入數(shù)據(jù)要求,可使用?org.geotools.data.FeatureStore?*/
????????????????Feature?aNewFeature?=?aWriter.next();
????????????????aNewFeature.setAttribute("the_geom",geometry);
????????????????aNewFeature.setAttribute("name",?roadName);
????????????????aWriter.write();
????????????????aWriter.close();

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

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

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

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

????????}?catch?(SchemaException?e)?
{
????????????e.printStackTrace();
????????}
????}
????
????//添加Feature到已知的圖層之中

????public?static?void?insertFeatures(String?featurename)
{
????????WKTReader?wktReader?=?new?WKTReader();

????????try?
{
????????????LineString?geometry?=?(LineString)?wktReader.read("LINESTRING?(10?10,?20?20)");
????????????String?roadName="珞瑜路";
????????????FeatureSource?source?=?pgDatastore.getFeatureSource(featurename);
????????????FeatureWriter?aWriter?=?pgDatastore.getFeatureWriterAppend(featurename,((FeatureStore)?source).getTransaction());

????????????/**?*//**如有批量導入數(shù)據(jù)要求,可使用?org.geotools.data.FeatureStore?*/
????????????Feature?feature?=?aWriter.next();

????????????try?
{
????????????????feature.setAttribute("the_geom",geometry);
????????????????feature.setAttribute("name",?roadName);

????????????}?catch?(IllegalAttributeException?e)?
{
????????????????//?TODO?自動生成?catch?塊
????????????????e.printStackTrace();
????????????}
????????????aWriter.write();
????????????aWriter.close();

????????}?catch?(ParseException?e1)?
{
????????????//?TODO?自動生成?catch?塊
????????????e1.printStackTrace();

????????}?catch?(IOException?e)?
{
????????????//?TODO?自動生成?catch?塊
????????????e.printStackTrace();
????????}

????}
????

????public?static?void?main(String[]?args)?throws?IOException
{
????????ConnPostGis("","localhost",5432,"navigation","root","to0124@c");

????????/**//*讀取空間庫中所有圖層*/
????????getAllLayers();

????????/**//*讀取roads圖層的空間庫,取得FeatureSource對象,
?????????*?getAttribute()方法用于讀取此圖層所定義的所有的屬性
?????????*?并通過PostGisReading()方法讀取此圖層中所有信息*/
????????getFeatureSource("roads");
????????getAttribute();
????????PostGisReading();

????????/**//*在空間庫中新建一個schema并向表中插入數(shù)據(jù)*/
????????createFeatures();

????????/**//*向tem_road圖層的空間庫中插入一條新的記錄*/
????????insertFeatures("tem_road");

????????/**//*修改空間庫記錄*/
????}
}

????? 目前對GeoTools真的有些失望。。。不過作為一個開源中間件,它做到目前這個地位真的除了它推出比較早以外,還得感謝開源社區(qū)的幫助,2006年10月份推出的2.2版本其中對WMS中圖層的渲染效率的大幅提升就是得益與Richard兄臺的絕妙建議。自己也希望能向Richard學習,一個43歲的丹麥程序員,真的讓人真的體會到什么叫“Open Mind”。。。過年期間的事情也有了眉目,著力修正shp2pqsql的問題。目前隨post安裝版推出的這個程序還是有些bug,在中文編碼以及容錯方面都需要提高。