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

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

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



sabato 13 febbraio 2010

Sql server 2008: SQL Server Geospatial Services WMS

Volevo segnalarvi un interessante progetto in corso su codeplex per esporre i dati sql server in servizi wms, wfs, wps, geojson e tile.

In questo post ho provato ad utilizzare il servizio WMS esposto da SQL server 2008 con un client Silverlight servendomi  dell'esempio ESRI di Silverlight (esempio di subclassing della classe astratta DynamicMapServiceLayer).

Comunque, per queste due soluzioni, ho dovuto fare alcune piccole correzioni riguardo alla gestione del simbolo di separatore decimale in base alla cultura. Se avete le impostazioni internazionali sull'Inglese, potete tranquillamente utilizzare le versioni originali.

Da Visual Studio 2008 aprite il progetto OgcWebServices e poi includete l'altro progetto (GeoSpatialServices). Da Solution Explorer visualizzate i file nascosti (Show Hidden Files) e in App_Data fate doppio click sul file TestGeospatialServicesDatabase.mdf (in questo modo fate un attach del file in sql server 2008 express). A questo punto, sempre in App_Data, aprite il file WFSConfiguration.xml e modificate la vostra connessione al database.



Una volta compilata ed eseguita la soluzione, visualizzerete una pagina con dei link di test:
il secondo link visualizza l'intero layer con un SLD di default




il terzo link visualizza l'intero layer con un SLD specifico (SLD di nome region)



Ora lasciamo attivo il progetto, in modo che sia in grado di ricevere le chiamate, ed apriamo il progetto wms (cioè l'esempio di ESRI); poi compiliamo ed eseguiamo la soluzione


Se non specificate lo style nello XAML dovreste vedere il vostro layer sovrapposto allo StreetMap World 2D di ESRI.


se, in caso contrario, specificate l'SLD:

<esriWMS:WMSMapServiceLayer ID="AGSWMSLayer"
                     Url="http://localhost:49241/service.wms"                    
                     SkipGetCapabilities="False"
                     Layers="world_admin" Version="1.3.0" Opacity="0.7" Styles="region"/>

dovreste vedere:



Scarica qui la soluzione

Server Context Empty

Il server context è un puntatore ad un processo (ArcSOC.exe).



E' possibile creare un nuovo context od ottenere un context da un servizio GIS già esistente (ad esempio un servizio di mappa).

Il server context gestisce la comunicazione tra il server object e gli ArcObjects.

Bisogna prestare molta attenzione nella gestione del ciclo di vita del server context rilasciandolo opportunamente (metodo ReleaseContext).

Quando a livello di ADF non abbiamo la funzionalità GIS di fine grained possiamo, ad esempio, passare direttamente agli ArcObjects.

Tutti gli oggetti ArcObjects devono essere creati nel context del server con CreateObject passando il ProgID della classe di oggetto componente (coclass).
Non utilizzare mai il new quando si dichiarano tipi ArcObjects!!!

In questo esempio, dopo aver fatto la connessione ad ArcGIS Server con AGSServerConnection, accediamo alla SOM per creare un Server Context (spazio per utilizzare gli ArcObjects).
Nel caso specifico creiamo un server context vuoto, cioè non associato ad un servizio esistente ( yourSOM.CreateServerContext("","") ). A questo punto utilizziamo puro ArcObjects.

namespace Studioat.Samples
{
    [ErrorBehavior(typeof(WCErrorHandler))]
    public sealed class WCService : IWCService
    {
        public List<Streets> GetStreets(double x, double y, double distance)
        {
            IServerContext serverContext = null;
            List<Streets> streets = new List<Streets>();
            try
            {
                // Connection to ArcGIS Server
                Identity identity = new Identity();
                identity.UserName = ConfigurationManager.AppSettings.Get("userAGS");
                identity.Password = ConfigurationManager.AppSettings.Get("passwordAGS");


                using (AGSServerConnection agsServerConnection = new AGSServerConnection(ConfigurationManager.AppSettings.Get("hostnameAGS"), identity))
                {
                    try
                    {
                        agsServerConnection.Connect();
                    }
                    catch (ServerHostNullException)
                    {
                        throw new FaultException(WCRes.ServerHostNullException);
                    }
                    catch
                    {
                        throw;
                    }

                    // Reference SOM
                    IServerObjectManager serverObjectManager = agsServerConnection.ServerObjectManager;
                    serverContext = serverObjectManager.CreateServerContext("", "");




                    IWorkspaceFactory2 workspaceFactory = (IWorkspaceFactory2)serverContext.CreateObject("esriDataSourcesGDB.FileGDBWorkspaceFactory");
                    IFeatureWorkspace featureWorkspace = (IFeatureWorkspace)workspaceFactory.OpenFromFile(@"yourpathgdb\Atlanta.gdb", 0); //path with access user soc
                    IFeatureClass featureClass = featureWorkspace.OpenFeatureClass("streets");
                    ISpatialFilter spatialFilter =(ISpatialFilter) serverContext.CreateObject("esriGeoDatabase.SpatialFilter");
                    IPoint point = (IPoint)serverContext.CreateObject("esriGeometry.Point");
                    point.PutCoords(x, y);
                    ITopologicalOperator topologicalOperator = point as ITopologicalOperator;

                    spatialFilter.Geometry = topologicalOperator.Buffer(distance);
                    spatialFilter.GeometryField = featureClass.ShapeFieldName;
                    spatialFilter.SpatialRel = esriSpatialRelEnum.esriSpatialRelIntersects;

                    using (ComReleaser comReleaser = new ComReleaser())
                    {


                        IFeatureCursor featureCursor = featureClass.Search(spatialFilter,true);
                        comReleaser.ManageLifetime(featureCursor);
                        IFields fields = featureClass.Fields;
                        int idxName = fields.FindField("NAME");
                        int idxType = fields.FindField("TYPE");
                        IFeature feature = featureCursor.NextFeature();

                        while (feature != null)
                        {
                            streets.Add(new Streets() { Type = Convert.ToString(feature.get_Value(idxType)), Name = Convert.ToString(feature.get_Value(idxName)) });

                            feature = featureCursor.NextFeature();
                        }

                    }




                }
            }
            catch (Exception ex)
            {
                throw new FaultException(ex.Message);
            }
            finally
            {

                if (serverContext != null)
                {
                    serverContext.ReleaseContext();
                }
            }

            return streets;
        }

    }


    public class WCErrorHandler : IErrorHandler
    {
        // Provide a fault. The Message fault parameter can be replaced, or set to
        // null to suppress reporting a fault.


        #region IErrorHandler Membri di

        public void ProvideFault(Exception error, MessageVersion version, ref Message fault)
        {
        }

        // HandleError. Log an error, then allow the error to be handled as usual.
        // Return true if the error is considered as already handled

        public bool HandleError(Exception error)
        {
            using (TextWriter tw = File.AppendText(@"c:\Temp\errorVegetation.txt"))
            {
                if (error != null)
                {
                    tw.WriteLine("Exception: " + error.GetType().Name + " - " + error.Message);
                }
                tw.Close();
            }
            return true;
        }

        #endregion
    }


}

Potete trovare il FileGeodatabase Atlanta.gdb, utilizzato nell'esempio, in c:\Programmi\ArcGIS\DeveloperKit\SamplesNET\data\

Scarica qui la soluzione

Vi segnalo un articolo tecnico relativo all'utilizzo di server context empty
Problemi di time out con server context empty

sabato 6 febbraio 2010

GDBT

Il Geodatabase Toolset (GDBT) per ArcCatalog fornisce gli strumenti per aiutarti a monitorare, ricercare, e visualizzare un report delle prestazioni del geodatabase multiutente. Con il GDBT, puoi monitorare quotidianamente lo stato di salute del tuo geodatabase e ricercare il modo di ottimizzare le prestazioni.


Il GDBT lavora con geodatabase memorizzati in database quali SQL Server, Oracle, Informix, DB2, o PostgreSQL. Fornisce un'ampia varietà informazioni tra cui:

  • Il numero totale di righe nella delta tables Add e Delete 
  • Gli utenti connessi al geodatabase ed agli schemi bloccati
  • Un grafico dell'albero dello state lineage
  • Informazioni dettagliate dell'indice spaziale di una feature class
  • Gestione della versione: rapporti Parent-child tra versioni
  • Statistiche per tabelle e indici per geodatabase memorizzati in un database Oracle
  • GDBT per ArcMap, che fornisce strumenti per il monitoraggio, la ricerca, e la visualizzazione di un report per ArcMap, sarà disponibile entro il primo trimestre del 2010.
Requisiti

Domande frequenti

Visualizza presentazione

Download