2014-09-06 21 views
-1

我該如何做以下我沒有要求具體的代碼,但我需要一些指導,因爲我已經在這幾個星期裏絞盡腦汁。簡單地說,我想製作一個例如。美國和每個州是不同的圖片或地區,可以被挖掘和點擊。我嘗試使用PNG和透明膠片,但我處於死衚衕。更雄心勃勃地,我想用州首府將標籤拖放到每個州,然後將它們放在那裏,然後有一個過程,如果標籤/資本匹配其正確的狀態,否則不是。製作按鈕地圖?

我試過GIS(?)我想這樣做C#但我不能得到牽引如何做到目前爲止。誰能幫忙?這在C#中太困難了嗎?我應該使用另一種方法嗎?請問這是什麼方法?

回答

0

好消息第一:編程部分並不那麼辛苦,即使是老Winforms,你也可以在幾行內做核心檢查。但是,可點擊區域不能是Winforms中的按鈕。

這裏有兩種解決方案:

解決方案1 ​​:您可以定義的區域,稱爲地區和測試列表,如果得到了點擊。

這是一個開始:我定義了一個非常簡單的Rectangle Region和一個並非如此簡單的Polygon Region,並在每次點擊時測試是否有人被擊中。如果被擊中I輸出它的數據到窗體的標題文字:

//.. 
using System.Drawing.Drawing2D; 
//.. 
public Form1() 
{ 
    InitializeComponent(); 
    // most real states don't look like rectangles 
    Region r = new Region(new Rectangle(0, 0, 99, 99)); 
    regions.Add(r); 
    List<int> coords = new List<int>() {23,137, 76,151, 61,203, 
         117,283, 115,289, 124,303, 112,329, 76,325, 34,279, 11,162}; 
    List<Point> points = new List<Point>(); 
    for (int i = 0; i < coords.Count ; i += 2) 
         points.Add(new Point(coords[i], coords[i+1])); 
    byte[] fillmodes = new byte[points.Count]; 
    for (int i = 0 ; i < fillmodes.Length; i++) fillmodes[i] = 1; 
    GraphicsPath GP = new GraphicsPath(points.ToArray(), fillmodes); 
    regions.Add(r); 

} 

List<Region> regions = new List<Region>(); 


private void pictureBox1_MouseClick(object sender, MouseEventArgs e) 
{ 
    using (Graphics G = pictureBox1.CreateGraphics()) 
    foreach(Region r in regions) 
    { 
     Region ri = r.Clone(); 
     ri.Intersect(new Rectangle(e.X, e.Y, 1, 1)); 
     if (!ri.IsEmpty(G)) // hurray, we got a hit 
      { this.Text = r.GetBounds(G).ToString(); break; } 
    } 

} 

測試PROGRAMM的地區是不可見的。測試你可能需要添加這樣的事情:

private void button1_Click(object sender, EventArgs e) 
{ // paint a non-persistent filling 
    using (Graphics G = pictureBox1.CreateGraphics()) 
     foreach (Region r in regions) 
     { G.FillRegion(Brushes.Red, r); } 
} 

但現在壞消息:你可以然而定義區域是結構複雜的多邊形看起來像真正的狀態,即很多工作的!在網絡上有現成的圖像地圖編輯器用於在網站上製作可點擊的地圖。你最好的課程可能是使用其中的一個創建所有這些多邊形,然後將html輸出轉換爲可讀入程序的點列表。你甚至可能會得到幸運,找到現成圖像映射爲美國,但我沒有看過..

更新:有是美國的許多圖像映射在那裏。一個甚至在wikipedia。轉換這些座標以適應您的地圖將是一項任務,但比從頭開始創建它們要容易得多,比如imo。我已經更改了代碼,以包含來自維基百科源的一份名單。猜猜狀態!

我已經啓動了一個程序,可讓您單擊某個狀態並在78行代碼中顯示該名稱,不包括具有50個州的文本文件。

解決方案2

而是多邊形的列表,你可以用有色地圖,並使用顏色鍵進入Dictionary<Color, string>Dictionary<Color, StateInfo>的。您必須確保每個狀態都有一個唯一的顏色,並且圖像不會被壓縮爲jpeg,這會引入工件並弄亂關鍵映射。

接下來你將每種顏色映射到相關信息;這纔是真正的工作,因爲你必須知道這些國家創造了詞典;-)

最後你可以看一下在字典已創建的點擊的顏色:

Color c = ((Bitmap) pictureBox1.Image).GetPixel(e.X, e.Y) 
string StateName = stateDictionary[c]; 

如果您使用的是類或結構作爲你的值在字典中,你可以包括大寫等。

你可以縮放,但必須規模相應的點擊位置;你甚至可以顯示一個地理圖像,如果你查找關鍵顏色不在圖片框,但在一個不可見的顏色代碼位圖。 總而言之,更簡單的解決方案imo ..您的選擇!

一旦你得到那個工作,你可以玩拖動&下降。在這裏,您需要測試DragDrop或者在Mouseup上查看丟棄標籤的位置。

這是一個不錯的項目,很值得創建幾個類,使事情變得更容易和更可擴展。

對於真正的按鈕,您可能會對WPF感到幸運。

+0

我花了幾天試圖找到一個可以理解的解決方案。我會逐步嘗試你的建議。我的g_d將VS.net功能添加到VS Express大約有700MB的下載量。我打算嘗試asp,因爲大多數圖像映射的支持文檔都是針對asp的。讓我試着讓你的代碼建議工作......謝謝。 – user1325143 2014-09-08 23:51:23

+0

我得到一個錯誤:錯誤在當前上下文中不存在名稱'區域'\t我無法找到「添加」方法試圖在「區域」中使用上限或變化我正在使用VS Express 2010 – user1325143 2014-09-09 02:35:47

+0

I看看你想要做什麼,我會盡力讓它工作。 C#是困難的,希望它的力量匹配它的學習曲線... – user1325143 2014-09-09 17:00:59