Introduzione
Vediamo come rilevare le coordinate (assolute e normali) nella mappa quando si sposta il mouse nella cartina.
Queste informazioni possono tornare utile in quei contesti in cui servono informazioni particolare della mappa.
Creazione del progetto
Si crea un nuovo progetto Silverlight, nel nostro caso sarà utilizzato la versione 5, come linguaggio di programmazione, scegliere quello di proprio interesse.
Aggiungiamo nella pagina il controllo “Mappa” a questo punto inseriamo un controllo “Stackpanel” con un controllo “TextBlock”, qui di seguito si riporta il file XAML completo.
<Grid x:Name="LayoutRoot" Background="White">
<esri:Map Background="Transparent" HorizontalAlignment="Left" Name="Map1" VerticalAlignment="Top" WrapAround="True" ExtentChanged="Map1_ExtentChanged" ExtentChanging="Map1_ExtentChanged" Height="300" Width="414">
<esri:Map.Layers>
<esri:LayerCollection>
<esri:ArcGISTiledMapServiceLayer
Url="http://services.arcgisonline.com/ArcGIS/rest/services/World_Street_Map/MapServer"
/>
</esri:LayerCollection>
</esri:Map.Layers>
</esri:Map>
<StackPanel Orientation="Vertical" Margin="7,6,0,44" HorizontalAlignment="Left" Width="239">
<StackPanel.Resources>
<Style
TargetType="TextBlock">
<Setter
Property="FontWeight" Value="Bold"/>
<Setter
Property="FontSize" Value="11" />
</Style>
</StackPanel.Resources>
<TextBlock>
<Run
FontStyle="Italic">Assoluto</Run>
<LineBreak
/>
<Run>MinX: </Run>
<Run
Text="{Binding ElementName=Map1, Path=Extent.XMin,
StringFormat=\{0:F3\}}" />
<LineBreak
/>
<Run>MinY: </Run>
<Run
Text="{Binding ElementName=Map1, Path=Extent.YMin,
StringFormat=\{0:F3\}}" />
<LineBreak />
<Run>MaxX: </Run>
<Run
Text="{Binding ElementName=Map1, Path=Extent.XMax,
StringFormat=\{0:F3\}}" />
<LineBreak />
<Run>MaxY: </Run>
<Run
Text="{Binding ElementName=Map1, Path=Extent.YMax,
StringFormat=\{0:F3\}}" />
<LineBreak
/>
<LineBreak
/>
<Run
FontStyle="Italic">Normale</Run>
<LineBreak
/>
<Run>Left X: </Run>
<Run
x:Name="MinXNormalized" />
<LineBreak
/>
<Run>Bottom Y: </Run>
<Run
x:Name="MinYNormalized"/>
<LineBreak
/>
<Run>Right X: </Run>
<Run
x:Name="MaxXNormalized"/>
<LineBreak
/>
<Run>Top Y: </Run>
<Run
x:Name="MaxYNormalized"/>
</TextBlock>
</StackPanel>
</Grid>
Figura 1 – Finestra che visualizza le coordinate
A questo punto dobbiamo gestire gli eventi, in particolare l’evento “ExtentChanged” e “ExtentChanging” del controllo mappa.
Selezioniamo nel file XAML il primo evento, ossai “ExtentChanged” e facciamo click sul tasto “Tabulatore” in modo che viene suggerito di inserire un nuovo gestore di eventi (figura 2).
Figura 2 – il suggerimento dell’evento
A questo punto facciamo doppio click sulla voce “Nuovo gestore eventi”, in modo che genera automaticamente tale evento.
Ora la stessa cosa per l’evento “ExtentChanging” ma questa volta impostiamo l’evento appena creato (figura 3) .
Figura 3 – Il suggerimento per l’evento.
Il codice XAML sarà come quello riportato in precedenza
Stesura del codice
Terminata la parte designer, non ci resta che scrivere il codice per impostare nei controlli “Textblock” i valori relative alle coordinate.
Qui di seguito si riporta il codice per il linguaggio VB.Net e C#.
Spazio di nomi
Lo spazio dei nomi ESRI.ArcGIS.Client.Geometry ci permette di gestire le forme geometriche in ambito di GIS diverse da quelle fornite dal framework di Silverlight.
Il codice appena riporta, permette di rilevare i dati di determinate aree il tutto tramite un oggetto di tipo mapoint.
Con questi dati possiamo avere informazioni delle mappa, e precisamente la posizione del mouse e l’area in cui stiamo valutando.
Conclusioni
L’articolo ha voluto fornire una breve introduzione al mondo delle informazioni delle mappe riguardante coordinate e la gestione di alcuni eventi.
A questo punto dobbiamo gestire gli eventi, in particolare l’evento “ExtentChanged” e “ExtentChanging” del controllo mappa.
Selezioniamo nel file XAML il primo evento, ossai “ExtentChanged” e facciamo click sul tasto “Tabulatore” in modo che viene suggerito di inserire un nuovo gestore di eventi (figura 2).
Figura 2 – il suggerimento dell’evento
A questo punto facciamo doppio click sulla voce “Nuovo gestore eventi”, in modo che genera automaticamente tale evento.
Ora la stessa cosa per l’evento “ExtentChanging” ma questa volta impostiamo l’evento appena creato (figura 3) .
Figura 3 – Il suggerimento per l’evento.
Il codice XAML sarà come quello riportato in precedenza
Stesura del codice
Terminata la parte designer, non ci resta che scrivere il codice per impostare nei controlli “Textblock” i valori relative alle coordinate.
Qui di seguito si riporta il codice per il linguaggio VB.Net e C#.
Spazio di nomi
Spazio di
nomi
VB.Net
Imports
Microsoft.VisualBasic
Imports
System.Windows.Controls
Imports
ESRI.ArcGIS.Client.Geometry
C#
using
System.Windows.Controls;
using
ESRI.ArcGIS.Client.Geometry;
Codice per
gli eventi
VB.Net
Private
Sub Map1_ExtentChanged(sender As System.Object,
e As ESRI.ArcGIS.Client.ExtentEventArgs)
Dim
newExtent As Envelope
= Nothing
If
Map1.WrapAroundIsActive Then
Dim
normalizedExtent As Geometry
= Geometry.NormalizeCentralMeridian(e.NewExtent)
If TypeOf normalizedExtent Is
Polygon Then
newExtent = New Envelope()
For
Each p As MapPoint In (TryCast(normalizedExtent, Polygon)).Rings(0)
If
p.X < newExtent.XMin OrElse Double.IsNaN(newExtent.XMin) Then
newExtent.XMin = p.X
End
If
If
p.Y < newExtent.YMin OrElse Double.IsNaN(newExtent.YMin) Then
newExtent.YMin = p.Y
End
If
Next
p
For
Each p As MapPoint In (TryCast(normalizedExtent, Polygon)).Rings(1)
If
p.X > newExtent.XMax OrElse Double.IsNaN(newExtent.XMax) Then
newExtent.XMax = p.X
End
If
If
p.Y > newExtent.YMax OrElse Double.IsNaN(newExtent.YMax) Then
newExtent.YMax = p.Y
End
If
Next
p
ElseIf
TypeOf normalizedExtent Is Envelope Then
newExtent = TryCast(normalizedExtent, Envelope)
End
If
Else
newExtent = e.NewExtent
End If
MinXNormalized.Text =
newExtent.XMin.ToString("0.000")
MinYNormalized.Text = newExtent.YMin.ToString("0.000")
MaxXNormalized.Text =
newExtent.XMax.ToString("0.000")
MaxYNormalized.Text =
newExtent.YMax.ToString("0.000")
End Sub
C#
private
void Map1_ExtentChanged(object sender, ESRI.ArcGIS.Client.ExtentEventArgs
e)
{
Envelope
newExtent = null;
if
(Map1.WrapAroundIsActive)
{
Geometry
normalizedExtent = Geometry.NormalizeCentralMeridian(e.NewExtent);
if
(normalizedExtent is Polygon)
{
newExtent = new Envelope();
foreach
(MapPoint p in
(normalizedExtent as Polygon).Rings[0])
{
if (p.X < newExtent.XMin || double.IsNaN(newExtent.XMin))
newExtent.XMin =
p.X;
if (p.Y < newExtent.YMin || double.IsNaN(newExtent.YMin))
newExtent.YMin =
p.Y;
}
foreach
(MapPoint p in
(normalizedExtent as Polygon).Rings[1])
{
if (p.X > newExtent.XMax || double.IsNaN(newExtent.XMax))
newExtent.XMax =
p.X;
if (p.Y > newExtent.YMax || double.IsNaN(newExtent.YMax))
newExtent.YMax =
p.Y;
}
}
else
if (normalizedExtent is
Envelope)
newExtent =
normalizedExtent as Envelope;
}
else
newExtent = e.NewExtent;
MinXNormalized.Text =
newExtent.XMin.ToString("0.000");
MinYNormalized.Text =
newExtent.YMin.ToString("0.000");
MaxXNormalized.Text =
newExtent.XMax.ToString("0.000");
MaxYNormalized.Text =
newExtent.YMax.ToString("0.000");
}
Lo spazio dei nomi ESRI.ArcGIS.Client.Geometry ci permette di gestire le forme geometriche in ambito di GIS diverse da quelle fornite dal framework di Silverlight.
Il codice appena riporta, permette di rilevare i dati di determinate aree il tutto tramite un oggetto di tipo mapoint.
Con questi dati possiamo avere informazioni delle mappa, e precisamente la posizione del mouse e l’area in cui stiamo valutando.
Conclusioni
L’articolo ha voluto fornire una breve introduzione al mondo delle informazioni delle mappe riguardante coordinate e la gestione di alcuni eventi.
Nessun commento:
Posta un commento