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

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

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



domenica 28 dicembre 2008

What's Coming in ArcGIS 9.3.1

- High-Performance Dynamic Map Publishing

- Better Sharing of Geographic Information

- Enhanced Support for Java Developers

- Easy to Migrate

ArcGIS 9.3.1 is scheduled to be available in Q2 2009.

For details

ArcPad 8

COSA C'E' DI NUOVO IN ARCPAD 8

ArcPad 8 comprenderà nuove funzionalità, miglioramenti nelle performace e nella qualità. ArcPad Application Builder, il framework di sviluppo per customizzare ArcPad, sarà compreso in ogni licenza di ArcPad 8. Nella versione 8, ArcPad diventerà un prodotto basato sulla manutenzione ed i clienti potranno sottoscrivere una manutenzione annuale per avere gli aggiornamenti di ArcPad ed il supporto tecnico.


Le novità di ArcPad 8 comprenderanno:

SINCRONIZZARE LE MODIFICHE CON ARCGIS SERVER

La nuova estensione ArcGIS Server ArcPad permetterà agli utenti di pubblicare un progetto ArcPad in ArcGIS Server. Qualsiasi dispositivo che possa collegarsi ad Internet (cradle, USB, WIFI o connessione telefonica) può sincronizzare le modifiche di ArcPad direttamente con un geodatabase enterprise tramite ArcGIS Server.

NUOVA INTERFACCIA UTENTE

ArcPad 8 avrà un nuovo aspetto grazie ad icone moderne e barre degli strumenti che occuperanno meno spazio rispetto alle versioni precedenti.
L'utente potrà agganciare, minimizzare e massimizzare le barre degli strumenti e un nuovo strumento del desktop chiamato ArcPad Toolbar Manager potrà essere utilizzato o per modificare le toolbar predefinite o per crearne una propria.

MIGLIORAMENTO DELL'INTERFACCIA UTENTE GPS

La maschera di posizione GPS verrà sostituita da una nuova barra di stato GPS, cioè una barra degli strumenti luminosa che compare in fondo alla mappa. Essa mostra la maggior parte dei dettagli della precedente maschera, ma adesso usa colori atti ad indicare la qualità del segnale GPS.

MIGLIORAMENTO DELL'ESTENSIONE ARCPAD DATA MANAGER

L'estensione ArcPad Data Manager darà agli utenti più opzioni quando preparano i dati per ArcPad. Gli utenti saranno abilitati a configurare un progetto ArcPad per usi ripetuti con strumenti di geoprocessing, o a comporre un progetto ArcPad per pubblicarlo in ArcGIS Server e successivamente utilizzarlo in ArcPad.

MIGLIORAMENTI IN STREETMAP

ArcPad 8 StreetMap fornirà un metodo più facile per trovare indirizzi e località usando un nuovo indice di lookup. ArcPad 8 sarà venduto insieme ai dati di Tele Atlas Premium Western Europe Street Map senza costi aggiuntivi.


Presumibilmente ArcPad 8 uscirà nel primo quadrimestre del 2009.

ArcPad 8

mercoledì 24 dicembre 2008

ComReleaser - gestione del ciclo di vita dei cursori

I cursori del geodatabase dovrebbero sempre venire esplicitamente distrutti in un ambiente che utilizza la garbage collection. La regola è sempre rilasciare un oggetto COM non appena l'applicazione ha finito di utilizzare il suo riferimento. Questo è particolarmente importante con i cursori del geodatabase poichè fallire il rilascio dei cursori può mettere in uno stato di lock il sistema e le risorse dbms; un sintomo comune è il blocco di una tabella per un tempo indeterminato dopo
aver finito di ciclare sulle righe con un search cursor.
Questo articolo è una lettura fondamentale per gli sviluppatori che usano il geodatabase API: dimostra l'importanza di rilasciare gli oggetti COM (e specialmente i cursori) e di utilizzare un approccio diverso.
Molti sviluppatori .NET che hanno lavorato con il COM interop conosceranno già il metodo statico Marshal.ReleaseComObject, ma c'è anche una sezione dedicata ad una classe nell'ADF chiamata ComReleaser che è veramente utile quando si lavora con i cursori.

Ecco un esempio dell'uso del ComReleaser per assicurarsi che il cursore sia propriamente rilasciato:


using (ComReleaser comReleaser = new ComReleaser())

        {

 

            // Istanzia un cursore e gestisci il ciclo di vita con il ComReleaser.

 

            IFeatureCursor featureCursor = featureClass.Search(null, true);

 

            comReleaser.ManageLifetime(featureCursor);

 

 

 

            // Cicla attraverso le features.

 

            IFeature feature = null;

 

            while ((feature = featureCursor.NextFeature()) != null)

            {

 

                // Fai qualcosa

 

            }

 

        }



Indipendentemente da come il codice lascia questo blocco using (se un valore è restituito, se viene gettata un'eccezione o esce) il
cursore comunque avrà il proprio reference count correttamente decrementato.

Vedi articolo

lunedì 15 dicembre 2008

EMAB (Logger)

I have used EMAB for simplification ( EMAB download )
for this project.

Nevertheless now it has been overcome by Enterprise Library 4.1 ( Enterprise Library 4.1 download )

For details see Best practises Microsoft


App.Config:


<?xml version="1.0"?>

<configuration>

 

 

 

 

  <configSections>

    <section name="exceptionManagement" type="Microsoft.ApplicationBlocks.ExceptionManagement.ExceptionManagerSectionHandler,Microsoft.ApplicationBlocks.ExceptionManagement" />

  </configSections>

 

 

  <exceptionManagement mode="on">

    <publisher assembly="MapControlEMAB" type="Studioat.ArcEngine.AppBase.Classes.EM" fileName="LogError.txt" sendEMail="off" operatorMail="xxxx@gmail.it" operatorFrom="xxxx@yahoo.it" subject="Logger MapControlEMAB"  host="smtp.mail.yahoo.it" user="" password=""/>

  </exceptionManagement>

 

</configuration>




mode="on|off" enable/disable log
assembly="MapControlEMAB" assembly which holds the custom class to manage log
type="Studioat.ArcEngine.AppBase.Classes.EM" custom class to manage log
fileName="LogError.txt" name of the log file created in bin

sendEMail="on|off" enable/disable log on email
operatorMail="xxxx@gmail.it" mail to
operatorFrom="xxxx@yahoo.it" mail from
subject="Logger MapControlEMAB" subject
host="smtp.mail.yahoo.it" smtp
user="" authentication user mail
password="" authentication password mail


From menu select 'Demo Log':

In this sample the error is in the log:

try

            {

                int a = 1, b = 0, c;

 

                c = a / b;

 

            }

            catch (Exception ex)

            {

 

                ExceptionManager.Publish(ex);

 

            }

            finally

            {

 

                MessageBox.Show("See new entry in LogError.txt", "Logger");

 

            }




In this sample the error is in the log plus your extra information:

try

            {

                int a = 1, b = 0, c;

 

                c = a / b;

 

            }

            catch (Exception ex)

            {

 

                NameValueCollection nvc = new NameValueCollection();

                nvc.Add("Info", "My comments bla bla bla:\n\n");

                ExceptionManager.Publish(ex, nvc);

 

 

            }

            finally

            {

 

                MessageBox.Show("See new entry in LogError.txt", "Logger");

 

            }




In this sample the error without handling Exception (remember that to see this error you can't be in debug but you must run directly exe.)


int a = 1, b = 0, c;

 

            c = a / b;





In form main we set UnhandledException for unhandling errors

/// <summary>

    /// The main entry point for the application.

    /// </summary>

    [SecurityPermission(SecurityAction.Demand, Flags = SecurityPermissionFlag.ControlAppDomain)]

    [STAThread]

    static void Main()

    {

 

 

        #region manager error

        Application.ThreadException += new ThreadExceptionEventHandler(frmMain.UIThreadException);

        Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);

 

 

        AppDomain.CurrentDomain.UnhandledException +=

            new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);

        #endregion manager error

 

 

        Application.Run(new frmMain());

    }

    #region manager error

    private static void UIThreadException(object sender, ThreadExceptionEventArgs t)

    {

        DialogResult result = DialogResult.Cancel;

        try

        {

            result = ShowThreadExceptionDialog("Error", t.Exception);

        }

        catch (Exception ex)

        {

            try

            {

                MessageBox.Show("Error", "Error", MessageBoxButtons.AbortRetryIgnore, MessageBoxIcon.Stop);

                ExceptionManager.Publish(ex);

            }

            finally

            {

                Application.Exit();

            }

        }

 

 

        if (result == DialogResult.Abort)

            Application.Exit();

    }

    private static DialogResult ShowThreadExceptionDialog(string title, Exception e)

    {

        string errorMsg = "Contact admin with following info:\n\n";

        errorMsg += e.Message + "\n\nStack Trace:\n" + e.StackTrace;

        return MessageBox.Show(errorMsg, title, MessageBoxButtons.AbortRetryIgnore, MessageBoxIcon.Stop);

    }

    private static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)

    {

        try

        {

            Exception ex = (Exception)e.ExceptionObject;

 

 

            NameValueCollection nvc = new NameValueCollection();

            nvc.Add("Info", "Contact admin with these info errors:\n\n");

            ExceptionManager.Publish(ex, nvc);

 

 

        }

        catch (Exception exc)

        {

            try

            {

 

                ExceptionManager.Publish(exc);

            }

            finally

            {

                Application.Exit();

            }

        }

    }

    #endregion manager error





class EM inherits from IExceptionPublisher and is the custom class used for the logger.



Here you can download the soluzion VS2008 Logger Error

venerdì 5 dicembre 2008

Linq to XML

Con linq è semplice interrogare un element: in questo esempio ho copiato una parte di file GML.

XElement gml = XElement.Parse(

        @"<features><feature fid=""142"" featuretype=""school"" description=""A middle school"">

        <polygon name=""extent"" srsname=""epsg:27354"">

        <linestring name=""extent"" srsname=""epsg:27354"">

        <cdata>

        491888.999999459,5458045.99963358 491904.999999458,5458044.99963358

        491908.999999462,5458064.99963358 491924.999999461,5458064.99963358

        491925.999999462,5458079.99963359 491977.999999466,5458120.9996336

        491953.999999466,5458017.99963357 </cdata>

        </linestring>

        </polygon>

        </feature><feature fid=""143"" featuretype=""house"" description=""a house"">

        <polygon name=""extent"" srsname=""epsg:27354"">

        <linestring name=""extent"" srsname=""epsg:27354"">

        <cdata>

        491888.999999459,5458045.99963358 491904.999999458,5458044.99963358

        491908.999999462,5458064.99963358 491924.999999461,5458064.99963358

        491925.999999462,5458079.99963359 491977.999999466,5458120.9996336

        491953.999999466,5458017.99963357 </cdata>

        </linestring>

        </polygon>

        </feature></features>");

 

 

        //Seleziono la feature con fid = 143

 

        var query = from p in gml.Elements("feature") where (int)p.Attribute("fid") == 143 select p;

 

        //visualizzo i suoi attributi

        foreach (var rec in query)

            Console.WriteLine("Feature: type:{0} - description: {1}", rec.Attribute("featureType").Value, rec.Attribute("Description").Value);

sabato 15 novembre 2008

Object initializers con AO

In .NET 3.0 è stato introdotto un nuovo approccio all'inizializzazione degli oggetti: object initializers.
Questo consente di istanziare e inizializzare il tutto in una singola riga.

Una istanza di ESRI.ArcGIS.Geometry.Point può essere creata in .NET 3.0:

IPoint point = new PointClass { X = 3.5, Y = 5.8 };




Può essere pratico nel caso in cui multiple Interface sono richieste per inizializzare un oggetto che richiederebbero nel caso del casting (per esempio utilizzando IQueryFilter and IQueryFilterDefinition per inizializzare un query filter).

IQueryFilter queryFilter = new QueryFilterClass { WhereClause = "PID > 40", PostfixClause = "ORDER BY PID" };

 

        IDatasetName datasetName = new FeatureClassNameClass { Name = "Parcels", WorkspaceName = wsName };

 

        ILine line = new LineClass { FromPoint = point1, ToPoint = point2 };



Questo approccio è comunque da evitare quando:

- una proprietà può gettare un errore perchè nel caso sarebbe difficoltoso 'debuggare'.

- il codice può diventare difficile da leggere quando siamo in presenza di diverse interfacce ereditate dalla classe (per esempio Field)

Vedi articolo

Singleton class in c#

Quando hai bisogno di creare una classe che ha una sola istanza nella tua applicazione occorre creare una singleton class.

In c# con l'inizializzazione statica è semplice:

public sealed class Singleton

    {

        private static readonly Singleton instance = new Singleton();

 

        private Singleton() { }

 

        public static Singleton Instance

        {

            get

            {

                return instance;

            }

        }

    }



Mettendo a readonly la variabile privata statica instance verrà inizializzata solo o in un costruttore statico o in una inizializzazione statica (come in questo caso).

L'istanziazione della classe avverrà solo quando verrà chiamata la proprietà pubblica instance.

La classe è sealed per evitare di creare istanze dalle classi derivate.


Lavorare in ambiente multithreaded ed assicurarti la thread safety

Con questo approccio ci assicuriamo che venga creata una sola istanza e soltanto quando necessario.
La variabile è volatile per permettere di accederci una volta completato l'assegnamento alla variable stessa.
Per evitate deadlock si utilizza una istanza di un oggetto (syncRoot) sul lock.


using System;

 

public sealed class Singleton

{

    private static volatile Singleton instance;

    private static object syncRoot = new Object();

 

    private Singleton() { }

 

    public static Singleton Instance

    {

        get

        {

            if (instance == null)

            {

                lock (syncRoot)

                {

                    if (instance == null)

                        instance = new Singleton();

                }

            }

 

            return instance;

        }

    }

}

venerdì 7 novembre 2008

ProgIDFromCLSID

using System;
using System.Runtime.InteropServices;
using ESRI.ArcGIS.Server;


public static class AOFactory <T>
{
        public static T CreateObject(IServerContext SC, object ArcObject)
        {
            string progId = string.Empty;

            try
            {
                Type t = ArcObject.GetType();
                Guid guid = t.GUID;

                progId = Win32API.ProgIDFromCLSID(ref guid);
            }
            catch { }

            if (!string.IsNullOrEmpty(progId))
                return (T)SC.CreateObject(progId);
            else
                return default(T);
        }

}



public static class Win32API
{
       [DllImport("ole32.dll", CharSet = CharSet.Unicode, PreserveSig = false)]
        public static extern string ProgIDFromCLSID([In()]ref Guid clsid);
}


Sample:

ESRI.ArcGIS.Geometry.IPoint aoPoint = AOFactory<Geometry.IPoint>.CreateObject(sc, new ESRI.ArcGIS.Geometry.PointClass());




Qui puoi scaricare il codice

Background worker

using System;

using System.ComponentModel;

using System.Windows.Forms;

using ESRI.ArcGIS.ADF;

using ESRI.ArcGIS.Geodatabase;

 

//Author: Domenico Ciavarella

//www.studioat.it

namespace Studioat.ArcEngine.Forms

{

    public partial class frmBW : Form

    {

 

        BackgroundWorker backGroundWorker = null;

        enum operation { start, stop };

        public IFeatureClass FeatureClass

        {

            get;

            set;

        }

 

 

        #region Ctor

        public frmBW()

        {

            InitializeComponent();

 

        }

 

        public frmBW(IFeatureClass featureClass):this()

        {

 

 

            FeatureClass = featureClass;

 

 

        }

        #endregion Ctor

 

        private void btnStart_Click(object sender, EventArgs e)

        {

 

            Operation(operation.start);

            RunWorker();

 

 

        }

        private void btnStop_Click(object sender, EventArgs e)

        {

 

            backGroundWorker.CancelAsync();

 

 

        }

 

        #region private method

        void Operation(operation op)

        {

 

            btnStart.Enabled = (op == operation.stop);

            btnStop.Enabled = (op == operation.start);

            InitializeProgressBar();

        }

        void InitializeProgressBar()

        {

            progressBar.Maximum = 100;

            progressBar.Minimum = 0;

            progressBar.Value = 0;

        }

        void RunWorker()

        {

 

           backGroundWorker = new BackgroundWorker();

           backGroundWorker.WorkerReportsProgress = true;

           backGroundWorker.WorkerSupportsCancellation = true;

           backGroundWorker.DoWork += new DoWorkEventHandler(doWork);

           backGroundWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(runWorkerCompleted);

           backGroundWorker.ProgressChanged += new ProgressChangedEventHandler(progressChanged);

           backGroundWorker.RunWorkerAsync(FeatureClass);

 

        }

        #endregion private method

 

        #region BackgroundWorker

        void doWork(object sender, DoWorkEventArgs e) {

 

                BackgroundWorker senderWorker = sender as BackgroundWorker;

 

                IFeatureClass featureClass = e.Argument as IFeatureClass;

                int featureCount = featureClass.FeatureCount(null);

 

                IFeatureCursor featureCursor = featureClass.Search(null, true);

                IFeature feature = featureCursor.NextFeature();

 

                int i = 0;

                while (feature != null)

                {

 

                    //////////////////////////////////////

                    //////////////here your work

                    //System.Threading.Thread.Sleep(1000);

                    //////////////////////////////////////

 

                    ++i;

                    int progressInPercent = (int)(((decimal)(i) / (decimal)featureCount) * 100);

 

                    backGroundWorker.ReportProgress(progressInPercent, feature.OID);

 

 

 

 

 

                    if(senderWorker.CancellationPending) {

 

                        e.Cancel = true;

 

                        break;

 

                    }

 

                    feature = featureCursor.NextFeature();

 

                }

 

                ComReleaser.ReleaseCOMObject(featureCursor);

 

            }

        void runWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)

        {

 

 

 

                if (e.Cancelled)

                   lblStatus.Text = "work was cancelled.";

                else

                   lblStatus.Text = "work finished processing request.";

 

                Operation(operation.stop);

 

        }

        void progressChanged(object sender, ProgressChangedEventArgs e) {

 

            progressBar.Value = e.ProgressPercentage;

 

            lblStatus.Text = string.Format("working on OID of: {0}",e.UserState);

 

        }

        #endregion

 

 

 

    }

}





Qui puoi scaricare la soluzione in VS2008 MapControlBW

mercoledì 5 novembre 2008

Extension method

Esempio di Extension method su IFields

namespace Studioat.ArcEngine

{

    public static class Helper

    {

 

        public static IField get_Field(this IFields fields, string FieldName)

        {

            int i = fields.FindField(FieldName);

 

            return (i==-1)?null:fields.get_Field(i);

 

        }

 

    }

 

}






IField field = featureClass.Fields.get_Field("MyFieldName");

mercoledì 22 ottobre 2008

Esempio Linq utilizzato con ClassBreaks




using System;

using System.Collections.Generic;

using System.Drawing;

using System.Linq;

using ESRI.ArcGIS.ADF.BaseClasses;

using ESRI.ArcGIS.Carto;

using ESRI.ArcGIS.Controls;

using ESRI.ArcGIS.Display;

using ESRI.ArcGIS.esriSystem;

using ESRI.ArcGIS.Geodatabase;

namespace Studioat.ArcEngine

{

 

  public sealed class Classify : BaseCommand

  {

 

 

    private IHookHelper m_hookHelper = null;

    private ITOCControl2 m_tocControl = null;

    public Classify(ITOCControl2 tocControl)

    {

 

      base.m_caption = "Classify LINQ";

 

      m_tocControl = tocControl; 

 

      try

      {

        string bitmapResourceName = GetType().Name + ".bmp";

        base.m_bitmap = new Bitmap(GetType(), bitmapResourceName);

      }

      catch (Exception ex)

      {

        System.Diagnostics.Trace.WriteLine(ex.Message, "Invalid Bitmap");

      }

    }

 

    #region Overriden Class Methods

 

    /// <summary>

    /// Occurs when this command is created

    /// </summary>

    /// <param name="hook">Instance of the application</param>

    public override void OnCreate(object hook)

    {

      if (hook == null)

        return;

 

      try

      {

        m_hookHelper = new HookHelperClass();

        m_hookHelper.Hook = hook;

        if (m_hookHelper.ActiveView == null)

          m_hookHelper = null;

      }

      catch

      {

        m_hookHelper = null;

      }

 

      if (m_hookHelper == null)

        base.m_enabled = false;

      else

        base.m_enabled = true;

    }

 

    /// <summary>

    /// Occurs when this command is clicked

    /// </summary>

    public override void OnClick()

    {

      //nedd to get the layer from the custom-property of the map

      if (null == m_hookHelper)

        return;

 

      //get the mapControl hook

      object hook = null;

      if (m_hookHelper.Hook is IToolbarControl2)

      {

        hook = ((IToolbarControl2)m_hookHelper.Hook).Buddy;

      }

      else

      {

        hook = m_hookHelper.Hook;

      }

 

      //get the custom property from which is supposed to be the layer to be saved

      object customProperty = null;

      IMapControl3 mapControl = null;

      if (hook is IMapControl3)

      {

        mapControl = (IMapControl3)hook;

        customProperty = mapControl.CustomProperty;

      }

      else

        return;

 

      if ((null == customProperty) || !(customProperty is ILayer) || !(customProperty is IFeatureLayer))

        return;

 

 

      IFeatureLayer featureLayer = customProperty as IFeatureLayer;

      IGeoFeatureLayer geoFeatureLayer = featureLayer as IGeoFeatureLayer;

      IFeatureClass featureClass = geoFeatureLayer.DisplayFeatureClass;

 

      string sFieldName = "Popolazione";

      int numClasses = 5;

 

 

      IBasicHistogram basicHistogram = new BasicTableHistogram();

      ITableHistogram tableHistogram = basicHistogram as ITableHistogram;

      tableHistogram.Field = sFieldName;

      tableHistogram.Table = featureClass as ITable;

 

      object oVals =new object();

      object oFreqs =new object();

      basicHistogram.GetHistogram(out oVals, out oFreqs);

      IClassifyGEN classifyGEN = new NaturalBreaks();

 

      classifyGEN.Classify(oVals, oFreqs, ref numClasses);

 

      IClassBreaksRenderer render = new ClassBreaksRenderer();

      double[] cb = (double[])classifyGEN.ClassBreaks;

 

      double[] dVals = (double[])oVals;

      int[] iFreqs = (int[])oFreqs;

 

      var dValsL = dVals.Select((num, index) => new { Num = num, Index = index });

      var iFreqsL = iFreqs.Select((num, index) => new { Num = num, Index = index });

 

      var pairs = from a in dValsL join b in iFreqsL on a.Index equals b.Index select new { Values = a.Num, Frequency = b.Num };

 

 

      List<int> listCount = new List<int>();

 

      for (int i = 0; i < numClasses; i++)

      {

 

          var a = from p in pairs where ((i == 0) ? (p.Values >= cb[i]) : (p.Values > cb[i])) && p.Values <= cb[i + 1] select new { p.Frequency };

          int j = a.Sum(p => p.Frequency);

          listCount.Add(j);

 

      }

 

 

      render.Field = sFieldName;   

      render.BreakCount = numClasses;   

      render.MinimumBreak = cb[0];   

 

 

 

 

      IAlgorithmicColorRamp colorRamp = new AlgorithmicColorRamp();

      colorRamp.Algorithm = esriColorRampAlgorithm.esriCIELabAlgorithm;  

 

 

      IRgbColor color1 = new RgbColor();

 

      IRgbColor color2 = new RgbColor();

      color1.Red = 255 ;  

      color1.Green = 210;   

      color1.Blue = 210;   

      color2.Red = 190;   

      color2.Green = 0;   

      color2.Blue = 170;   

      colorRamp.FromColor = color1;   

      colorRamp.ToColor = color2;   

      colorRamp.Size = 5 ;

      bool ok = true;

      colorRamp.CreateRamp (out ok);

 

 

      IClassBreaksUIProperties  classBreaksUIProperties = render as IClassBreaksUIProperties;   

      classBreaksUIProperties.ColorRamp = "Custom";

      IEnumColors enumColors = colorRamp.Colors; 

      enumColors.Reset(); 

      for (int i = 0;i<numClasses;i++)

      {

        render.set_Break(i,cb[i + 1]);

 

        render.set_Label(i, string.Format("{0} - {1} - Count {2}", cb[i], cb[i + 1], listCount[i]));

        classBreaksUIProperties.set_LowBreak(i, cb[i]);       

        ISimpleFillSymbol simpleFillSymbol = new SimpleFillSymbol();       

        simpleFillSymbol.Color = enumColors.Next();       

        render.set_Symbol(i,simpleFillSymbol as ISymbol);   

      }                

 

      geoFeatureLayer.Renderer = render as IFeatureRenderer;

 

      mapControl.ActiveView.Refresh();

      m_tocControl.Update();

 

    }

 

    #endregion

  }

}



Qui puoi scaricare la soluzione in VS2008 ClassBreakLinq

domenica 14 settembre 2008

Aggiorna un datasource in una combobox/listbox

namespace test
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }


        private void button1_Click(object sender, EventArgs e)
        {
            //aggiungiamo una voce
            listFields.Add(new Field("Comune", "Comune"));
        }


        BindingList<field> listFields = null;
        private void Form1_Load(object sender, EventArgs e)
        {
            listFields = new BindingList<field>();
            listFields.AllowNew = true;
            listFields.AllowRemove = true;
            listFields.AllowEdit = false;

            listFields.RaiseListChangedEvents = true; //se serve sapere quando la lista cambia




            listFields.Add(new Field("Provincie", "Provincie"));
            listFields.Add(new Field("CM", "Comuni Montane"));
            listFields.Add(new Field("CorsiAcqua", "Corsi Acqua"));
            this.comboBox1.DisplayMember = "AliasName";
            this.comboBox1.ValueMember = "Name";
            this.comboBox1.DataSource = listFields;






        }


        void listFields_ListChanged(object sender, ListChangedEventArgs e)
        {
            MessageBox.Show(e.ListChangedType.ToString());
        }



    }





    public class Field
    {

        public string Name
        {
            get {; }
            set {; }
        }
        public string AliasName
        {
            get {; }
            set {; }
        }
        public Field()
        {
        }
        public Field(string name, string aliasName)
        {
            AliasName = aliasName;
            Name = name;
        }
    }
}

