<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    sinoly

       :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
      29 隨筆 :: 76 文章 :: 189 評論 :: 0 Trackbacks
    ????? 唉,這幾天撒事情都沒有做,就搞定了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,在中文編碼以及容錯方面都需要提高。


    posted on 2007-01-31 22:58 sinoly 閱讀(11567) 評論(16)  編輯  收藏 所屬分類: GEOTOOLS

    評論

    # re: 終于搞定GeoTools對PostGis的操作 2007-01-31 23:07 sinoly
    忘記提醒了,操作過程中由于2.3版本還有一個重大bug暫時沒有修改,所以為了createFeatures()的執(zhí)行,將gt2-postgis-2.3.jar換成了2.2.1版本中對應的文件。
    不知道為什么SF上下2.3的源代碼怎么都無法完成。。。繼續(xù)等待。。。到時候看看源碼中是否可以更正這個問題  回復  更多評論
      

    # re: 終于搞定GeoTools對PostGis的操作 2007-02-01 00:24 施偉
    GIS不熟。。。
    提個小建議,把類似
    for (int i = 0; i < feature.getNumberOfAttributes(); i++)
    的代碼改為用迭代器,或者改為
    for (int i = 0, int x = feature.getNumberOfAttributes(); i < x; i++)
    效率應該會好些。。。
    至于原因嘛 因為feature.getNumberOfAttributes()這種東西值是會變的,如果你在循環(huán)里操作了featrue那就很危險了。。。
    還有就是每次循環(huán)都會計算feature.getNumberOfAttributes()的值并新開一個空間來存,很不劃算的說。。。  回復  更多評論
      

    # re: 終于搞定GeoTools對PostGis的操作 2007-02-01 00:36 sinoly
    呵呵,收錄老弟的意見。。。  回復  更多評論
      

    # re: 終于搞定GeoTools對PostGis的操作 2007-02-01 00:42 一生
    也準備學習GT  回復  更多評論
      

    # re: 終于搞定GeoTools對PostGis的操作 2007-02-01 11:55 sinoly
    呵呵,“一生”兄弟,有空一起研究:)
      回復  更多評論
      

    # re: 終于搞定GeoTools對PostGis的操作 2007-02-01 14:08 梅穎
    嗯,我也關注一哈啊,呵呵  回復  更多評論
      

    # re: 終于搞定GeoTools對PostGis的操作 2007-02-09 09:20 maxcm
    你好,我是個學geotools的新手,現(xiàn)在公司要做一個項目,需要用到開源的項目,現(xiàn)在苦于不知道該怎么去學,入門比較難。想請大哥能指點一下。。謝謝了
      回復  更多評論
      

    # re: 終于搞定GeoTools對PostGis的操作 2007-02-09 09:33 maxcm
    還有,那個geoserver和geotools有什么聯(lián)系,資料太少了,而且過了年以后,項目就要啟動了,真是急死人了!
    希望大哥能幫幫我,不勝感激!!!!!  回復  更多評論
      

    # re: 終于搞定GeoTools對PostGis的操作 2007-02-09 09:37 sinoly
    @maxcm
    呵呵,我是摸索著前進。但愿發(fā)布的這些學習歷程能對你有幫助
    學習嗎,呵呵,geoserver是Geotools的一個相當好的實現(xiàn)。。。當然,geotools里面還包含了其他很多的技術
    geoserver的幾何對象操作、空間數(shù)據(jù)運算都是基于JTS的。。。
    。。。 。。。
    加我msn好了。。。sinoly(at)msn.com  回復  更多評論
      

    # re: 終于搞定GeoTools對PostGis的操作 2007-02-09 11:39 梅穎
    我能加不呵呵  回復  更多評論
      

    # re: 終于搞定GeoTools對PostGis的操作 2007-02-09 16:50 sinoly
    貌似你加了很久了滴說  回復  更多評論
      

    # re: 終于搞定GeoTools對PostGis的操作 2007-03-17 22:37 cyqian
    求助
    FeatureSource fsBC=pgDataStore.getFeatureSource(featureName);

    我加入了上面getFeatureSource這句之后就有問題,不了解哎~~

    下面是警告的一部分:

    2007-3-17 22:19:38 FactoryRegistry scanForPlugins
    警告: Can't load a service for category "CRSAuthorityFactory". Cause is "NoClassDefFoundError: javax/units/ConversionException".
    2007-3-17 22:19:38 FactoryRegistry scanForPlugins
    警告: Can't load a service for category "CRSAuthorityFactory". Cause is "NoClassDefFoundError: javax/units/ConversionException".
    2007-3-17 22:19:38 FactoryRegistry scanForPlugins
    警告: Can't load a service for category "CRSAuthorityFactory". Cause is "NoClassDefFoundError: javax/units/ConversionException".
    Exception in thread "main" java.lang.StackOverflowError
    at java.util.HashMap.get(HashMap.java:343)
    at java.awt.RenderingHints.get(RenderingHints.java:461)
    at org.geotools.factory.FactoryRegistry.getServiceProvider(FactoryRegistry.java:223)
    at org.geotools.factory.FactoryCreator.getServiceProvider(FactoryCreator.java:115)
    at org.geotools.referencing.FactoryFinder.getAuthorityFactory(FactoryFinder.java:235)
    at org.geotools.referencing.FactoryFinder.getCRSAuthorityFactory(FactoryFinder.java:496)
    at org.geotools.referencing.factory.epsg.LongitudeFirstFactory.createBackingStore(LongitudeFirstFactory.java:180)
    at org.geotools.referencing.factory.DeferredAuthorityFactory.getBackingStore(DeferredAuthorityFactory.java:136)
    at org.geotools.referencing.factory.BufferedAuthorityFactory.isAvailable(BufferedAuthorityFactory.java:206)
    at org.geotools.referencing.factory.DeferredAuthorityFactory.isAvailable(DeferredAuthorityFactory.java:124)
    at org.geotools.factory.FactoryRegistry$DefaultFilter.filter(FactoryRegistry.java:76)
    at javax.imageio.spi.FilterIterator.advance(ServiceRegistry.java:793)
    at javax.imageio.spi.FilterIterator.<init>(ServiceRegistry.java:787)  回復  更多評論
      

    # re: 終于搞定GeoTools對PostGis的操作 2007-03-18 19:59 sinoly
    @cyqian
    你是不是引入了gt2-postgis-2.3.jar?
    這個包需要替換到2.2版本。


    ps:你這里貌似還不是這個問題。。。如果你放心可以把你的代碼發(fā)給我。。呵呵。。我們一起看看
      回復  更多評論
      

    # re: 終于搞定GeoTools對PostGis的操作 2007-04-08 21:02 gaoang
    盡管已讀過英文版的,還是謝謝分享 :)  回復  更多評論
      

    # re: 終于搞定GeoTools對PostGis的操作 2007-10-23 09:52 mreay
    正在了解這方面的內容,學習中
    加你MSN中!  回復  更多評論
      

    # re: 終于搞定GeoTools對PostGis的操作 2008-11-12 10:40 大智
    我想請教一個問題:

    我在java程序中應該如何調用postgis中的那個空間分析的函數(shù)??像distance,buffer等等, 是需要postgis的庫嗎?好像下載的庫里面找不到  回復  更多評論
      

    主站蜘蛛池模板: 国产成人亚洲精品影院| 18禁男女爽爽爽午夜网站免费| 亚洲国产精品精华液| 亚洲av无码国产综合专区| 久久精品国产亚洲AV大全| 亚洲好看的理论片电影| 亚洲AV美女一区二区三区| 亚洲成色WWW久久网站| 国产精品久久久亚洲| 亚洲第一区香蕉_国产a| 亚洲网址在线观看你懂的| 亚洲最大福利视频网站| 亚洲成年人电影在线观看| 亚洲欧洲视频在线观看| 亚洲精品午夜国产va久久| 亚洲一线产区二线产区区| 欧洲亚洲国产精华液| 色www免费视频| 成人一区二区免费视频| 免费人成在线观看网站| 永久免费视频网站在线观看| 亚洲国产精品免费观看| 毛片a级毛片免费观看免下载 | 亚洲中文字幕一区精品自拍| 亚洲人成色777777老人头| 在线观看亚洲免费视频| 精品多毛少妇人妻AV免费久久| a在线观看免费视频| 美女内射毛片在线看免费人动物| 欧美大尺寸SUV免费| 国产麻豆免费观看91| 亚洲婷婷国产精品电影人久久| 亚洲欧洲日产国码av系列天堂| 久久亚洲精品无码VA大香大香| 亚洲av乱码一区二区三区| 国产成人亚洲精品播放器下载| 黄色短视频免费看| 最近中文字幕高清免费中文字幕mv| 毛片免费全部播放一级| 久久久久亚洲精品男人的天堂| 亚洲人成在线播放网站岛国|