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

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 jquery. Mostra tutti i post
Visualizzazione post con etichetta jquery. Mostra tutti i post

sabato 19 settembre 2009

Autocomplete (jQuery)

In order to create a simple autocomplete in a task text box, you can use, for instance, the powerful jQuery library Javascript which, thanks to its plugs-in, allows you to easily insert many functionalities without changing the task.

In the following example the photogallery task for MapViewer is used to insert the autocomplete in the text box allowing you to look for data linked with a list of photos.

In the markup of page Default.aspx after tag Title insert the following code


<title></title>

 

<script type="text/javascript" src="Javascript/jQuery/jquery.js"></script>

<script type="text/javascript" src="Javascript/jQuery/jquery.bgiframe.min.js"></script>

<script type="text/javascript" src="Javascript/jQuery/jquery.autocomplete.js"></script>

<link rel="stylesheet" href="css/jQuery/jquery.autocomplete.css" type="text/css" />

 

<script type="text/javascript">

  $(document).ready(

  function() {

  var ac_taskNameArcSewer = "#" + "NameYourTaskManager"; //name taskManager contains PhotoGalleryTask

  var ac_handlerAutoComplete = "AutoComplete.ashx";

  var ac_photoGalleryTaskName = "PhotoGalleryTask1";

 

  var ac_PhotoGalleryTaskName = ac_taskNameArcSewer + "_" + ac_photoGalleryTaskName + "_";

  var ac_txtFindPG = ac_PhotoGalleryTaskName + "txtName"; //name your textbox in task PhotoGallery

  var ac_btnFindPG = ac_PhotoGalleryTaskName + "btnFind"; //name your button in task PhotoGallery

  $(ac_txtFindPG).autocomplete(ac_handlerAutoComplete + '?' + 'type=Id');

  $(ac_btnFindPG).attr("disabled", true);

  $(ac_txtFindPG).change(function(event) {

  $(ac_btnFindPG).attr("disabled", $(this).val() == '')

  });

  }

  );

</script>


On the server side, add to the project an ashx file and insert the code to populate our list for autocomplete.

<%@ WebHandler Language="C#" Class="AutoComplete" %>

 

using System;

using System.Web;

using System.Web.Services;

using System.Collections.Generic;

 

[WebService(Namespace = "http://localhost/yourNameSpace")]

[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]

public class AutoComplete : IHttpHandler

{

    static readonly log4net.ILog _log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);

    static readonly string taskFullName = System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.FullName;

    static readonly string taskNamespace = System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Namespace;

 

    public void ProcessRequest (HttpContext context)

    {

 

        //// Note the query strings passed by jquery autocomplete:

        ////QueryString: {q=a&limit=150&timestamp=1227198175320}

 

        string nameField = context.Request.QueryString["type"];

        string queryString = context.Request.QueryString["q"];

 

 

        //create query with queryString and Name Field  //  query: nameField LIKE 'queryString + *'

 

        List<string> listString = GetIds(queryString,nameField); 

        if (listString != null)

        {

            foreach (string i in listString)

            {

                context.Response.Write(i + Environment.NewLine);

            }

        }

 

    }

 

    public bool IsReusable

    {

        get

        {

            return false;

        }

    }

}


For details about autocomplete jQuery you can see here

lunedì 15 giugno 2009

SQL Server 2008 - Virtual Earth

Nella versione 2008 di SQL Server sono stati introdotti due nuovi tipi di dati: Geometry e Geography.
Per capire la differenza tra i due tipi di dati potete trovare la documentazione su MSDN.

Vediamo ora come caricare uno shapefile da ArcGIS Desktop (mediante l'extension Data Interoperability) in SQL Server 2008.

Per questo esempio potete anche utilizzare la versione SQL Server 2008 Express SP1 e il tool di Morten Nielsen.

Come si può vedere dalla figura qui sotto, dagli Arctoolbox si seleziona 'Quick Export' e dalla lista dei formati si seleziona Microsoft SQL Server Spatial. Lo shapefile è stato preventivamente proiettato in wgs84.








Una volta caricati, è possibile visualizzarli in Virtual Earth. In questo momento non abbiamo un metodo diretto per poterli visualizzare poichè gli output da SQL Server 2008 sono il WKT e il GML e il formato nativo che nei client .NET si traduce nei tipi .NET SqlGeometry e SqlGeography; mentre Virtual Earth necessita di GeoRSS, KML, xml personalizzato da processare con javascript personalizzato o stringhe Javascript da passare ad eval().


In questo esempio creiamo una stored procedure (GetLimiteComunale) che chiamiamo tramite un servizio WCF utilizzando Linq to SQL. La stored procedure restituisce la versione GML (nell'esempio eliminiamo la parte di tag di apertura e chiusura) della feature richiamata. Nel servizio utilizziamo poi l'utility GeoRssUtils per pubblicare i dati su Virtual Earth.







In Visual Studio 2008 trasciniamo le stored procedure sul design della classe Linq to SQL



e questo è il metodo nel servizio WCF

public SyndicationFeedFormatter GetLimiteComunale(string id)
    {
        var geoData = new GeoRssData("GetLimiteComunale", "Seleziona comune");
        using (var db = new SpatialDataDataContext())
        {
            var result = db.GetLimiteComunale(int.Parse(id)).First();
            geoData.AddPolygon(result.Name, string.Format("Comunità Montana:{0}", result.Comunità_Montana), result.Polygon);
        }
 
        return new Rss20FeedFormatter(GeoRssFeedBuilder.GetFeed(geoData));
    }


sulla parte client richiamiamo il servizio WCF:

$(document).ready(function() {
 
    map = new VEMap("myMap");
    map.LoadMap();
    map.SetCenterAndZoom(new VELatLong(45.132, 7.438), 10);
 
    $("#btnIdGetLimiteComunale").click(function() {
        var request = "SpatialData.svc/GetLimiteComunale/" + $("#txtIdComune").val();
 
        var layer = new VEShapeLayer();
        var layerSpec = new VEShapeSourceSpecification(
                                    VEDataType.GeoRSS,
                                    request,
                                    layer);
 
        map.ImportShapeLayerData(layerSpec);
    });



Stessa cosa facciamo con la stored procedure GetLimitiComunaliLimitrofi. In questo caso viene mostrato come utilizzare le funzioni spaziali messe a disposizione da SQL Server (vedi http://msdn.microsoft.com/en-us/library/bb895266.aspx ). Nello specifico selezioniamo i comuni confinanti con il comune cercato.




Con la terza stored procedure (GetLimiteComunaleJSON) restituiamo il dato al servizio WCF in formato WKT e sul client inviamo i dati in formato GeoJSON che verranno poi processati mediante l'helper javascript per VE.


Sul client:
$("#btnIdAddPointGeoJSON").click(function() {
        var v = new VEGeoJSON(map);
        $.ajax({ type: "POST",
            url: "SpatialData2.svc/GetLimiteComunaleJSON",
            contentType: "application/json; charset=utf-8",
            dataType: "json",
            data: '{"id":"' + $("#txtIdComune").val() + '"}',
            success: function(data) {
 
                var geoJSON = eval('(' + data.d + ')');
                v.addGeoJSON(geoJSON);
            }
        });



Per la parte javascript ho utilizzato la libreria javascript jquery.

Scarica qui il codice della soluzione.