AIS Network Mapper
AIS Network Mapper
Inleiding
Om AIS-data te verwerken en passages uit deze data te bepalen is functionaliteit ontwikkeld welke via de AIS Network Mapper applicatie kan worden aangeroepen. De applicatie maakt het mogelijk om via de console de volgende opdrachten uit te voeren:
- Het inlezen en opslaan van AIS-data naar een database ("voorbewerking")
- Creëren van routes op basis van AIS-data ("route bepaling")
- Bepalen van (sluis)passages ("rapportage")
Deze stappen kunnen los van elkaar uitgevoerd worden, maar ook met elkaar gecombineerd binnen één actie. Zo kan bijvoorbeeld eerst alle AIS-data ingelezen worden om vervolgens voor een specifiek deel van de data set de routes en de passages te bepalen. Daarnaast is het ook mogelijk om AIS-data in te lezen en, zonder deze op te slaan in de database, routes en sluispassages hieruit te bepalen.
Configuratie
Een configuratiebestand AisNetworkMapper.configuration is vereist, in dezelfde folder als de executable.
Als voorbeeld kan AisNetworkMapper.sample.configuration, worden gebruikt.
Een voorbeeld van de inhoud van het bestand:
1
2
3
4
5
<Configuration>
<Database System="SQLite" Name="AisNetworkMapper.db">
<Migrations Enabled="True"/>
</Database>
</Configuration>
Toepassing
De ontwikkelde functionaliteit kan worden aangeroepen door onderstaande opdracht uit te voeren in de command prompt:
1
AisNetworkMapper.Exe [Options] Folder [ShipPositions ...]
Eerst worden een aantal opties meegegeven, vervolgens één map, en als laatste scheepsposities. Er kunnen meerdere opties en scheepspositie bestanden tegelijkertijd worden meegegeven, maar altijd maar exact één map. In de volgende tabel wordt een overzicht gegeven van de verschillende opties met een korte inhoudelijke omschrijving.
| Optie | Omschrijving |
|---|---|
Folder
| Deze map geldt voor zowel de invoer als uitvoer, en bevat het bestand "Files.json" die de locatie en inhoud van de bestanden omschrijft. Naast het bestand "Files.json" bevat deze map ook een "Input" map een lege "Output" map. Let hierbij op dat deze map niet al uitvoer bevat. |
--BatchSize=<Integer>
| Het aantal records wat per keer verwerkt dient te worden. Deze waarde heeft geen invloed op de output. Standaard staat deze op 1000 ingesteld. |
--Chronological
| De applicatie kan ervan uitgaan dat de AIS-data chronologisch is aangeleverd. |
--Filter=<Expression>
|
Alle AIS-data wordt gefilterd met het opgegeven filter. Binnen expressies kan gebruik
worden gemaakt van de volgende identifiers: Latitude, Longitude,
Ship.Length, Ship.Width, Ship.VesselType,
Ship.HazardousCargo. En van de volgende operatoren:
=, <, >, <=, >=, AND, OR, NOT.
|
--LoadPassages
| Passages worden uitgelezen vanuit database. Indien deze indicator wordt meegegeven moet er geen importbestand opgegeven worden. Ook worden er geen heuristieken toegepast. |
--MappingDistance=<FloatingPoint>
|
Maximale afstand (kilometer) tussen een AIS-punt en een vaarweg/knooppunt om direct
gekoppeld te worden aan een vaarweg/knooppunt. Standaard staat deze waarde op 0,1.
Deze waarde wordt toegepast binnen de MapToNearestNode heuristiek.
|
--MaximumConnections=<FloatingPoint>
|
Het maximaal aantal vaarwegen dat toegevoegd kan worden aan een deeltraject om de route
opeenvolgend te maken. Indien er meer vaarwegen nodig zijn om de route aaneengesloten te
houden, wordt de route opgeknipt in twee losse routes. Standaard staat deze waarde op 20.
Deze waarde wordt toegepast binnen de MapToNearestNode heuristiek.
|
--MaximumPositionDistance=<FloatingPoint>
| Maximale afstand (kilometer) tussen twee opeenvolgende datapunten. Indien een volgend punt in afstand meer dan deze waarde van het laatste punt verschilt wordt dit punt als outlier beschouwd en buiten beschouwing gelaten. Standaard staat deze waarde op 20. |
--MaximumPositionInterval=<Integer>
| Maximale tijd (milliseconde) tussen twee opeenvolgende datapunten. Indien een volgend punt in tijd meer dan deze waarde van het laatste punt verschilt wordt de route voor het betreffende schip opgeknipt. Standaard staat deze waarde op 3.600.000 (1 uur). |
--MaximumSpeed=<FloatingPoint>
| Maximale snelheid (kilometer per uur) om het volgende datapunt te bereiken. De snelheid wordt geschat op basis van de tijd en afstand tussen twee opeenvolgende datapunten, hemelsbreed gezien. Indien de geschatte snelheid om het volgende punt te bereiken meer dan deze waarde is wordt dit punt als outlier beschouwd en buiten beschouwing gelaten. Standaard staat deze waarde op 50. |
--MinimumPositionDistance=<FloatingPoint>
| Minimale afstand (kilometer) tussen twee opeenvolgende datapunten. Indien een volgend punt in afstand meer dan deze waarde van het laatste punt verschilt wordt dit punt meegenomen in de verdere bepaling. Standaard staat deze waarde op 0,1. |
--MinimumPositionInterval=<Integer>
| Minimale tijd (milliseconde) tussen twee opeenvolgende datapunten. Indien een volgend punt in tijd meer dan deze waarde van het laatste punt verschilt wordt dit punt meegenomen in de verdere bepaling. Standaard staat deze waarde op 600.000 (10 minuten). |
--PassageOutput=<Csv|GeoJson>
| Passages worden weggeschreven in het opgegeven formaat. |
--PositionFormat=<Json|Nmea>
| Bestandsformaat van invoerbestand. |
--PositionOutput=<GeoJson>
| Posities worden weggeschreven in het opgegeven formaat. |
--SavePassages
| Passages worden opgeslagen in de database. |
--SavePositions
| Posities worden opgeslagen in de database. |
--Ships=<Range>
|
Geeft een selectie van scheepsidentificatienummers waarvoor de actie wordt uitgevoerd. Dit kan
voor een enkel identificatienummer (bijvoorbeeld --Ships=1 voor
scheepsidentificatienummer 1), of een aaneengesloten reeks van identificatienummers
(bijvoorbeeld --Ships=1-10 voor scheepsidentificatienummers 1 tot en met 10).
Deze optie is te gebruiken in combinatie met LoadPassages.
|
--Steps=<MapToNearestNode|Flatten>
|
Definieert welke heuristieken worden gebruikt bij het genereren van routes. Er worden momenteel twee
heuristieken ondersteund (MapToNearestNode en Flatten). MapToNearestNode zoekt per AIS-punt het meest
dichtstbijzijnde knooppunt en verbindt de knopen via het kortste pad. Flatten verwijdert onlogische herhalingen
van lijnstukken binnen een gegeven tijdsinterval (3 uur).
|
Extra opmerkingen bij de verschillende opties:
- Er kan gebruik worden gemaakt van een database om posities en passages weg te schrijven. De verwijzing naar deze database wordt ingesteld binnen de configuratie van de applicatie.
- Decimale getallen (floating points) dienen te worden ingevoerd met een punt (.) als decimaalteken.
Voorbeelden
Met het volgende commando wordt het gehele proces in één keer doorlopen. Direct na de opgegeven opties staat de naam van de map "D:\Folder\", waardoor uit het netwerk wordt gehaald. Uit het importbestand "Data.gz" met daarin de AIS-data worden de posities geëxtraheerd, routes gecreëerd en passages bepaald. De projectie van de posities wordt uitgevoerd op het netwerk. Tenslotte worden de gevonden passages en de schepen die voorkomen in de passages weggeschreven naar de bestanden "Passages.csv" en "Ships.csv" in dezelfde folder, in dit geval dus "D:\Folder\".
1
2
AisNetworkMapper.Exe --Steps=MapToNearestNode --PassageOutput=Csv
--PositionFormat=Nmea D:\Folder D:\Folder\Input\Data.gz
Het is ook mogelijk om data direct te streamen naar de applicatie. Hiervoor wordt als laatste argument een koppelteken - gebruikt.
Het onderstaande commando geeft aan hoe dit bijvoorbeeld met PowerShell kan worden gebruikt om een tekstbestand
met NMEA AIS-data te streamen. Let op dat voor deze invoermethode verwacht wordt dat de data niet meer gecomprimeerd is.
1
2
Get-Content -AsByteStream D:\Folder\Input\Data.nmea | AisNetworkMapper.Exe
--Steps=MapToNearestNode --PassageOutput=Csv --PositionFormat=Nmea D:\Folder -
Met de volgende drie commando's worden de verschillende exports uitgevoerd voor de schepen met identificatienummers 11 en 12. Het resultaat van deze opdrachten is één CSV-bestand met de passages voor beide schepen, één CSV-bestand met de informatie van beide schepen, twee GeoJSON-bestanden voor de passages en twee voor de posities. Er wordt namelijk voor ieder schip een individueel GeoJSON-bestand gegenereerd voor zowel de posities als de passages.
1
AisNetworkMapper.Exe --LoadPassages --PassageOutput=Csv --Ships=11-12 D:\Folder\
1
AisNetworkMapper.Exe --LoadPassages --PassageOutput=GeoJson --Ships=11-12 D:\Folder\
1
AisNetworkMapper.exe --PositionFormat=Nmea --PositionOutput=GeoJson --Ships=11-12 D:\Folder\ D:\Folder\Input\Data.gz
Het volgende commando laat zien hoe de AIS-data ingelezen kan worden, routes bepaald kunnen worden en de passages berekend en geëxporteerd in een opdracht. Daarbij wordt ook een geografische filter toegepast door alleen de posities mee te nemen welke binnen het gestelde criterium vallen.
1
2
3
AisNetworkMapper.Exe --Steps=MapToNearestNode
--Filter="(Latitude > 50) and (Latitude < 51) and (Longitude > 4) and (Longitude < 5)"
--PassageOutput=Csv D:\Folder D:\Folder\Input\Data.gz
Merk op: In deze voorbeelden zijn de gerefereerde paden allen zonder spaties. Wanneer dit niet het geval is moet het pad omsloten worden door quotes (") en een extra backslash (\) toegevoegd worden. Het commando waarin de AIS-data in één keer wordt ingelezen, en verwerkt tot passages ziet er dan als volgt uit.
1
2
AisNetworkMapper.Exe --Steps=MapToNearestNode --PassageOutput=Csv
--PositionFormat=Json "D:\Folder met spaties\\" "D:\Folder met spaties\Data.gz"
Verwerken grote data sets
AIS Network Mapper is in staat om zeer grote data sets te verwerken. De applicatie heeft geen directe beperking op de omvang van de input. Wel moet bij het verwerken van grote data sets rekening gehouden worden met een aantal aspecten.
Geheugengebruik
Omdat de applicatie een aanzienlijk deel van de ingelezen data in het geheugen houdt bij het verwerken van een data set,
kan het geheugengebruik een probleem worden wanneer de data set te groot wordt. Uiteindelijk zal de applicatie hierdoor
uit zijn geheugen lopen en crashen. De enige manier om dit te voorkomen is door de runs op te knippen in kleinere runs
die ieder een deel van de data set beschouwen. Eerder in dit document is beschreven hoe dit gedaan kan worden met behulp
van de Ships parameter. Door deze mee te geven wordt in een run slechts de opgegeven range van schepen beschouwd.
Database
Het verwerken van een grote data set kan veel tijd in beslag nemen. De applicatie is afhankelijk van een stabiele verbinding met de database waar de data naar toe wordt weggeschreven. Het wegvallen van de verbinding met de database kan er voor zorgen dat de applicatie crasht. Een run moet dan volledig opnieuw gedaan worden.
Voorbeeld
Ter verheldering volgen hier de verschillende stappen die zijn uitgevoerd om een daadwerkelijke studie uit te voeren. De betreffende studie omvat 18 maanden aan AIS data. De data is opgeknipt in vier bestanden per maand. Omdat de data per maand andere scheepsidentificatienummers gebruikt zijn alle maanden volledig los van elkaar uitgevoerd. Hieronder staan de opdrachten die zijn uitgevoerd om één maand te verwerken:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# De volgende opdrachten verwerken de posities die opgeslagen zijn in de database
# naar arc passages. Om te voorkomen dat de applicatie uit zijn geheugen loopt is
# de opdracht opgeknipt.
AisNetworkMapper.Exe --Chronological
--BatchSize=10000 --Steps=MapToNearestNode,Flatten --MaximumSpeed=50
--MinimumPositionInterval=600000 --MaximumConnections=20
--MinimumPositionDistance=0.1 D:\Folder 201801_week1.gz
AisNetworkMapper.Exe --Chronological
--BatchSize=10000 --Steps=MapToNearestNode,Flatten --MaximumSpeed=50
--MinimumPositionInterval=600000 --MaximumConnections=20
--MinimumPositionDistance=0.1 D:\Folder 201801_week2.gz
AisNetworkMapper.Exe --Chronological
--BatchSize=10000 --Steps=MapToNearestNode,Flatten --MaximumSpeed=50
--MinimumPositionInterval=600000 --MaximumConnections=20
--MinimumPositionDistance=0.1 D:\Folder 201801_week3.gz
AisNetworkMapper.Exe --Chronological
--BatchSize=10000 --Steps=MapToNearestNode,Flatten --MaximumSpeed=50
--MinimumPositionInterval=600000 --MaximumConnections=20
--MinimumPositionDistance=0.1 D:\Folder 201801_week4.gz