giovedì 28 agosto 2008

Batch Geocode Yahoo API

Per utilizzare le API di Yahoo Geocode ( http://developer.yahoo.com/maps/rest/V1/geocode.html ) ho creato una windows application con VS2008.



 

//Author Domenico Ciavarella

//www.studioat.it

 

namespace Studioat.GIS.Yahoo.Geocode.waGeocodeYahoo

{

 

    public partial class frmGeocodeYahoo : Form

    {

        private readonly static string strTblIndirizzi = "tblIndirizzi";

        private readonly static string appID = ""; //<----------- set here your appID!!!!

 

        private readonly static string geocodeURI = "http://local.yahooapis.com/MapsService/V1/geocode?appid={0}&street={1}&city={2}&country={3}&zip={4}";

 

        private readonly static string country = "IT";

 

        class AddressObject

        {

            public string Address;

            public string City;

            public string State;

            public string Zip;

            public string Country;

            public double Latitude;

            public double Longitude;

 

            public string precision;

            public string warning;

        }

 

 

        public frmGeocodeYahoo()

        {

            InitializeComponent();

        }

 

 

        private void btnBrowser_Click(object sender, EventArgs e)

        {

            try

            {

 

 

                OFDDB.CheckFileExists = true;

                OFDDB.CheckPathExists = true;

                OFDDB.DefaultExt = "mdb";

                OFDDB.DereferenceLinks = true;

                OFDDB.Filter = "File Access (*.mdb)|*.mdb";

                OFDDB.Multiselect = false;

                OFDDB.RestoreDirectory = true;

                OFDDB.ShowHelp = false;

                OFDDB.ShowReadOnly = false;

                OFDDB.Title = "Selezionare il db indirizzi";

                OFDDB.ValidateNames = true;

 

                if (OFDDB.ShowDialog() == DialogResult.OK)

                    txtDB.Text = OFDDB.FileName;

 

 

            }

            catch (Exception ex)

            {

                MessageBox.Show(ex.Message);

            }

        }

 

        string StringUrl(string s)

        {

            string result = s.Replace(" ", "+");

            return result;

        }

 

 

        AddressObject GetAddress(string street, string city, string country)

        {

            return GetAddress(street,city,country,string.Empty);

        }

 

        AddressObject GetAddress(string street, string city,string country,string zip)

        {

            try

            {

 

                AddressObject newAddress = new AddressObject();

                NumberFormatInfo nfi = new NumberFormatInfo();

 

                string url = string.Format(geocodeURI, appID, StringUrl(street), StringUrl(city), country, zip);

 

                using (XmlTextReader xmlReader = new XmlTextReader(url))

                {

 

                    xmlReader.WhitespaceHandling = WhitespaceHandling.Significant;

 

 

                    while (xmlReader.Read())

                    {

 

                        if ((xmlReader.NodeType == XmlNodeType.Element) && (xmlReader.Name == "Result"))

                        {

                            if (xmlReader.GetAttribute("precision") != null)

                                newAddress.warning = xmlReader.GetAttribute("precision");

 

                            if (xmlReader.GetAttribute("warning") != null)

                                newAddress.precision = xmlReader.GetAttribute("warning");

 

                            XmlReader xmlResultReader = xmlReader.ReadSubtree();

 

                            while (xmlResultReader.Read())

                            {

 

                                if ((xmlResultReader.NodeType == XmlNodeType.Element) && (xmlResultReader.Name == "Latitude"))

                                    newAddress.Latitude = Convert.ToDouble(xmlResultReader.ReadInnerXml(),nfi);

 

                                if ((xmlResultReader.NodeType == XmlNodeType.Element) && (xmlResultReader.Name == "Longitude"))

                                    newAddress.Longitude = Convert.ToDouble(xmlResultReader.ReadInnerXml(), nfi);

 

                                if ((xmlResultReader.NodeType == XmlNodeType.Element) && (xmlResultReader.Name == "Address"))

                                    newAddress.Address = xmlResultReader.ReadInnerXml();

 

                                if ((xmlResultReader.NodeType == XmlNodeType.Element) && (xmlResultReader.Name == "City"))

                                    newAddress.City = xmlResultReader.ReadInnerXml();

 

                                if ((xmlResultReader.NodeType == XmlNodeType.Element) && (xmlResultReader.Name == "State"))

                                    newAddress.State = xmlResultReader.ReadInnerXml();

 

                                if ((xmlResultReader.NodeType == XmlNodeType.Element) && (xmlResultReader.Name == "Zip"))

                                    newAddress.Zip = xmlResultReader.ReadInnerXml();

 

                                if ((xmlResultReader.NodeType == XmlNodeType.Element) && (xmlResultReader.Name == "Country"))

                                    newAddress.Country = xmlResultReader.ReadInnerXml();

                            }

 

                        }

 

 

 

 

 

 

                    }

                }

 

                return newAddress;

            }

            catch

            {

                return null;

            }

 

        }

 

 

        private void btnOK_Click(object sender, EventArgs e)

        {

 

 

            OleDbConnection cnn = null;

            OleDbDataAdapter da = null;

            DataSet ds = null;

 

            try

            {

 

 

 

 

 

                txtError.Text = string.Empty;

 

 

 

                cnn = new OleDbConnection();

                cnn.ConnectionString = string.Format("Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0};", txtDB.Text);

 

                da = new OleDbDataAdapter();

 

 

                if (chkOnlyWithoutXY.Checked)

                    da.SelectCommand = new OleDbCommand(string.Format("SELECT * FROM {0} WHERE (((Lon) Is Null)) OR (((Lat) Is Null))", strTblIndirizzi), cnn);

                else

                    da.SelectCommand = new OleDbCommand(string.Format("SELECT * FROM {0}", strTblIndirizzi), cnn);

 

 

 

 

                OleDbCommandBuilder custCB = new OleDbCommandBuilder(da);

                cnn.Open();

                ds = new DataSet();

                da.Fill(ds, strTblIndirizzi);

 

 

 

 

 

                PB.Visible = true;

                PB.Minimum = 0;

                PB.Maximum = ds.Tables[0].Rows.Count;

                PB.Value = 0;

                PB.Step = 1;

 

 

                txtError.Text = string.Format("Numero di indirizzi sul quale verrà effettuata la geocodifica: {0}", ds.Tables[0].Rows.Count);

 

 

 

 

 

 

                string strNameFile = System.IO.Path.Combine(Application.StartupPath, System.Guid.NewGuid().ToString());

 

 

                foreach (DataRow r in ds.Tables[0].Rows)

                {

 

 

 

 

                    if ((!System.Convert.IsDBNull(r["Citta"])) && (!System.Convert.IsDBNull(r["Indirizzo"])))

                    {

 

 

 

 

                        AddressObject address = null;

                        if (System.Convert.IsDBNull(r["CAP"]))

                            address = GetAddress(r["Indirizzo"].ToString(), r["Citta"].ToString(), country);

                        else

                            address = GetAddress(r["Indirizzo"].ToString(), r["Citta"].ToString(), country, r["CAP"].ToString());

 

 

                        if (address != null)

                        {

 

                            r["Lon"] = address.Longitude;

                            r["Lat"] = address.Latitude;

                            r["CittaY"] = address.City;

                            r["IndirizzoY"] = address.Address;

                            r["CAPY"] = address.Zip;

                            r["PrecisionY"] = address.precision;

                            r["WarningY"] = address.warning;

                            r["StateY"] = address.State;

                            r["CountryY"] = address.Country;

 

                        }

 

 

                    }

 

                    ds.WriteXml(System.IO.Path.ChangeExtension(strNameFile, "xml"));

 

 

 

                    Application.DoEvents();

                    PB.PerformStep();

 

                }

 

 

 

 

 

 

            }

            catch (Exception ex)

            {

 

                if (txtError.Text == string.Empty)

                    txtError.Text = ex.Message;

                else

                    txtError.Text += System.Environment.NewLine + ex.Message;

 

 

 

            }

            finally

            {

 

                PB.Visible = false;

 

                if (da != null)

                {

                    if (ds != null)

                    {

                        Int32 intNumeroAggiornati = da.Update(ds, strTblIndirizzi);

 

                        ds.Dispose();

 

                        string strMessage = string.Format("Numero di indirizzi aggiornati: {0}{1}{2}", intNumeroAggiornati, System.Environment.NewLine, "Operazione completata");

                        if (txtError.Text == string.Empty)

                            txtError.Text = strMessage;

                        else

                            txtError.Text += System.Environment.NewLine + strMessage;

 

 

                    }

                    da.Dispose();

                }

 

                if ((cnn != null) && (cnn.State == ConnectionState.Open))

                    cnn.Close();

 

 

            }

 

 

 

        }

 

 

 

 

 

 

 

 

 

    }

}




Qui puoi scaricare la soluzione in VS2008 waGeocodeYahoo