domenica 28 dicembre 2008
What's Coming in ArcGIS 9.3.1
- 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
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
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)
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
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);