2010年10月26日

Insert geometry 前確認是否合法

之前為專案寫了一個 shapefile 匯入程式, 匯入目標是PostgreSQL資料庫, 後來在資料庫中進行 intersect 時發生空間分析的錯誤,經過追查發現有些Geometry有 self-intersection 的狀況,接著還好在 google 找到解決方案


-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-- -- $Id: cleanGeometry.sql 2008-04-24 10:30Z Dr. Horst Duester $--
-- cleanGeometry - remove self- and ring-selfintersections from --                 input Polygon geometries -- http://www.sogis.ch
-- Copyright 2008 SO!GIS Koordination, Kanton Solothurn, Switzerland
-- Version 1.0
-- contact: horst dot duester at bd dot so dot ch--
-- This is free software; you can redistribute and/or modify it under-- the terms of the GNU General Public Licence. See the COPYING file.
-- This software is without any warrenty and you use it at your own risk--  -- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -


CREATE OR REPLACE FUNCTION cleanGeometry(geometry)
  RETURNS geometry AS
$BODY$DECLARE
  inGeom ALIAS for $1;
  outGeom geometry;
  tmpLinestring geometry;
Begin

  outGeom := NULL;
-- Clean Process for Polygon 
  IF (GeometryType(inGeom) = 'POLYGON' OR GeometryType(inGeom) = 'MULTIPOLYGON') THEN
-- Only process if geometry is not valid, -- otherwise put out without change
    if not isValid(inGeom) THEN
-- create nodes at all self-intersecting lines by union the polygon boundaries-- with the startingpoint of the boundary.  
      tmpLinestring := st_union(st_multi(st_boundary(inGeom)),st_pointn(boundary(inGeom),1));
      outGeom = buildarea(tmpLinestring);      
      IF (GeometryType(inGeom) = 'MULTIPOLYGON') THEN      
        RETURN st_multi(outGeom);
      ELSE
        RETURN outGeom;
      END IF;
    else    
      RETURN inGeom;
    END IF;

------------------------------------------------------------------------------
-- Clean Process for LINESTRINGS, self-intersecting parts of linestrings -- will be divided into multiparts of the mentioned linestring ------------------------------------------------------------------------------
  ELSIF (GeometryType(inGeom) = 'LINESTRING') THEN
-- create nodes at all self-intersecting lines by union the linestrings-- with the startingpoint of the linestring.  
    outGeom := st_union(st_multi(inGeom),st_pointn(inGeom,1));
    RETURN outGeom;
  ELSIF (GeometryType(inGeom) = 'MULTILINESTRING') THEN 
    outGeom := multi(st_union(st_multi(inGeom),st_pointn(inGeom,1)));
    RETURN outGeom;
  ELSIF (GeometryType(inGeom) = '' OR GeometryType(inGeom) = 'GEOMETRYCOLLECTION') THEN 
    RETURN NULL;
  ELSE 
    RAISE NOTICE 'The input type % is not supported %',GeometryType(inGeom),st_summary(inGeom);
    RETURN inGeom;
  END IF;     End;$BODY$
  LANGUAGE 'plpgsql' VOLATILE;
以上這段是要在PostgreSQL裡建立一個function,然後在進行 insert 動作的時候, 讓要 insert 的 geometry 先丟到這個function進行檢查並重整後, 回傳正確的 geometry。結束

2010年10月24日

[Windows 7] 我不要讓「媒體櫃」成為檔案總管的「首頁」

在去年10月底上市的微軟最新作業系統 — Windows 7,裡面加入了不少新功能。尤其在顯而易見的用戶體驗方面上,像是新的檔案管理方式「媒體櫃」就是其中之一。簡單來說,媒體櫃是一個可以讓使用者用更簡便、更有彈性的方式管理硬碟中檔案的功能。另外,它也能幫助使用者在更短的時間內找到需要的檔案。
也因為這個新功能的推出,當使用者按下工作列上的「檔案總管」時,首先看到的就是媒體櫃。就好比瀏覽器有所謂的首頁,而「媒體櫃」就像是檔案總管的「首頁」一樣。
打開工作列上的檔案總管,使用者就直接被帶到「媒體櫃」▼
「媒體櫃」是工作列上檔案總管的預設開啟位置
這項設計顯然是微軟希望使用者可以多多利用媒體櫃來整理檔案。但事實上,並不是所有人都喜歡使用媒體櫃;或者是習慣在打開檔案總管時,一開始看到的是「我的電腦」、「我的文件」、「D 槽」…等等其它位置。
所以下面要示範的是,如何更改打開檔案總管時顯示的預設位置。
第一步、在工作列上的檔案總管上按下右鍵,在彈出的選單中,在「Windows 檔案總管」上再按一次右鍵,接著點選「內容(R)」▼
進入檔案總管的捷徑內容
第二步、在「目標」欄裡貼上我們要檔案總管開啟時的預設位置,貼上後按下確定 ▼
更改檔案總管的目標位置
以下是幾個比較常用的位置。
  • 我的電腦:
    %SystemRoot%\explorer.exe /E,::{20D04FE0-3AEA-1069-A2D8-08002B30309D}
  • 我的文件: 
    %SystemRoot%\explorer.exe /n,::{450D8FBA-AD25-11D0-98A8-0800361B1103}
  • 資源回收筒:
    %SystemRoot%\explorer.exe /E,::{645FF040-5081-101B-9F08-00AA002F954E}
  • 控制台:
    %SystemRoot%\explorer.exe /E,::{26EE0668-A00A-44D7-9371-BEB064C98683}
  • 網路連線:
    %SystemRoot%\explorer.exe /E,::{7007ACC7-3202-11D1-AAD2-00805FC1270E}
