我該如何做以下我沒有要求具體的代碼,但我需要一些指導,因爲我已經在這幾個星期裏絞盡腦汁。簡單地說,我想製作一個例如。美國和每個州是不同的圖片或地區,可以被挖掘和點擊。我嘗試使用PNG和透明膠片,但我處於死衚衕。更雄心勃勃地,我想用州首府將標籤拖放到每個州,然後將它們放在那裏,然後有一個過程,如果標籤/資本匹配其正確的狀態,否則不是。製作按鈕地圖?
我試過GIS(?)我想這樣做C#但我不能得到牽引如何做到目前爲止。誰能幫忙?這在C#中太困難了嗎?我應該使用另一種方法嗎?請問這是什麼方法?
我該如何做以下我沒有要求具體的代碼,但我需要一些指導,因爲我已經在這幾個星期裏絞盡腦汁。簡單地說,我想製作一個例如。美國和每個州是不同的圖片或地區,可以被挖掘和點擊。我嘗試使用PNG和透明膠片,但我處於死衚衕。更雄心勃勃地,我想用州首府將標籤拖放到每個州,然後將它們放在那裏,然後有一個過程,如果標籤/資本匹配其正確的狀態,否則不是。製作按鈕地圖?
我試過GIS(?)我想這樣做C#但我不能得到牽引如何做到目前爲止。誰能幫忙?這在C#中太困難了嗎?我應該使用另一種方法嗎?請問這是什麼方法?
好消息第一:編程部分並不那麼辛苦,即使是老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感到幸運。
我花了幾天試圖找到一個可以理解的解決方案。我會逐步嘗試你的建議。我的g_d將VS.net功能添加到VS Express大約有700MB的下載量。我打算嘗試asp,因爲大多數圖像映射的支持文檔都是針對asp的。讓我試着讓你的代碼建議工作......謝謝。 – user1325143 2014-09-08 23:51:23
我得到一個錯誤:錯誤在當前上下文中不存在名稱'區域'\t我無法找到「添加」方法試圖在「區域」中使用上限或變化我正在使用VS Express 2010 – user1325143 2014-09-09 02:35:47
I看看你想要做什麼,我會盡力讓它工作。 C#是困難的,希望它的力量匹配它的學習曲線... – user1325143 2014-09-09 17:00:59