Disegnare un poligono su una MapView usando l'Oggetto "Figlio" DrawingArea
Il Controllo grafico MapView mostra la mappa su una DrawingArea, che è un Oggetto "Figlio" di un Panel, "Figlio" a sua volta del Controllo MapView:
MapView ⬇ padre di un Panel ⬇ padre di una DrawingArea
Pertanto, sarà possibile utilizzare tale DrawingArea per disegnare qualsiasi cosa, facendola apparire al di sopra della mappa.
Mostriamo di seguito il codice base per disegnare ogni volta nel punto, ove si è cliccato sulla mappa con il puntatore del mouse, un poligono [nota 1], che rimarrà visibile sulla mappa anche dopo l'inserimento di altri poligoni.
Per inserire il disegno di un poligono sulla DrawingArea della MapView, si dovrà cliccare con il tasto destro del mouse.
Variando lo zoom della mappa, la dimensione del poligono si adatterà a tale variazione.
Per variare la dimensione del poligono, disegnato sulla DrawingArea della MapView, si dovrà cambiare il valore della Costante "RAGGIO".
A seconda del tipo di poligono da disegnare sulla mappa bisognerà sostituire le parti punteggiate in rosso e in grassetto con i pezzi coerenti di codice proposti a seguire.
Private MapView1 As MapView Private Const RAGGIO As Single = 50.0 Private Const ZOOM As Byte = 14 ' Zoom iniziale Private Const ......... ' Qui va il nome della Costante del poligono e il rispettivo valore in base al numero dei vertici Private pn As Panel Private mmpp As New MapPoint[] Private coord As Single[] Private pol As New Single[] Public Sub Form_Open() With Me .W = Screen.AvailableWidth .H = Screen.AvailableHeight .Arrangement = Arrange.Fill End With With MapView1 = New MapView(Me) As "MapView1" .Map.AddTile("GoogleMap", "http://mt0.google.com/vt/lyrs=s&hl=&x={x}&y={y}&z={z}") .Map.Zoom = 14 .Map.Center = New MapPoint(41.89018, 12.49230) End With ' Individua dapprima l'Oggetto "Figlio" della "MapView", che è un "Panel": pn = MapView1.Children[0] End Public Sub MapView1_MouseUp() If Not Mouse.Right Then Return Dim pt As New Point(Mouse.X, Mouse.Y) ' Si usa l'Oggetto "MapPoint" per garantire la coerenza del puntamento su un punto della mappa anche nel caso di spostamento o variazione dello zoom della mappa medesima: mmpp.Push(MapView1.Map.PixelToMapPointRel(pt)) Me.Caption = "Lat. " & Format(mmpp[mmpp.Max].Lat, "0.00000") & " - Lon. " & Format(mmpp[mmpp.Max].Lon, "0.00000") ' Se si vuole immettere sulla "DrawingArea" dei poligoni, aventi un raggio (e quindi una dimensione) pari al raggio impostato come Costante, proporzionato allo zoom attuale, si inserirà il seguente codice, contenente la formula per proporzionare il raggio del poligono allo zoom corrente: Dim rd As Single = RAGGIO * CSingle(2 ^ (MapView1.Map.Zoom - ZOOM)) For t As Short = 0 To 360 Step 360 / ......... ' Qui va il nome della Costante del poligono pol.Push(rd * Cos(Rad(t))) pol.Push(rd * Sin(Rad(t))) Next ' Altrimenti si useranno le seguenti righe: ' For t As Short = 0 To 360 Step 360 / ......... ' Qui va il nome della Costante del poligono ' pol.Push(RAGGIO * Cos(Rad(t))) ' pol.Push(RAGGIO * Sin(Rad(t))) ' Next MapView1.Refresh End Public Sub MapView1_Draw() ' Si proporzionano i poligoni, disegnati sulla "DrawingArea" allo zoom corrente: Dim rd As Single = RAGGIO * CSingle(2 ^ (MapView1.Map.Zoom - ZOOM)) For t As Short = 0 To 360 Step 360 / ......... ' Qui va il nome della Costante del poligono pol.Push(rd * Cos(Rad(t))) pol.Push(rd * Sin(Rad(t))) Next With Paint .Begin(pn.Children[0]) .Brush = .Color(Color.Yellow) ' Proporziona lo spessore del perimetro del poligono allo zoom corrente: .LineWidth = 2.5 * CSingle(1.5 ^ (MapView1.Map.Zoom - ZOOM)) For i As Integer = 0 To mmpp.Max coord = [MapView1.Map.MapPointToPixelRel(mmpp[i]).X, MapView1.Map.MapPointToPixelRel(mmpp[i]).Y] .Polygon([.........]) Next .Stroke .End End With pol.Clear End
Indice
- 1 Parti da inserire per disegnare un Triangolo
- 2 Parti da inserire per disegnare un Quadrato
- 3 Parti da inserire per disegnare un Rettangolo
- 4 Parti da inserire per disegnare un Tapezio Isoscele
- 5 Parti da inserire per disegnare un Tapezio Rettangolo
- 6 Parti da inserire per disegnare un Tapezio Scaleno
- 7 Parti da inserire per disegnare un Rombo
- 8 Parti da inserire per disegnare un Romboide
- 9 Parti da inserire per disegnare un Pentagono regolare
- 10 Parti da inserire per disegnare un Esagono regolare
- 11 Parti da inserire per disegnare un Eptagono regolare
- 12 Parti da inserire per disegnare un Ottagono regolare
- 13 Note
Parti da inserire per disegnare un Triangolo
Le parti di codice che, per disegnare un Triangolo, sostituiranno quelle punteggiate in rosso del codice generico, sopra mostrato, sono le seguenti:
' Il nome identificativo della Costante del Triangolo, il tipo di dato e il rispettivo valore in base al numero dei suoi vertici: Private Const TRIANGOLO As Byte = 3
In questo caso va modificato anche il valore iniziale del cislo "FOR...NEXT" in base al numero dei suoi vertici: For t As Short = 30 To 360 Step 360 / TRIANGOLO
.Polygon([(coord[0] + pol[0]), (coord[1] + pol[1]), (coord[0] + pol[2]), (coord[1] + pol[3]), (coord[0] + pol[4]), (coord[1] + pol[5])])
Parti da inserire per disegnare un Quadrato
Le parti di codice che, per disegnare un Quadrato, sostituiranno quelle punteggiate in rosso del codice generico, sopra mostrato, sono le seguenti:
Private Const QUADRATO As Byte = 4
In questo caso va modificato anche il valore iniziale del cislo "FOR...NEXT": For t As Short = 45 To 360 Step 360 / QUADRATO
.Polygon([(coord[0] + pol[0]), (coord[1] + pol[1]), (coord[0] + pol[2]), (coord[1] + pol[3]), (coord[0] + pol[4]), (coord[1] + pol[5]), (coord[0] + pol[6]), (coord[1] + pol[7])])
Parti da inserire per disegnare un Rettangolo
Le parti di codice che, per disegnare un Rettangolo, sostituiranno quelle punteggiate in rosso del codice generico, sopra mostrato, sono le seguenti:
Private Const RETTANGOLO As Byte = 4
In questo caso va aggiunta la seguente riga per impostare i punti ideali sulla ipotetica circonferenza, sulla quale insistono i quattro vertici del Rettangolo da disegnare e contestualmente va modificata la riga del ciclo "FOR...NEXT": For t As Short = 45 To 360 Step 360 / RETTANGOLO
.Polygon([(coord[0] + pol[0]), (coord[1] + pol[1]), (coord[0] + pol[2]) - (40 * CSingle(2 ^ (MapView1.Map.Zoom - ZOOM))), (coord[1] + pol[3]), (coord[0] + pol[4]) - (40 * CSingle(2 ^ (MapView1.Map.Zoom - ZOOM))), (coord[1] + pol[5]), (coord[0] + pol[6]), (coord[1] + pol[7])])
Parti da inserire per disegnare un Tapezio Isoscele
Le parti di codice che, per disegnare un Trapezio isoscele, sostituiranno quelle punteggiate in rosso del codice generico, sopra mostrato, sono le seguenti:
Private Const TRAPEZIO_ISOSCELE As Byte = 4
In questo caso va aggiunta la seguente riga per impostare i punti ideali sulla ipotetica circonferenza, sulla quale insistono i quattro vertici del Trapezio isoscele da disegnare e contestualmente va modificata la riga del ciclo "FOR...NEXT": For t As Short = 45 To 360 Step 360 / TRAPEZIO_ISOSCELE .Polygon([(coord[0] + pol[0]) + (30 * CSingle(2 ^ (MapView1.Map.Zoom - ZOOM))), (coord[1] + pol[1]), (coord[0] + pol[2]) - (30 * CSingle(2 ^ (MapView1.Map.Zoom - ZOOM))), (coord[1] + pol[3]), (coord[0] + pol[4]), (coord[1] + pol[5]), (coord[0] + pol[6]), (coord[1] + pol[7])])
Parti da inserire per disegnare un Tapezio Rettangolo
Le parti di codice che, per disegnare un Trapezio rettangolo, sostituiranno quelle punteggiate in rosso del codice generico, sopra mostrato, sono le seguenti:
Private Const TRAPEZIO_RETTANGOLO As Byte = 4
In questo caso va aggiunta la seguente riga per impostare i punti ideali sulla ipotetica circonferenza, sulla quale insistono i quattro vertici del Trapezio rettangolo da disegnare e contestualmente va modificata la riga del ciclo "FOR...NEXT": For t As Short = 45 To 360 Step 360 / TRAPEZIO_ISOSCELE In questo caso, per creare il Trapezio rettangolo, basterà partire dalle coordinate del Rettangolo, avendo cura di ridurre la lunghezza del lato superiore da un solo vertice: .Polygon([(coord[0] + pol[0]), (coord[1] + pol[1]), (coord[0] + pol[2]), (coord[1] + pol[3]), (coord[0] + pol[4]), (coord[1] + pol[5]), (coord[0] + pol[6]) - (30 * CSingle(2 ^ (MapView1.Map.Zoom - ZOOM))), (coord[1] + pol[7])])
Parti da inserire per disegnare un Tapezio Scaleno
Le parti di codice che, per disegnare un Trapezio scaleno, sostituiranno quelle punteggiate in rosso del codice generico, sopra mostrato, sono le seguenti:
Private Const TRAPEZIO_SCALENO As Byte = 4
In questo caso va aggiunta la seguente riga per impostare i punti ideali sulla ipotetica circonferenza, sulla quale insistono i quattro vertici del Trapezio scaleno da disegnare e contestualmente va modificata la riga del ciclo "FOR...NEXT": For t As Short = 45 To 360 Step 360 / TRAPEZIO_SCALENO
In questo caso, per creare il Trapezio scaleno, basterà partire dalle coordinate del Rettangolo, avendo cura di ridurre la lunghezza del lato superiore da entrambi i suoi due vertici: .Polygon([(coord[0] + pol[0]) + (50 * CSingle(2 ^ (MapView1.Map.Zoom - ZOOM))), (coord[1] + pol[1]), (coord[0] + pol[2]), (coord[1] + pol[3]), (coord[0] + pol[4]) + (20 * CSingle(2 ^ (MapView1.Map.Zoom - ZOOM))), (coord[1] + pol[5]), (coord[0] + pol[6]) - (10 * CSingle(2 ^ (MapView1.Map.Zoom - ZOOM))), (coord[1] + pol[7])])
Parti da inserire per disegnare un Rombo
Le parti di codice che, per disegnare un Rombo, sostituiranno quelle punteggiate in rosso del codice generico, sopra mostrato, sono le seguenti:
Private Const ROMBO As Byte = 4
In questo caso va aggiunta la seguente riga per impostare i punti ideali sulla ipotetica circonferenza, sulla quale insistono i quattro vertici del Rombo da disegnare e contestualmente va modificata la riga del ciclo "FOR...NEXT": For t As Short = 0 To 360 Step 360 / ROMBO In questo caso, per creare il Rombo, basterà partire dalle coordinate del Rettangolo, avendo cura di ridurre la distanza fra due vertici contrapposti: .Polygon([(coord[0] + pol[0]) - (30 * CSingle(2 ^ (MapView1.Map.Zoom - ZOOM))), (coord[1] + pol[1]), (coord[0] + pol[2]), (coord[1] + pol[3]), (coord[0] + pol[4]) + (30 * CSingle(2 ^ (MapView1.Map.Zoom - ZOOM))), (coord[1] + pol[5]), (coord[0] + pol[6]), (coord[1] + pol[7])])
Parti da inserire per disegnare un Romboide
Le parti di codice che, per disegnare un Romboide, sostituiranno quelle punteggiate in rosso del codice generico, sopra mostrato, sono le seguenti:
Private Const ROMBOIDE As Byte = 4
In questo caso va aggiunta la seguente riga per impostare i punti ideali sulla ipotetica circonferenza, sulla quale insistono i quattro vertici del Romboide da disegnare e contestualmente va modificata la riga del ciclo "FOR...NEXT": For t As Short = 0 To 360 Step 360 / ROMBOIDE
In questo caso, per creare il Romboide, basterà partire dalle coordinate del Rettangolo, avendo cura di aumentare la lunghezza di un vertice rispetto al fulcro centrale della figura: .Polygon([(coord[0] + pol[0]), (coord[1] + pol[1]), (coord[0] + pol[2]), (coord[1] + pol[3]), (coord[0] + pol[4]), (coord[1] + pol[5]), (coord[0] + pol[6]), (coord[1] + pol[7]) - (120 * CSingle(2 ^ (MapView1.Map.Zoom - ZOOM)))])
Parti da inserire per disegnare un Pentagono regolare
Le parti di codice che, per disegnare un Pentagono regolare, sostituiranno quelle punteggiate in rosso del codice generico, sopra mostrato, sono le seguenti:
Private Const PENTAGONO As Byte = 5
For t As Short = -18 To 342 Step 360 / PENTAGONO
.Polygon([(coord[0] + pol[0]), (coord[1] + pol[1]), (coord[0] + pol[2]), (coord[1] + pol[3]), (coord[0] + pol[4]), (coord[1] + pol[5]), (coord[0] + pol[6]), (coord[1] + pol[7]), (coord[0] + pol[8]), (coord[1] + pol[9])])
Parti da inserire per disegnare un Esagono regolare
Le parti di codice che, per disegnare un Esagono regolare, sostituiranno quelle punteggiate in rosso del codice generico, sopra mostrato, sono le seguenti:
Private Const ESAGONO As Byte = 6
For t As Short = 0 To 360 Step 360 / ESAGONO
.Polygon([(coord[0] + pol[0]), (coord[1] + pol[1]), (coord[0] + pol[2]), (coord[1] + pol[3]), (coord[0] + pol[4]), (coord[1] + pol[5]), (coord[0] + pol[6]), (coord[1] + pol[7]), (coord[0] + pol[8]), (coord[1] + pol[9]), (coord[0] + pol[10]), (coord[1] + pol[11])])
Parti da inserire per disegnare un Eptagono regolare
Le parti di codice che, per disegnare un Eptagono regolare, sostituiranno quelle punteggiate in rosso del codice generico, sopra mostrato, sono le seguenti:
Private Const EPTAGONO As Byte = 7
For t As Short = 0 To 360 Step 360 / EPTAGONO
.Polygon([(coord[0] + pol[0]), (coord[1] + pol[1]), (coord[0] + pol[2]), (coord[1] + pol[3]), (coord[0] + pol[4]), (coord[1] + pol[5]), (coord[0] + pol[6]), (coord[1] + pol[7]), (coord[0] + pol[8]), (coord[1] + pol[9]), (coord[0] + pol[10]), (coord[1] + pol[11]), (coord[0] + pol[12]), (coord[1] + pol[13])])
Parti da inserire per disegnare un Ottagono regolare
Le parti di codice che, per disegnare un Ottagono regolare, sostituiranno quelle punteggiate in rosso del codice generico, sopra mostrato, sono le seguenti:
Private Const OTTAGONO As Byte = 8
For t As Short = 0 To 360 Step 360 / OTTAGONO
.Polygon([(coord[0] + pol[0]), (coord[1] + pol[1]), (coord[0] + pol[2]), (coord[1] + pol[3]), (coord[0] + pol[4]), (coord[1] + pol[5]), (coord[0] + pol[6]), (coord[1] + pol[7]), (coord[0] + pol[8]), (coord[1] + pol[9]), (coord[0] + pol[10]), (coord[1] + pol[11]), (coord[0] + pol[12]), (coord[1] + pol[13]), (coord[0] + pol[14]), (coord[1] + pol[15])])
Note
[1] Vedere anche le pagine: