ArcGIS中的日期類型


ArcGIS中的日期類型有別於其他數據類型,處理起來比較麻煩。本文將從存儲、顯示、查詢、Flex/java調用及轉換方面,探討日期類型的機理並對常見問題進行匯總,希望對讀者能有所幫助。
 
存儲
  1. shapefile或coverage存儲的日期格式為:yyyy-mm-dd。需要注意的是,這兩種數據類型只能存儲日期,不能存儲時間,時間部分會被截掉;如果要根據時間做時態數據的顯示和分析,請使用geodatabase
  2. geodatabase(地理數據庫)存儲的日期格式為:yyyy-mm-dd hh:mm:ss AM或PM。
  3. 企業級數據庫因數據庫而異,可參考此處
顯示
ArcMap中日期字段隨數據源類型的不同而有所差異,其 顯示格式取決於系統而不是數據源本身
可在Windows的系統區域設置(控制面板->區域和語言)中設置ArcMap中的日期顯示格式。ArcMap使用系統短日期格式顯示日期,使用長時間來顯示時間。

查詢
在ArcMap中新建shapefile格式的點圖層和geodatabase的點圖層(FeatureClass)各一個,以便進行測試。下面是其屬性表的截圖,每個圖層中只有兩個點,西安和北京,其中geodatabase的點圖層中存儲了時間信息。
shapefile格式的點圖層的屬性表
 
geodatabase中的點圖層的屬性表
 
ArcMap中時間字段的查詢方法為:"Date" = date '2012-01-10'
 
ArcGIS Server發布成服務后的查詢方法:將點圖層通過ArcGIS Server發布成Map Service服務,然后在瀏覽器輸入服務地址,進入Query操作頁面。 在Where中輸入查詢條件(輸入1=1,可得到所有內容),在Out Fields中輸入*(用於將所有的字段都顯示出來,當然也可指定字段),便可以得到查詢結果。
 
查詢結果為:
 
where處的查詢語句:
經過測試,對於shapefile格式的數據發布的點圖層,以下查詢語句都可通過:
Date = date '01-10-2012 00:00:00'
Date = date '01-10-2012"
Date = date '01/10/2012"
Date = date '1/10/2012"
Date = date '1-10-2012"
Date = date '2012-1-10"
 
對於geodatabase中點圖層發布的服務,以下查詢語句可通過:
Date = date '01-10-2012 10:10:10'
Date = date '2012-1-05 8:20:20 pm'
Date = date '2012-1-05 20:20:20'
 
大整數問題:
但是我們發現查詢結果中時間字段為一個 大整數(Format選擇了HTML),網上有 服務的查詢結果是時間格式(目前不清楚如何發布數據以便在Rest頁面中能正確顯示為時間而非大整數)。不過我們在代碼中調用時通常使用json格式,它返回的都是一個大整數。 這個大整數的含義是:自 1970 年 1 月 1 日起已經過的毫秒數( 如果晚於1970年1月1日,則為正數,否則為負數 )。下文會對大整數的處理進行探討。
 
Flex/Java中調用  
參見《 利用ArcGIS Server REST API實現對Feature的編輯操作》和《 Java中調用ArcGIS Server REST API》兩篇文章,完成利用ArcGIS REST API獲取日期信息。完成對結果的解析后,會得到一個大整數,這里以西安為例,得到的數值是1326190210000。
flex中
Flex中可利用構造函數完成從大整數到日期類型的轉換:
var date:Date = new Date(1326190210000). 
 
日期轉換為大整數:
第一種:var date1:Number = Date.parse("2012/01/10 18:10:10 GMT+0800");//注意時區
第二種:var date2:Number = Date.UTC(2012,0,10,10,10,10,0);//月份范圍是0-11. 
利用Rest API實現新增功能時,如需構造時間字段,可將日期類型轉成大整數,完成日期的添加。
部分服務也可利用這種形式("Date" : "09\/19\/2009"),但有些不行,贊不清楚原因。  
 
java中 
大整數轉換為日期:
String str = "1326190210000";         
Long lng = Long.parseLong(str);
Date date = new Date(lng);
 
日期轉換為大整數: 
第一種:long lng2 = Date.UTC(2012-1900,0,10,10,10,10);//年數需要減去1900 
第二種:Calendar calendar = Calendar.getInstance();
calendar.set(2012,0,10, 18, 10, 10);
calendar.set(Calendar.MILLISECOND, 0);//設置下毫秒為0,否則得到的結果后三位不確定
long lng1 =calendar.getTimeInMillis(); 
第三種:Date.parse()和DateFormat類也可以。 

如在IOS開發中遇到關於日期類型的問題,可參考下<<關於ArcGIS Runtime SDK for iOS中AGSLayerDefinition使用日期類型字段過濾的問題>>


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM