2010-06-23 17 views
1

我有一大組數據點(所有的2D代表一個形狀的邊緣),其中存在很多,所有的直線排成一系列的許多點(像素),我想通過刪除點來優化數據組成直線(相同的矢量),只留下系列的最後兩個端點來定義直線並忽略其間的所有點(抽取)。是否有.NET庫或示例代碼可用於優化線上的點或抽取?

嚴格在網格的X軸和Y軸上的線條系列呈現出一種複雜程度。第二級是對角線,當應用於網格(即像素)時,可能需要通過內插圖案來確定一些線。 (即1上升3,超過1上升,1上升5等等代表一條直線)

我想利用任何現有的庫或示例代碼片斷可能已經存在,而不是重新發明輪子完全從頭開始。

任何指針,提示,代碼建議,算法,部分解決方案等將不勝感激。

這將是一個.NET項目,但我也很熟悉其他語言(ruby,perl,python),所以如果這樣的例子存在於類似的語言中,那對我來說會很有用。

感謝

alt text http://www.streamline-ss.com/tmp/point_optimization.png

的目標更新:

  • 我們能夠改變所述輸入數據集進行優化是一個無單位的網格/像素的基於位置數據從原始來源,而不是內插單元基於位置設置(以避免所計算的方差格)
  • 這個輸入數據集的例子(未優化)是這裏http://pastie.org/1017486
  • 到目前爲止,我已經能夠編寫一個程序,將刪除重複,並刪除具有相同的X或任何相同點y作爲前一點
  • 需要找到一種方法來識別重複發生的模式並消除所有e開始和結束模式的結束點 - 用於直線抽取。
  • 我還沒有找到一個庫,類或代碼段在那裏,其中有人已經做到了這一點,但在我看來,這不是一個新的挑戰,有人肯定已經發明瞭這個輪
+0

這些要點有多準確?你有沒有關於它們的額外信息(比如一個命令,例如,如果它們是用鼠標繪製的,你可以按照它們的順序列出它們)? – Artelius 2010-06-23 03:05:41

+0

這是一個以製表符分隔格式設置的示例數據http://pastie.org/1015400 – Streamline 2010-06-23 03:40:06

+0

數據表示已從圖像文件「像素化」的形狀的邊緣 – Streamline 2010-06-23 04:01:35

回答

1

有是一個非常好的GIS庫,名爲Net Topology Suite,它具有很多幾何類型的功能。這可能涵蓋您正在尋找的功能。它是LGPL許可的。我用它做了多邊形交集,取得了很大的成功。

+0

感謝您使用Net Topology Suite的提示。我會調查它看起來可以做些什麼。我下載了zip文件,但我看不到在網站上的任何文檔。你熟悉這個庫的任何文檔嗎? – Streamline 2010-06-24 18:29:15

+0

如果您下載「源代碼」壓縮文件,他們在那裏有示例代碼。我查看了代碼,樣本和系統結構,以獲取所需的信息。代碼組織得很好,只是沒有明確的文檔。有XML文檔,但是你必須使用Sandcastle來生成一個.chm文件。 – 2010-06-24 19:26:32

1

怎麼樣道格拉斯·普克算法wikipedia NetTopologySuite有它的一個implemnetation 我已經使用了簡化GPX跟蹤

如果您的數據轉換成線段形式則是死的簡單易用

GisSharpBlog.NetTopologySuite.Simplify.DouglasPeuckerLineSimplifier simplifyer = new GisSharpBlog.NetTopologySuite.Simplify.DouglasPeuckerLineSimplifier(lineString.Coordinates); 
simplifyer.DistanceTolerance = 5;//some number that makes sense; 
GeoAPI.Geometries.ILinearString simplifyedLineString = new GisSharpBlog.NetTopologySuite.Geometries.LineString(simplifyer.Simplify()); 
+0

fossdal,感謝您的輸入 - 這看起來像值得嘗試的東西。在一個快速審查中,然而,你的輸入是否在這裏:lineString.Coordinates假設座標全部是一行一行嗎?你的lineString是如何創建的?在我的情況下,它是一個點數組(PointF []),我需要首先識別它們中的行,然後優化什麼是定義(簡化)。另外,如何將當前數據集PointF []放入ICoordinate []類中? – Streamline 2010-07-07 19:51:50

+0

我假設座標是一行的ale,它的劑量必須是一條直線。您也可以使用DouglasPeuckerLineSimplifier.Simplify(coords.ToArray(),Distance)上的靜態方法; 創建座標只是循環你的pointF的和創建一個coords.Add(新的GisSharpBlog.NetTopologySuite.Geometries.Coordinate(x,y)); 我已經創建了一個小樣本,你可以加載測試數據 你可以下載它在http://www.osm.fossdal.dk/SimplifyingSample.zip 你可以試試它的值在0.001和0.006之間 – LiFo 2010-07-08 00:40:04

+0

fossal,感謝您的示例包。有沒有可能將它作爲VS2008解決方案輸出?它似乎是2010年,我無法打開它。謝謝! ...我可能只是從頭開始重建它以及 – Streamline 2010-07-08 04:47:49

相關問題