顯示具有 GIS 標籤的文章。 顯示所有文章
顯示具有 GIS 標籤的文章。 顯示所有文章

解決ADF之Map因瀏覽器版本(IE 6)無法正常呈現

繼10月針對排版提出的二篇文章,專案已逐步邁向功能開發part,沒料到上禮拜發現網頁無法在IE 6正常執行,又這麼剛好業主所屬機關單位礙於某套老爺爺電子表單系統,強迫使用IE 6不得升級,此問題的解決勢在必行!
之前的二篇文章:
1. 讓ADF的FloatingPanel永遠呈現於最上層(always on Top)
2. 修改FloatingPanel的TitleBarBackgroundImage(ADF)

本文遭遇問題並非存在bug無法運作,而是地圖一片空白,由TOC可抓取地圖圖層資訊、Mootool製作的sideBar正常使用,推斷不是控件問題,依舊回歸排版老問題=..=a

排版狀況與解決辦法直接觀看下圖。
新版ie都好正常又漂亮 0.<
(此處為ie 8)
IE 6唯獨Map無法顯示


solution:
於網頁使用的css中加入下列描述即可XD
    html, body
    {
        margin: 0px;
        height: 100%;
    }
修正排版後IE 6也正常了

透過前述solution修正,不會影響IE新版的Map呈現,所以網頁加載時無須再透過Javascript判斷瀏覽器版本,請安心服用^^
對瀏覽器版本判斷感興趣者可參考強迫關閉視窗一文,其中之checkVersion()便是用來判斷IE版本的函示。

於ArcGIS Server實作ICallbackEventHandler

這幾天多虧同事跑駐點服務,期初報告也在長官協助下順利提送,即使這禮拜靠杯次數有夠多,不過加班死拼總算擠出點像樣東西。

建置GIS雛形系統時,piggy習慣上會先作定位功能,本想沿襲piggy今年結案的一人GIS系統(哭哭....每次都一人),剛好最近和ola兄討論jQuery,便衍生出避免PostBack機制來精進定位功能的想法。趁此機會,把一直沒有仔細釐清的callback results給KO唄。


[範例情境]
1.以定位為例實作callback機制,達成不刷新地圖即可定位(互動)的目標
2.暫不涉獵父子視窗傳值,本例皆在同一頁面運作

透過詳細步驟學習ICallbackEventHandler之實作,而下列步驟並無強制規定step by step,請依個人開發習慣調整。


SETP 1:配置地圖定位之頁面layout
﹡中央配置大小適宜的Map(ArcGIS Web Control),請注意Map控件直接放在本頁aspx,無須使用iFrame的偷吃步方式來偽裝沒有PostBack
﹡MapResourceManager含二個圖層—graphLyr與swg,前者為GraphicsLayer,後者為你的MapService
﹡TextBox1用來key in圖層名稱
﹡TextBox2用來key in物件OBJECTID
﹡按下定位Button,地圖要能在本頁aspx不刷新的情況下定位
﹡TextBox1、TextBox2與定位按鈕都是html控件,並非ASPX控件

PS:本例暫不考慮圖層名稱不存在等例外,請自行依據需求作防呆或改用下拉式選單等


SETP 2:撰寫前端事件
按下按鈕後,要能蒐集TextBox1之圖層名稱以及TextBox2之OBJECTID,並將其組成字串,以便傳遞予後端處理。
也就是說按下html的input button後,要有個javascript function完成組字串&傳值的動作。
< input onclick="ZoomToFeatureClient();" type="button" value="定位" />

< script language="javascript" type="text/javascript">

