-----------------------------------

Acquista i software ArcGIS tramite Studio A&T srl, rivenditore autorizzato dei prodotti Esri.

I migliori software GIS, il miglior supporto tecnico!

I migliori software GIS, il miglior supporto tecnico!
Azienda operante nel settore GIS dal 2001, specializzata nell’utilizzo della tecnologia ArcGIS e aderente ai programmi Esri Italia Business Network ed Esri Partner Network

-----------------------------------



Visualizzazione post con etichetta arcgisonline. Mostra tutti i post
Visualizzazione post con etichetta arcgisonline. Mostra tutti i post

lunedì 25 maggio 2009

Parse Json ArcGISOnline per Silverlight

In .NET Silverlight 2.0 abbiamo la classe WebClient che fornisce la più semplice classe per la comunicazione a servizi.
Per utilizzarla, si deve fornire il contenuto dell'Uri al quale si vuole accedere e poi chiamare il metodo DownloadStringAsync o il metodo OpenReadAsync per scaricare i dati.
Nel caso che vediamo, stiamo usando OpenReadAsync. Utilizzando questi metodi dobbiamo impostare una funzione di callback per prendere i dati restituiti. Quando il trasferimento dei dati è terminato, viene chiamata la nostra funzione client_OpenReadCompleted che riceve un oggetto (argomento: OpenReadCompletedEventArgs) che contiene una proprietà di nome Result che contiene l'oggetto restituito.
In questo esempio, facciamo una chiamata al locator EU degli ArcGIS Online con una risposta di tipo JSON.
Esempio di risposta:
{
"address" :
{
"Address" : "VIA LUCIANO MANARA 48",
"City" : "MONZA",
"Postcode" : "20052",
"Country" : "",
"Loc_name" : "ITASMRVATGeoco"
},
"location" :
{
"x" : 9.25588354543629,
"y" : 45.5901805291887,
"spatialReference" : {
"wkid" : 4326
}
}
}


Nello XAML utilizzeremo una nostra classe (JSONFormatter) che implementa IvalueConverter per il binding.

 
public partial class Page : UserControl
{
JsonObject results;
WebClient client;
public Page()
{
InitializeComponent();
// Send HTTP request to the JSON search API
client = new WebClient();
client.OpenReadCompleted += new OpenReadCompletedEventHandler(client_OpenReadCompleted);
}
private void MyMap_MouseClick(object sender, ESRI.ArcGIS.Map.MouseEventArgs e)
{
ESRI.ArcGIS.Geometry.MapPoint pt = e.MapPoint;
string xy = string.Format("{0},{1}", pt.X.ToString(NumberFormatInfo.InvariantInfo), pt.Y.ToString(NumberFormatInfo.InvariantInfo));
client.OpenReadAsync(new Uri("http://sampleserver1.arcgisonline.com/ArcGIS/rest/services/Locators/ESRI_Geocode_EU/GeocodeServer/reverseGeocode?location=" + xy + "&distance=0&f=pjson"));
Canvas.SetLeft(ResultsPane,e.ScreenPoint.X + 10);
Canvas.SetTop(ResultsPane,e.ScreenPoint.Y + 10);
GraphicsLayer graphicsLayer = MyMap.Layers["MyGraphicsLayer"] as GraphicsLayer;
Graphic graphic = new Graphic();
graphic.Symbol = DefaultMarkerSymbol;
graphic.Geometry = pt;
graphicsLayer.Graphics.Add(graphic);
}
void client_OpenReadCompleted(object sender, OpenReadCompletedEventArgs e)
{
if (e.Error == null)
{
// Parse results into a JsonObject
results = (JsonObject)JsonObject.Load(e.Result);
// Update LINQ query
UpdateQuery();
ResultsPane.Visibility = Visibility.Visible;
}
}
void UpdateQuery()
{
if (results != null)
{
// Generate LINQ query based on JsonObject and user settings
var members = from address in results
where address.Key == "address"
select address;
// Databind the results to a UI control
resultList.DataContext = members;
}
}
private void btnClose_Click(object sender, RoutedEventArgs e)
{
ResultsPane.Visibility = Visibility.Collapsed;
GraphicsLayer graphicsLayer = MyMap.Layers["MyGraphicsLayer"] as GraphicsLayer;
graphicsLayer.ClearGraphics();
}
}
public class JsonFormatter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
string valueString = ((System.Collections.Generic.KeyValuePair<string,JsonValue>)value).Value[(string)parameter];
// JsonObject doesn't strip quotes from strings, so do that and return the result
return valueString.Replace("\"", "");
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotImplementedException();
}
}


XAML:


<UserControl x:Class="slWSJson.Page"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:esri="clr-namespace:ESRI.ArcGIS;assembly=ESRI.ArcGIS"
    xmlns:esriConverters="clr-namespace:ESRI.ArcGIS.ValueConverters;assembly=ESRI.ArcGIS"
    xmlns:esriSymbols="clr-namespace:ESRI.ArcGIS.Symbols;assembly=ESRI.ArcGIS"
    xmlns:local="clr-namespace:slWSJson">
  <UserControl.Resources>
    <local:JsonFormatter x:Key="jsonFormatter"/>
  </UserControl.Resources>
  <Grid x:Name="LayoutRoot" Background="White">
    <Grid.Resources>
      <esriSymbols:SimpleMarkerSymbol x:Name="DefaultMarkerSymbol"  Color="Red" Size="12" Style="Circle" />
    </Grid.Resources>
    <esri:Map x:Name="MyMap" Background="White" Extent="-7.732,35.69,27.021,56.346" MouseClick="MyMap_MouseClick">
      <esri:Map.Layers>
        <esri:ArcGISTiledMapServiceLayer ID="BaseMapLayer" Url="http://server.arcgisonline.com/ArcGIS/rest/services/ESRI_StreetMap_World_2D/MapServer" />
        <esri:GraphicsLayer ID="MyGraphicsLayer">
        </esri:GraphicsLayer>
      </esri:Map.Layers>
    </esri:Map>
    <Canvas>
      <StackPanel x:Name="ResultsPane" Visibility="Collapsed" Width="300" Height="150">
        <Button x:Name="btnClose"  Click="btnClose_Click" Content="Close">
        </Button>
        <ListBox x:Name="resultList"  ItemsSource="{Binding}" Height="150">
          <ListBox.ItemTemplate>
            <DataTemplate>
              <StackPanel>
                <TextBlock FontSize="18" TextWrapping="Wrap">
                  <TextBlock.Text>
                    <Binding Converter="{StaticResource jsonFormatter}" ConverterParameter="Address"></Binding>
                  </TextBlock.Text>
                </TextBlock>
                <TextBlock FontSize="14">
                  <TextBlock.Text>
                    <Binding Converter="{StaticResource jsonFormatter}" ConverterParameter="City"></Binding>
                  </TextBlock.Text>
                </TextBlock>
                <TextBlock FontSize="14">
                  <TextBlock.Text>
                    <Binding Converter="{StaticResource jsonFormatter}" ConverterParameter="Postcode"></Binding>
                  </TextBlock.Text>
                </TextBlock>
                <TextBlock FontSize="14">
                  <TextBlock.Text>
                    <Binding Converter="{StaticResource jsonFormatter}" ConverterParameter="Country"></Binding>
                  </TextBlock.Text>
                </TextBlock>
                <TextBlock FontSize="14">
                  <TextBlock.Text>
                    <Binding Converter="{StaticResource jsonFormatter}" ConverterParameter="Loc_name"></Binding>
                  </TextBlock.Text>
                </TextBlock>
              </StackPanel>
            </DataTemplate>
          </ListBox.ItemTemplate>
        </ListBox>
      </StackPanel>
    </Canvas>
  </Grid>
</UserControl>







Scarica qui la soluzione

domenica 10 maggio 2009

Acceleratori con IE8

Con l'avvento di Internet Explorer 8, Microsoft ha introdotto, tra le novità, gli Accelerator.

Accelerator è un menu contestuale che consente di accedere velocemente a certi servizi minimizzando le operazioni di copia e incolla da un sito all'altro. Ad esempio, si può tradurre o cercare al volo una parola evidenziata, oppure selezionare un indirizzo e visualizzarlo direttamente in una mappa di LiveMaps. Gli acceleratori sono dei servizi che gli utenti possono installare e gestire, e che gli sviluppatori possono realizzare utilizzando l'OpenService Format Specification.

Potete scaricare un
template XML già fatto da MSDN che contiene tutte le sezioni commentate con il significato di ognuna. La documentazione completa è disponibile a questo link: OpenService Accelerators Developer Guide.


Creiamo un semplice esempio.

Utilizziamo gli ArcGISOnline per fare un reverse geocode:
<?xml version="1.0" encoding="utf-8" ?>
<openServiceDescription xmlns="http://www.microsoft.com/schemas/openservicedescription/1.0">
<homepageUrl>http://sampleserver1.arcgisonline.com</homepageUrl>
<display>
<name>Reverse Geocode EU</name>
</display>
<activity category="Map">
<activityAction context="selection">
<execute method="get" action="http://sampleserver1.arcgisonline.com/ArcGIS/rest/services/Locators/ESRI_Geocode_EU/GeocodeServer/reverseGeocode">
<parameter name="location" value="{selection}" />
<parameter name="distance" value="0" />
<parameter name="f" value="html" />
</execute>
<preview method="get" action="http://sampleserver1.arcgisonline.com/ArcGIS/rest/services/Locators/ESRI_Geocode_EU/GeocodeServer/reverseGeocode">
<parameter name="location" value="{selection}" />
<parameter name="distance" value="0" />
<parameter name="f" value="json" />
</preview>
</activityAction>
</activity>
</openServiceDescription>
 
 
 
 


Salviamo questo file XML sul nostro web server e lo facciamo installare con, ad esempio, una pagine HTML di questo tipo:


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
  <head>
    <title></title>
  </head>
  <body>
    <button id="myButton" onclick="window.external.AddService('http://localhost/ArcGISOnlineGeocode.xml')">Installa</button>
Questo è un test: 9.25588354542742,45.590180529189
  </body>
</html>



L'utente, selezionando una coppia di coordinate WGS84 (lon,lat) in una pagina sul browser, visualizzerà l'indirizzo corrispondente. Nella sezione preview dell'XML, è stato indicato, a solo scopo esemplicativo, il formato json. La preview viene visualizzata quando si passa sopra alla voce dell'acceleratore.


Link utili: accelerator gallery add-ons IE8