diff --git a/src/main/java/io/github/dsheirer/map/PlottableEntityHistory.java b/src/main/java/io/github/dsheirer/map/PlottableEntityHistory.java index 5f43074c..c25e4f68 100644 --- a/src/main/java/io/github/dsheirer/map/PlottableEntityHistory.java +++ b/src/main/java/io/github/dsheirer/map/PlottableEntityHistory.java @@ -87,17 +87,20 @@ public class PlottableEntityHistory */ public void add(PlottableDecodeEvent event) { - TimestampedGeoPosition mostRecentPosition = getLatestPosition(); - TimestampedGeoPosition latest = new TimestampedGeoPosition(event.getLocation(), event.getTimeStart()); - - if(isUnique(latest, mostRecentPosition)) + if(event.isValidLocation()) { - mCurrentEvent = event; - mLocationHistory.add(0, latest); + TimestampedGeoPosition mostRecentPosition = getLatestPosition(); + TimestampedGeoPosition latest = new TimestampedGeoPosition(event.getLocation(), event.getTimeStart()); - while(mLocationHistory.size() > MAX_LOCATION_HISTORY) + if(isUnique(latest, mostRecentPosition)) { - mLocationHistory.remove(mLocationHistory.size() - 1); + mCurrentEvent = event; + mLocationHistory.add(0, latest); + + while(mLocationHistory.size() > MAX_LOCATION_HISTORY) + { + mLocationHistory.remove(mLocationHistory.size() - 1); + } } } } diff --git a/src/main/java/io/github/dsheirer/map/PlottableEntityModel.java b/src/main/java/io/github/dsheirer/map/PlottableEntityModel.java index 50722888..1d9e4403 100644 --- a/src/main/java/io/github/dsheirer/map/PlottableEntityModel.java +++ b/src/main/java/io/github/dsheirer/map/PlottableEntityModel.java @@ -101,42 +101,45 @@ public class PlottableEntityModel extends AbstractTableModel implements Listener @Override public void receive(PlottableDecodeEvent plottableDecodeEvent) { - //Add or update the event on the swing event thread - EventQueue.invokeLater(() -> { - Identifier from = plottableDecodeEvent.getIdentifierCollection().getFromIdentifier(); + if(plottableDecodeEvent.isValidLocation()) + { + //Add or update the event on the swing event thread + EventQueue.invokeLater(() -> { + Identifier from = plottableDecodeEvent.getIdentifierCollection().getFromIdentifier(); - if(from != null && from.getForm() != Form.LOCATION) - { - AliasListConfigurationIdentifier aliasList = plottableDecodeEvent.getIdentifierCollection().getAliasListConfiguration(); - String key = (aliasList != null ? aliasList.toString() : KEY_NO_ALIAS_LIST) + from; - - PlottableEntityHistory entityHistory = mEntityHistoryMap.get(key); - - if(entityHistory == null) + if(from != null && from.getForm() != Form.LOCATION) { - entityHistory = new PlottableEntityHistory(from, plottableDecodeEvent); - mEntityHistories.add(entityHistory); - mEntityHistoryMap.put(key, entityHistory); - int index = mEntityHistories.indexOf(entityHistory); - fireTableRowsInserted(index, index); + AliasListConfigurationIdentifier aliasList = plottableDecodeEvent.getIdentifierCollection().getAliasListConfiguration(); + String key = (aliasList != null ? aliasList.toString() : KEY_NO_ALIAS_LIST) + from; + + PlottableEntityHistory entityHistory = mEntityHistoryMap.get(key); + + if(entityHistory == null) + { + entityHistory = new PlottableEntityHistory(from, plottableDecodeEvent); + mEntityHistories.add(entityHistory); + mEntityHistoryMap.put(key, entityHistory); + int index = mEntityHistories.indexOf(entityHistory); + fireTableRowsInserted(index, index); + } + else + { + entityHistory.add(plottableDecodeEvent); + int index = mEntityHistories.indexOf(entityHistory); + fireTableRowsUpdated(index, index); + } + + for(IPlottableUpdateListener listener : mPlottableUpdateListeners) + { + listener.addPlottableEntity(entityHistory); + } } else { - entityHistory.add(plottableDecodeEvent); - int index = mEntityHistories.indexOf(entityHistory); - fireTableRowsUpdated(index, index); + LOGGER.warn("Received plottable decode event that does not contain a FROM identifier - cannot plot"); } - - for(IPlottableUpdateListener listener : mPlottableUpdateListeners) - { - listener.addPlottableEntity(entityHistory); - } - } - else - { - LOGGER.warn("Received plottable decode event that does not contain a FROM identifier - cannot plot"); - } - }); + }); + } } @Override diff --git a/src/main/java/io/github/dsheirer/module/decode/event/PlottableDecodeEvent.java b/src/main/java/io/github/dsheirer/module/decode/event/PlottableDecodeEvent.java index 719cf3b7..aae77a7f 100644 --- a/src/main/java/io/github/dsheirer/module/decode/event/PlottableDecodeEvent.java +++ b/src/main/java/io/github/dsheirer/module/decode/event/PlottableDecodeEvent.java @@ -62,6 +62,16 @@ public class PlottableDecodeEvent extends DecodeEvent return mGeoPosition; } + /** + * Indicates if the location is non-null and either latitude or longitude is not at the zero axis. If the location + * coordinates are zero or both are very small values close to zero, then the location is flagged as invalid. + */ + public boolean isValidLocation() + { + return mGeoPosition != null && + ((Math.abs(mGeoPosition.getLatitude()) > 0.01) || (Math.abs(mGeoPosition.getLongitude()) > 0.01)); + } + /** * Sets the heading for the mobile plottable event * @param heading