function ZoomToFeatureClient()
{
  //使用jQuery獲取TextBox1&TextBox2的值
  var lyr = $("#TextBox1").val();
  var objId = $("#TextBox2").val();
  var context = 'Map1';
  //組字串
  var message = 'EventArg=ZoomToFeature&Layer=' + lyr + '&Id=' + objId;
  < %=ADFCallbackFunctionString%>

< /script>


SETP 3:撰寫後端事件
﹡定義待會用到的
private string m_ADFCallbackFunctionString;
private string m_CallbackResults;
protected void Page_Load(object sender, EventArgs e)
{
m_ADFCallbackFunctionString = Page.ClientScript.GetCallbackEventReference(this, "message", "ESRI.ADF.System.processCallbackResult", "context");
}

public string ADFCallbackFunctionString
{
    get { return m_ADFCallbackFunctionString; }
    set { m_ADFCallbackFunctionString = value; }
}
  
  
m_ADFCallbackFunctionString是用來註冊function
m_CallbackResults則是傳值

﹡繼承System .Web.UI.ICallbackEventHandler
VS會自動為您產生ICallbackEventHandler成員region,裡面包含GetCallbackResult()與RaiseCallbackEvent(string eventArgument)。請分別依據需求撰寫這2個函示。
# region ICallbackEventHandler 成員
//處理要回傳給 Client端(瀏覽器) 的值
public string GetCallbackResult()
{
    return m_CallbackResults;
}

//取得Client傳給Server端的值
public void RaiseCallbackEvent(string eventArgument)
{
    try
   {
       System.Collections.Specialized.NameValueCollection nameValueCollection =
       ESRI.ArcGIS.ADF.Web.UI.WebControls.CallbackUtility.ParseStringIntoNameValueCollection
       (eventArgument);
      
      if (nameValueCollection["EventArg"] == "ZoomToFeature")
     {
         //ZoomToFeatureServer是自己寫在後端的定位方法
           ZoomToFeatureServer(nameValueCollection["Layer"], "OBJECTID", nameValueCollection["Id"]);
      }
      else if (nameValueCollection["EventArg"] == "其他case")
      {略....}
   }
   catch
   {
        m_CallbackResults = Map1.CallbackResults.ToString();
   }
}

# endregion
private void ZoomToFeatureServer(string m_queryLayerName, string m_queryFieldName, string value) { 略... m_CallbackResults = Map1.CallbackResults.ToString(); }



SETP 4:執行




PS:ArcGIS Server9.3有二種方式實現非同步效果,Callback與PartialPostback,前者即為本文探討範圍,後者則透過ScriptManager協助。

ArcGIS Server新建之MapService無法啟動

拜陳兄辛苦更新,把部門內伺服器之環境一併升級,作業系統由老舊的WIN SERVER2003甚至2000升等為WINDOWS SERVER 2008,今日將MXD檔案發佈為地圖服務時卻遭遇到如下錯誤。

Server object instance creation failed on all SOC machine.
Server object instance creation failed on machine ge-sv6306.
Can not open file E:\99009\swg.mxd.
存取被拒。
Probable cause: The file is inaccessible to Server.
錯誤訊息指出:由於MXD檔案無法被存取,造成服務instance啟動失敗。

piggy記得前陣子在相同的ArcGIS Server9.3.1環境下從未遭遇此erroe,MXD設計完成即可透過ArcCatalogue快速部署MapService,因此將茅頭指向作業系統,翻找了一下MXD存放之目錄,的確是有開共用,但仔細看看共用的進階設定,發現必須特別指定agsusers的讀取權限!修正此共用設定後,新建的服務即可正常啟動無誤!
修正前

修正後(加入本機端的agsusers)

順帶一提,agsusers是該伺服器環境「本機使用者群組和帳號」中的群組,其包含之帳號如下所示。

修改FloatingPanel的TitleBarBackgroundImage(ADF)

之前提到因部門政策等因素,必須繼續使用ADF開發專案,而引發想透過其他撰寫方式改變介面的念頭,繼上篇讓ADF的FloatingPanel永遠呈現於最上層(always on Top),這二個禮拜忙一堆阿哩阿雜行政作業,在零碎時間內只增加漂亮的sliding bar,並解決FloatingPanel之TitleBar無法更改背景圖片的小問題,sliding bar非piggy原創就不列入本文討論範圍,感興趣者請參考piggy同事針對瀏覽器 & sliding bar的探討

ADF的FloatingPanel有一TitleBarBackgroundImage屬性,能設定背景圖片之url,無奈指定路徑正確位置後,網頁依然聞風不動,FloatingPanel老那副醜樣T A T

後來刪除Web.config中的主題設定(將< pages theme="Blue_Bridge">之theme="Blue_Bridge"刪除),FloatingPanel的標題列背景總算改變,但自行指定的TitleBarBackgroundImage依舊沒有反映於網頁中,取而代之的是一片慘白=..=a


後來採用取巧方式,既不指定TitleBarBackgroundImage也不更動pages的theme值,而是修改所參考theme之Default.skin檔案。以本文為例,施作對象是FloatingPanel,請在Default.skin中找到< esri:FloatingPanel runat="server"  ...略 ....  TitleBarBackgroundImage="~/App_Themes/Blue_Bridge/images/blue-gradient-24x1.gif" / > ,直接更改此處TitleBarBackgroundImage對應的url值,將其指定到您儲存圖片的路徑即可。
這張還是很醜XD 但測試階段實在不好勞動美編,
請大家意會即可,重點是修改背景圖片~:D

讓ADF的FloatingPanel永遠呈現於最上層(always on Top)

相信Silverlight和FLEX開發者都清楚版面配置與一版的ASP迥然不同,也因此擁有豐富多元、以前在Web系統想都不敢想的貼心UI出現,像是控制項配置有點類似GIS中layer的分層概念,各控制項能出現於同一場景,視覺上可層層交疊、操作上還可互動。

因某些因素無法採用最新SL技術執行當前專案,依然採ESRI已announce不再出新版的ADF,但ADF排版醜到我這毫無審美觀的工程師都看不下去T︿T  這幾天突發奇想,如果人力不夠,無法真正使用RIA技術,那要如何改善排版,讓ADF可以偽裝成SL那種簡潔美麗又好用的介面?!

第一個想作的是,把Map撐至網頁最大範圍,所有功能都置於FloatingPanel內,不用時可拖曳、收合,隨使用者喜好任意擺放。

本來是用DIV來撐開網頁,透過設定DIV與Map之Width&Height等於100%,讓網頁被整張地圖撐滿,但是FloatingPanel反而會因DIV全滿的配置方式,被擠出Browser的可見範圍之外,造成無法操作的窘境。幾經思考,認為由DIV發展的方向可能有誤,一旦有DIV就表示版面被切割,會難以達到「撐滿版面」的預期效果!
解決辦法是針對ADF控制項的CssClass下手即可(請特別注意z-index):

< body>
    < form id="form1" runat="server">
        < esri:MapResourceManager ID="MapResourceManager1" runat="server"   略...>
        < /esri:MapResourceManager>
        < esri:Map ID="Map1" runat="server" Height="100%" MapResourceManager="MapResourceManager1" Width="100%" CssClass="m1" >< /esri:Map>
        < esri:FloatingPanel CssClass="m2" ID="FloatingPanel1" runat="server"  略...>
            < esri:Toc ID="Toc1" runat='server' Height='300px' Width='220px' BuddyControl="Map1" />
        < /esri:FloatingPanel>
    < /form >
< / body>

其中m1與m2設定於head中:
< head runat="server">
    < style type="text/css">
    .m1
    {
        position:absolute;
        top:0px;
        left:0px;
        z-index:0;
    }
    .m2
    {
        position:absolute;
        top:0px;
        left:0px;
        z-index:1;
     }
     < /style>
< /head>

Map撐滿整個網頁
且FloatingPanel always on Top


Silverlight跨網域存取

有摸Silverlight的朋友想必都知道存取後端要透過服務代勞,無法像傳統ASP.NET直接連接DB,在網站與服務架設完成後,多數人常會遇到cross domain的問題,此時要在clientaccesspolicy.xml中設定跨網域資訊,允許哪些網域的Silverlight可以存取服務!想當然爾,clientaccesspolicy.xml要放在服務這邊,但是不少人測試時把服務、Silverlight放在本機,可能不會注意到此細節喲!

< ?xml version="1.0" encoding="utf-8"?>
< access-policy>
  < cross-domain-access>
    < policy>
      < allow-from http-request-headers="*">
        < domain uri="*"/>
      < /allow-from>
      < grant-to>
        < resource path="/" include-subpaths="true"/>
      < /grant-to>
    < /policy>
  < /cross-domain-access>
< /access-policy>

< domain uri="*"/>是指定可以通過的網域,這邊耍懶就讓所有網域內的Silverlight都可存取本地服務:p

另一個重點是clientaccesspolicy.xml要放哪裡?
引據董大偉老師Silverlight範例權威講座2.0,此檔必須放在網站根目錄,摘錄如下
網站的根目錄指的並不是是虛擬目錄的根目錄,倘若你的網站是虛擬目錄,你放在虛擬目錄的根目錄(就是和Web.config同一個目錄)下是無效的,你需要把.xml檔案放到該虛擬目錄所屬的網站的根目錄下才有效。
舉個例子簡單來說:WCF的實際的網站路徑在D:\test\AA,同時也於IIS以虛擬目錄方式發佈服務,若是clientaccesspolicy.xml放在D:\test\AA是沒有用的,
請務必將.xml放在IIS目錄下!就一般情況放在C:\Inetpub\wwwroot即可!


btw存取ESRI之Map Service也一樣,將.xml放在C:\Inetpub\wwwroot即可!

Sys.InvalidOperationException錯誤

使用ESRI提供的ADF模版套件建置網站,時不時都會遇到Sys.InvalidOperationException: Component 'Map1' was not found.錯誤訊息,而且是網站正初始化...尚未進行任何操作前就發生=..=,查到一些相關資訊,根據ArcGIS Server Blog提供的方法作了修正,因為這個錯誤也是不定時的發生,也不知道是不是真的fix了,只能姑且先這樣做了~剩下只能等微軟把bug修復好,不然ESRI基礎於其上所開發的ADF控件也無法修正!

參考網址
ESRI論壇ArcGIS Server Blogseejoel原始版本

by the way, 聽說ESRI要release ArcGIS v10 ~ 不知道這部分有沒有改進

Silverlight3 Tools安裝完畢

安裝完畢後發現VS2008竟然無法preview XAML!
如果和我一樣不習慣的人可以參照章立民老師Blogger的解說,不過我是打算測試ESRI的API, 目前看來VS2008不賞臉XD還好Blend 3改進很多,即使非微軟開發的Silverlight控制項都可以用拖拉的方式使用!

ESRI提供的幾種Behavior可以在Blend中直接拖曳使用

LINQ無法辨認WKT

LINQ第1步驟通常是從伺服器總管拖曳資料表,沒想到今天光是拖曳資料表就發生dbml無法辨認資料格式的問題,後來測試其他資料表,發現是SDE中以Geometry型別存在的資料表作怪,如果要用LINQ可能要暫時避開這種特殊型別!

地圖輸出列印

因為ESRI提供的PrintTask不很好用,中文化又麻煩(這才是重點XXD),所以這次就不再依賴元件,希望以coding方式方式直探底層元件,開發出可提供使用者動態設計地圖的彈性頁面!

之前參考viswaug先生的部落格有挖到寶,目前自動產生legend的測試情況是OK,不過還是使用C#,我打算進一步改寫為VB,並結合其他要一併動態輸出的物件!之後會陸續把code貼上來...
以下為viswaug部落格的相關參考資料
1.作者自行開發的緣由
2.實作的簡略說明
3.開發成果(原碼)

REST API Admin

相信有玩ArcGIS的都知道「ArcGIS Services Directory」可用來瀏覽目前已啟動之服務,及該服務相關資訊、支援之檔案格式等,但是piggy常遇到不論用ArcCatalogArcGIS Server Manager重新啟動/關閉某服務(以下簡稱S),S仍然不存在/存在於起使頁面的怪情況(因為cache還在),這時候就要靠「REST API Admin」出馬了!以下簡單把步驟一一切圖下來給大家參考。

1.
在瀏覽器上輸入網址,導向RST API Admin頁面
http://
架設服務的伺服器IP/ArcGIS/rest/admin/

2.輸入帳號與密碼
登入方式與ArcGIS Server Manager一樣,帳號一定要給機器電腦名稱\帳號(例如pc-21\admin),成功登入之畫面如下圖


3.承上圖,API提供—Clear Cache OptionsServices Directory Options兩種設定工具,請按下Clear Cache Options進入手動清除服務Cache的頁面


4.按下頁面左上方的「Clear Cache Now」即刻清除cache,若出現「Cache Cleared.」的字樣表示您已經成功清除Scache

5.接著我們再回去檢查「ArcGIS Services Directory」,本來怎麼找都找不到的S已經順利出現在Directory的列表中!