打開檔案總管時,讓「我的電腦」成為預設的目標位置 ▼
讓「我的電腦」成為預設的目標位置
如果希望在打開檔案總管,首先進入「C 槽」、「D 槽」或是硬碟裡其它位置的話,只要在「目標」欄裡打入路徑就行了 ▼
硬碟中的其它位置,例如「C 槽」
轉貼自joaoko blog

2010年8月19日

[C#]動態取得UserControl的HTML

使用JQuery來做一些互動性高的網頁操作是非常方便的,尤其運用當中的AJAX方法可以達到逼近桌面程式的效果。前一陣子我在思考如何讓網頁上的每個區塊都是獨立的HTML,然後透過AJAX的方式逐一取得或更新,我個人想到了以下兩個方案

  1. ASP.NET MVC絕對是可以輕鬆辦到這件事情的。
  2. 每個區塊的內容都設計成單一的ASPX網頁,再讓Jquery去依據需要透過AJAX取得網頁內容
Well, 由於我是在既有的系統上必須做到這件事情,因此在這個節骨眼引進ASP.NET MVC對我來說風險太大,因此第一個方案我只好不考慮;第二個方案聽起來還不錯,讓每個區塊的內容都來自不同的Source,在維護上也比較容易些,只是每個網頁產生出來的HTML內容夾雜了許多我不需要的東西,例如HTML、TITLE、BODY、FORM.....等等,我還得逐一處理掉這些,看來也不是挺舒服的方法。後來我想到UserControl,因為UserControl在Render HTML時,只會依據UserControl內設計的元素進行Render,看起來會比ASPX頁面來做Render要俐落許多,因此如果將第二個方案中的ASPX換成UserControl那就再好不過了,只是一般在操作UserControl上都要先在ASPX頁面上進行註冊才能呼叫使用,如下程式碼所示:

<%@ Register src="Menu.ascx" tagname="Menu" tagprefix="uc1" %>
這樣每次若在頁面上新增UserControl就需要增加註冊資訊一次,看在我們這種龜毛工程師的眼裡真是非常不舒服的。所以如果有方法能不需註冊在頁面上就可以產生UserControl的HTML,那真是佛心來的~ 以下的程式碼正是提供這個方法的核心程式,非常簡單!
public class HTMLHelper
{
    //使用委派,可以讓我們在建立UserControl時, 可以執行一些我們需要的動作
    public delegate void InitializeControlDelegate(T ControlToUse);
    public static string RenderUserControl(string ControlPath, InitializeControlDelegate InitControlCallback) where T : UserControl
    {

        //建立新的頁面物件
System.Web.UI.Page pageHolder = new Page();
        //從指定的位置載入UserControl,並轉換為型別T
T ControlToRender = (T)pageHolder.LoadControl(ControlPath);
        //將這個UserControl加入到頁面中
pageHolder.Controls.Add(ControlToRender);  //執行指定的委派工作
        InitControlCallback.Invoke(ControlToRender); 
        //建立一個字串寫入物件
        StringWriter result = new StringWriter(); 

        //使用Server.Execute執行網頁並將網頁內容寫入到 result
System.Web.HttpContext.Current.Server.Execute(pageHolder, result, false); return result.ToString(); //回傳結果 } }
再來讓我們來看看要怎麼用它,因為現在使用.NET 3.5 進行開發,所以可以使用Lamba語法,因此在委派上可以用更簡單的作法:
string _ucHtml = HTMLHelper.RenderUserControl(
                "~/inc/block/GoodCollection.ascx",
                uc =>
                {
                    uc.StorePK = 1;
                    uc.TypePK = 5;
                }
                );
這樣就不單只是叫UserControl產生HTML,也可以在UserControl設計好屬性或方法,讓UserControl依據系統需要產生適當的HTML出來囉。

2010年5月27日

Lost 全劇終

Lost在 2010/5/23 正式畫下句點。心裡無限感慨...有點失落的感覺揮之不去~ 但這就是人生! 每件事情都有它結束的一天,停下來懷念後,再繼續move on。

2010年5月25日

原來有這麼久的時間了

今天心血來潮看了一下自己的部落格, 原來我已經有這麼久都沒更新我的文章了~ 嗯.. 也是時侯再出發了!

2009年1月5日

2009年,混沌未明的經濟

經濟真的不好,看看身邊的親朋好友就知道,雖然我還過得去,但感受到的這股氣氛真的讓人不愉快。衷心希望2009年大家都能比去年快樂....

2008年9月11日

啞了的部落格

大半年沒有更新部落格了,覺得好像我已經變啞巴了。這段時間其實發生很多事情,很多讓人開心、讓人憂鬱、讓人緊繃、讓人悲傷的事情,我從來沒有把我的部落格當成情緒的宣洩處,都是當做我喜歡的事物分享集中營,我的部落格一直都不專業,什麼都想講什麼都想說什麼都想讓人家看,這跟我這個人的個性實在太像。
看看我自己部落格上百篇的文章,我很懷疑我之前哪來的毅力可以這麼幹,我想應該是我現在的時間都奉獻給工作與家庭了,今天中午休息時也不知道為什麼突然想寫個東西,那就上來寫吧~ 不然我要這個部落格做什麼用呢?那以後? 我也不知道,以後就讓以後再說吧。

2008年2月13日

便宜的旅行箱

太久沒上來看自己的BLOG,結果看到一堆網友在詢問行李箱去哪買,我真的感到不好意思~ 現在說明也太晚了,因為那個攤位應該只是臨時攤位而已
所以也早就沒有再擺囉~ 如果網友有興趣的話可以參考 羅小美網友提供的網站http://www.mjholly.com 看看吧

今天帶著老婆小孩去逛愛買樓上的B&Q,而老婆想到要買行李箱,就到一樓去找了賣行李箱的攤位,想不到剛好有特價品。據那位阿桑店員說是她們在新光三越的專櫃撤了,這些是存貨要出清所以才在特價,這說是他在說,不管是真是假,那些旅行箱真的很便宜!~

這件21吋的硬殼旅行箱只要650喔~ 超便宜的~~網路上同款旅行箱要賣1390呢!(感謝女兒充當麻豆~)


兩段式伸縮把手


牌子是JUST BEETLE,說實在的我根本沒聽過啦~


要打開囉~


啥~ 裡面黑黑的那是甚麼?


哈~ 是我另外買的17吋硬殼電腦背包喔~


這個硬殼背包只要250耶!(網路價399) 看看裡面有好多內袋~ 我是買來準備要放WII的~ 當然WII專用包會比較好啦...


現場我還看到這組,在momo台賣快4000元,但特價只要1600~ 可惜對我們來說太大囉...

2007年12月26日

用Wiimote還可以怎麼玩?

這位仁兄太厲害了~ 竟然可以想到WII要這樣玩,而且3D感十足! 光看影片都感受到那種體感的威力! 大家一定看看這段影片啊~~

霹靂遊俠 2008

美國NBC電視網將在2008年2月17日首映 霹靂遊俠2008 兩小時的電視電影版,如果你已經忘記什麼是霹靂遊俠的就看一下下方的劇照吧。 如果你不用看就已經知道的那就表示你真的夠老smile_teeth

只是舊瓶裝新酒可不可以得到大家的青徠,還是需要看劇情內容是不是有創新喔~據說新一代的車子具有變形能力(舊代霹靂車是會長出尾巴及小翅膀,但我不覺得那稱得上是變形),這點子不會是從變形金剛來的吧?

ap_20071218124534212

男主角扮演的是前一代男主角--李麥克的兒子,既然是繼承式的劇情,當然擔任老爸角色的也就是原男主角 David Hasselhoff 來擔任啦~

7551-450x-knight_2

這一次的主角—霹靂車,由原來的 PONTIAC Firebird 改為全新世代的 FORD Mustang Shelby GT500KR,且為了承襲當時的黑色風格,全車採用黑色塗妝,於車身上的拉線則以霧黑處理。並將原來的GT500KR做了一些修改,採用V8引擎,CC數為5,400,馬力具備550hp,扭力達70.5kgm。而這台車也在"我是傳奇"的電影中有出現喔!

ap_20071218124528722

ap_20071218124532545

ap_20071218124530780

 7556-450x-knight
新車舊車比一比

2007年12月7日

當劉伯溫遇上打鼓機....

當我在DTXmania打鼓機模擬器鼓譜創作日誌看到這段影片,差點崩潰~ 或許我太久沒接觸這類遊戲,所以應該是我早就跟這個圈子脫節了??

我猶然記得五六年前在網路上看到人家自創的打鼓機鼓譜,當時都以日本流行歌曲及動畫歌曲為主(那時真的只有宅男會幹種種事),想不到現在本土化的威力這麼厲害,將鄉土劇 (雖然他是在講中國故事) 跟打鼓機結合真是想都沒想到的事情,不過NAMCO都可以把日本傳統太鼓作成遊戲,然後用一些兒歌當鼓譜了,想到這也就不足為奇了。

但是我還是要給台灣人的創新加油囉~

2007年11月28日

Google開始在PicasaWeb中文版提供地圖服務了

新功能都是先開放英文版,然後才有其他語言的版本。這個地圖功能也不例外,要使用這個功能必須要先上傳好照片到相簿中,然後再使用地圖編輯功能,用拖拉照片的方式,將照片放到想要擺放的地理位置上就可以了,而這些上傳的照片只要是放在公開的相簿中,都可以在Google Earth上看到喔。

picasaweb