Si possono organizzare le posizioni route in tabelle basate su un tema comune, le tabelle eventi. Per esempio, cinque tabelle eventi contenenti informazioni su limiti di velocità, anno di riasfaltamento, stato della pavimentazione, segnali stradali e frequenza incidenti possono riferire ad una route feature class rappresentante il reticolo stradale.
Una tabella eventi è una qualsiasi tabella che contenga un campo di identificazione della route ed almeno un campo per la misura (m). Le tabelle contenenti posizioni route puntuali hanno un campo di misura, mentre le tabelle contenenti posizioni route lineari ne hanno due. Il campo che identifica la route si 'aggancia' all’identificatore di route nella route feature class (non è necessario che questi abbiano lo stesso nome).
Una route event source fornisce una tabella eventi come una feature class dinamica. Ogni riga della tabella è rappresentata come una feature la cui shape è calcolata al volo ogni volta che è richiesto: questa è la segmentazione dinamica.
Nella seguente illustrazione mostriamo il concetto di segmentazione dinamica:
In una route event source, c’è una feature per ogni riga della tabella eventi originale. A volte, comunque, le feature hanno shape vuote. Ciò accade perché si è verificata una qualche ragione per la quale l’evento non è stato localizzato propriamente. In alcuni ad esempio, si può localizzare un evento solo parzialmente (solo con eventi lineari). La seguente illustrazione mostra alcuni tipi di errore:
La seguente illustrazione mostra il modello a oggetti per la segmentazione dinamica:
Per quel che riguarda lo sviluppo, abbiamo a disposizione il Locator, una classe astratta che specifica tutti i tipi di oggetti locator. Tra i tipi di locator ci sono: quelli per indirizzi, route (quello che siamo illustrando), coordinate x y e nomi di località. Il locator combina dati di riferimento con un metodo di posizionamento.
L’interfaccia ILocator fornisce accesso alle proprietà di un locator.
Il RouteLocator è una classe astratta che trasforma una posizione route in una shape visualizzabile su mappa. Le classi astratte Locator e RouteLocator sono mostrate nella seguente illustrazione:
La posizione route descrive una posizione lungo una route o una porzione di route tra un DA e un A di misure (m). L’interfaccia IRouteLocator2 eredita da IRouteLocator ed è utile per restituire le proprietà di un oggetto RouteLocator e per determinare la shape delle posizioni route ed eventi. Il metodo Identify è utile per identificare le posizioni di route utilizzando un envelope. Quando utilizziamo ArcMap, un metodo consigliato è utilizzare la tolleranza del map document:
IEnvelope envelope = mxDoc.CurrentLocation.Envelope; envelope.Expand(mxDoc.SearchTolerance, mxDoc.SearchTolerance, false);
Per route locator, la proprietà RouteFeatureClass può essere uno shapefile PolylineM o una feature class Polyline (con valori m) in un personal, file o ArcSDE geodatabase.
Questo significa che le route sono memorizzate in una feature class dove:
IGeometryDef.GeometryType = esriGeometryPolyLine e IGeometryDef.HasM = true
RouteMeasureLocator è un tipo di RouteLocator. Esso determina la shape di una posizione route associando i valori di misura delle posizioni route a quelli memorizzati nella feature route.
Il RouteMeasureLocator è creato tramite la controparte del suo oggetto nome, RouteMeasureLocatorName. L’oggetto RouteMeasureLocator è mostrato nella seguente figura:
La classe concreta RouteMeasureLocatorName è mostrato nella seguente illustrazione:
L’interfaccia IRouteLocatorName è utilizzata per restituire le proprietà di un oggetto RouteLocator.
Il LocatorName è una classe astratta che può essere utilizzata per far riferimento ad un oggetto Locator.
Il RouteLocatorName è una classe astratta che può essere utilizzata per riferirsi ad un oggetto RouteLocator.
RouteMeasureLocatorName è una classe concreta che può essere utilizzata per riferirsi ad un oggetto RouteMeasureLocator ed è una specifica implementazione del LocatorName e del RouteLocatorName.
Tutte le classi di RouteLocatorName implementano l’interfaccia IRouteLocatorName. Tale interfaccia si usa per impostare e restituire le proprietà dell’oggetto RouteLocatorName (classe concreta: RouteMeasureLocatorName).
Seguono alcune precisazioni circa le proprietà di questa interfaccia:
- RouteFeatureClassName: feature class polyline con valori m.
- RouteIDFieldName: qualsiasi campo numerico o testuale contenente l’identificatore di route. Questo campo si relazionerà ad un campo della stessa natura nella tabella eventi.
- RouteMeasureUnit: unità di misura dei valori m memorizzati nelle route. Il valore di default è esriUnknownUnits.
- RouteWhereClause: condizione che limita il noumero di routes sulle quali le posizioni possono essere trovate.
Il seguente esempio di codice mostra come creare un RouteMeasureLocator via RouteMeasureLocatorName:
IDataset dS = (IDataset)routeFC; // A polylineM feature class. IName name = dS.FullName; IRouteLocatorName rtLocatorName = new RouteMeasureLocatorNameClass(); rtLocatorName.RouteFeatureClassName = name; rtLocatorName.RouteIDFieldName = "routeId"; rtLocatorName.RouteMeasureUnit = esriUnits.esriMeters; name = (IName)rtLocatorName; IRouteLocator2 rtLocator = (IRouteLocator2)name.Open();
Una RouteMeasureLocation descrive una porzione di route o una singola posizione lungo una route. L’interfaccia IRouteLocation ti permette di definire le proprietà di una posizione route, ad esempio le posizioni route che si trovano lungo una singola route; perciò, impostane qui il valore. In aggiunta, identifica le unità di misura nelle quali la posizione route è stata raccolta e specifica se lo desideri che la shape della posizione di route abbia un offset dalla route quando è posizionata.
Gli offset sono nelle unità di misura del riferimento spaziale della route feature class (e non necessariamente nelle stesse unità delle misure della feature class). Quindi, un offset su dati di route memorizzati in unità geografiche potrebbe produrre risultati non corretti. Gli offset vengono utilizzati esclusivamente per scopi di visualizzazione degli eventi sulla mappa.
Impostare la proprietà IRouteLocation.MeasureUnit ti consente di eseguire al volo conversioni di misure. Tale proprietà corrisponde a IRouteLocatorName.RouteMeasureUnit. Ad esempio, potresti conoscere la collocazione di una posizione route in miglia, ma la tua route feature class ha le sue misure memorizzate in metri. Impostando i valori di conseguenza, puoi ottenere la conversione della misura.
RouteMeasureLineLocation è una classe che descrive porzioni di una route utilizzando posizioni di misura DA - A. L’oggetto RouteMeasureLineLocation è mostrato nella seguente illustrazione:
L’interfaccia IRouteMeasureLineLocation è dove puoi impostare i valori di misura Da – A delle posizioni route, ad esempio, trovare una posizione a partire da 2500 metri a 3500 metri lungo la route 10 e impostare un offset di 25 metri dalla route:
IRouteLocation routeLoc = new RouteMeasureLineLocationClass(); routeLoc.MeasureUnit = esriUnits.esriMeters; routeLoc.RouteID = 10; routeLoc.LateralOffset = 25; IRouteMeasureLineLocation rMLineLoc = (IRouteMeasureLineLocation)routeLoc; rMLineLoc.FromMeasure = 2500; rMLineLoc.ToMeasure = 3500;
RouteMeasurePointLocation è una classe che utilizza un singolo valore di m per rappresentare una singola posizione lungo la route.
L’interfaccia IRouteMeasurePointLocation è dove puoi impostare i valori m delle posizioni. Ad esempio per trovare la posizione a 565.5 metri lungo la route 10:
IRouteLocation routeLocation = new RouteMeasurePointLocationClass(); routeLocation.MeasureUnit = esriUnits.esriMeters; routeLocation.RouteID = 10; routeLocation.LateralOffset = 0; IRouteMeasurePointLocation rMPointLoc = (IRouteMeasurePointLocation)routeLocation; rMPointLoc.Measure = 565.5;
Una volta che hai creato la posizione di route, determini la sua geometria chiamando il metodo IRouteLocator.Locate come mostrato nel seguente codice di esempio:
IGeometry geom; esriLocatingError locError; rtLocator.Locate((IRouteLocation)rMPointLoc, out geom, out locError);
Qui potete scaricare una SOE (10 e 10.1) che ho sviluppato che permette interrogare la M lungo una route, impostare una posizione puntuale e lineare via rest mediante un servizio ArcGIS Server, utilizzando i metodi qui presentati.
Anche ESRI ha sviluppato una SOE che potete trovare qui tra i samples di arcgis.com. Una volta disegnata la polyline la SOE posiziona i marker ogni miglia o chilometro. In questo caso la creazione della route è fatta al volo impostando i valori di m con la lunghezza cumulata a partire dall'origine della geometria (il parametro ratio = false indica che si vuole il valore assoluto delle m e non quello relativo rispetto alla lunghezza complessiva della polyline).
IMSegmentation mSeg = (IMSegmentation)pointColl; mSeg.SetMsAsDistance(false);
Per dettagli su come impostare le route event source lineari e puntuali (come già detto: feature class dinamiche basate su tabelle eventi), come creare route, come calibrare le misure route, come geoprocessare eventi, come localizzare feature lungo le route e come etichettare le feature lineari con m (hatching) seguite il seguente link.