Author: tchemit Date: 2012-08-09 11:48:59 +0200 (Thu, 09 Aug 2012) New Revision: 378 Url: http://forge.codelutin.com/repositories/revision/sammoa/378 Log: refs #1203: Export SHP (add efforts and observations export model + fix doc) Added: trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/map/LegStatus.java Modified: trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/map/ExportMapService.java trunk/src/site/rst/import-export.rst Modified: trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/map/ExportMapService.java =================================================================== --- trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/map/ExportMapService.java 2012-08-09 09:47:55 UTC (rev 377) +++ trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/map/ExportMapService.java 2012-08-09 09:48:59 UTC (rev 378) @@ -80,29 +80,252 @@ } public void exportEffortsMap(ExportMapModel dataModel) { + Preconditions.checkNotNull(dataModel.getCampaign()); + Preconditions.checkNotNull(dataModel.getBeginDate()); + Preconditions.checkNotNull(dataModel.getEndDate()); + if (logger.isInfoEnabled()) { - logger.info("Start EffortsMap export to " + - dataModel.getExportDirectory() + "::" + + logger.info("Start EffortsMap export to {} :: {}", + dataModel.getExportDirectory(), dataModel.getExportFilename()); } - try { - Thread.sleep(1000); - } catch (InterruptedException e) { + long startTime = TimeLog.getTime(); + Campaign campaign = dataModel.getCampaign(); + Region region = campaign.getRegion(); + + // * uniquement pour un parcours de type LEG, sinon la cellule sera vide + // ** uniquement pour un parcours de type CIRCLE_BACK, sinon la cellule sera vide + DbfTableModelBuilder builder = new DbfTableModelBuilder() + .stringColumn("REGION") // (campaign.region.code) + .stringColumn("CAMPAIGN") // (campaign.code) + .integerColumn("SECTOR") // * (route.transectFlight.transect.strate.sector.sectorNumber) + .stringColumn("STRATE_TYPE") // * (route.transectFlight.transect.strate.strateType.code) + .stringColumn("STRATE") // * (route.transectFlight.transect.strate.code) + .stringColumn("TRANSECT") // * (route.transectFlight.transect.name) + .integerColumn("PASSAGE") // * (route.transectFlight.crossingNumber) + .integerColumn("FLIGHT") // (route.flight.flightNumber) + .stringColumn("COMPUTER") // (route.flight.systemId) + .stringColumn("ROUTE_TYPE") // (route.routeType.name) + .stringColumn("EFFORT_GROUP") // * () + .stringColumn("EFFORT") // * () + .stringColumn("STATUS") // * (LegStatus.name) + .dateColumn("DATE") // (route.beginTime) + .stringColumn("HHMMSS") // (format(route.beginTime, "HHmmss")) + .integerColumn("SEA_STATE") // (route.seaState) + .integerColumn("SWELL") // (route.swell) + .integerColumn("TURBIDITY") // (route.turbidity) + .integerColumn("SKY_GLINT") // (route.skyGlint) + .stringColumn("GLARE_FROM") // (route.glareFrom) + .stringColumn("GLARE_TO") // (route.glareTo) + .integerColumn("GLARE_SEVERITY") // (route.glareSeverity) + .booleanColumn("GLARE_UNDER") // (route.glareUnder) + .integerColumn("CLOUD_COVER") // (route.cloudCover) + .stringColumn("SUBJECTIVE") // (route.subjectiveConditions) + .stringColumn("UNEXP_LEFT") // (route.unexpectedLeft) + .stringColumn("UNEXP_RIGHT") // (route.unexpectedRight) + .stringColumn("LEFT_REAR") // (route.observerPosition[FRONT_LEFT].observer.initials) + .stringColumn("RIGHT_REAR") // (route.observerPosition[FRONT_RIGHT].observer.initials) + .stringColumn("CENTER") // (route.observerPosition[NAVIGATOR].observer.initials) + .stringColumn("CB_CAUSE") // ** () + .doubleColumn("LAT", 19, 11) // (geoPoint.latitude) + .doubleColumn("LON", 19, 11) // (geoPoint.longitude) + .doubleColumn("SPEED", 19, 11) // (geoPoint.speed) + .doubleColumn("ALTITUDE", 19, 11) // (geoPoint.altitude) + .stringColumn("GPS_TIME") // (format(geoPoint.recordTime, "HHmmss")) + .stringColumn("AIRCRAFT") // (route.flight.planeImmatriculation) + .stringColumn("COMMENT") // (route.comment) + .build(); + + EsriGraphicList graphicList = new EsriPointList(); + List<Flight> campaignFlights = context.getFlightService().getFlights(dataModel.getCampaign()); + + // Filter on period + final PeriodDates period = new PeriodDates(dataModel.getBeginDate(), dataModel.getEndDate()); + Iterable<Flight> flights = Iterables.filter(campaignFlights, new Predicate<Flight>() { + + @Override + public boolean apply(Flight input) { + return period.between(input.getBeginDate()); + } + }); + + // Export for each flight + for (Flight flight : flights) { + + if (logger.isInfoEnabled()) { + logger.info("Export GeoPoints from flight {} - {} - {} - {}", + new Object[]{flight.getFlightNumber(), + flight.getSystemId(), + campaign.getCode(), + region.getCode()} + ); + } + + List<GeoPoint> geoPoints = context.getFlightService().getFlightGeoPoints(flight); + + // One record by GeoPoint + for (GeoPoint geoPoint : geoPoints) { + + Map<String, Object> record = Maps.newHashMap(); + + record.put("REGION", region.getCode()); + record.put("CAMPAIGN", campaign.getCode()); + record.put("FLIGHT", flight.getFlightNumber()); + record.put("COMPUTER", flight.getSystemId()); + record.put("DATE", geoPoint.getRecordTime()); + record.put("HHMMSS", timeFormat.format(geoPoint.getRecordTime())); + record.put("LAT", geoPoint.getLatitude()); + record.put("LON", geoPoint.getLongitude()); + record.put("SPEED", geoPoint.getSpeed()); + record.put("ALTITUDE", geoPoint.getAltitude()); + + builder.addValues(record); + + if (logger.isTraceEnabled()) { + logger.trace("Record={}", record); + } + + OMGraphic graphic = new OMPoint(geoPoint.getLatitude(), geoPoint.getLongitude()); + graphicList.add(graphic); + } } + + startTime = timeLog.log(startTime, "exportGeoPointsMap", "after building EsriGraphicList and DbfTableModel"); + + // Execute export with EsriShapeExport + DbfTableModel tableModel = builder.getModel(); + String pathFile = new File(dataModel.getExportDirectory(), dataModel.getExportFilename()).getAbsolutePath(); + EsriShapeExport shapeExport = new EsriShapeExport(graphicList, tableModel, pathFile); + shapeExport.export(); + + timeLog.log(startTime, "exportEffortsMap", "after EsriShapeExport execution"); } public void exportObservationsMap(ExportMapModel dataModel) { + Preconditions.checkNotNull(dataModel.getCampaign()); + Preconditions.checkNotNull(dataModel.getBeginDate()); + Preconditions.checkNotNull(dataModel.getEndDate()); + if (logger.isInfoEnabled()) { - logger.info("Start ObservationsMap export to " + - dataModel.getExportDirectory() + "::" + + logger.info("Start ObservationsMap export to {} :: {}", + dataModel.getExportDirectory(), dataModel.getExportFilename()); } - try { - Thread.sleep(1000); - } catch (InterruptedException e) { + long startTime = TimeLog.getTime(); + Campaign campaign = dataModel.getCampaign(); + Region region = campaign.getRegion(); + + // * uniquement pour un parcours de type LEG, sinon la cellule sera vide + // ** uniquement pour un parcours de type CIRCLE_BACK, sinon la cellule sera vide + DbfTableModelBuilder builder = new DbfTableModelBuilder() + .stringColumn("REGION") // (campaign.region.code) + .stringColumn("CAMPAIGN") // (campaign.code) + .integerColumn("SECTOR") // * (route.transectFlight.transect.strate.sector.sectorNumber) + .stringColumn("STRATE_TYPE") // * (route.transectFlight.transect.strate.strateType.code) + .stringColumn("STRATE") // * (route.transectFlight.transect.strate.code) + .stringColumn("TRANSECT") // * (route.transectFlight.transect.name) + .integerColumn("PASSAGE") // * (route.transectFlight.crossingNumber) + .integerColumn("FLIGHT") // (route.flight.flightNumber) + .stringColumn("COMPUTER") // (route.flight.systemId) + .stringColumn("ROUTE_TYPE") // (route.routeType.name) + .stringColumn("EFFORT_GROUP") // * () + .stringColumn("EFFORT") // * () + .stringColumn("OBSERVATION") // () + .dateColumn("DATE") // (observation.beginTime) + .stringColumn("HHMMSS") // (format(observation.beginTime, "HHmmss")) + .stringColumn("TAXON") // (observation.species.type) + .stringColumn("GROUP") // (observation.species.groupName) + .stringColumn("FAMILY") // (observation.species.family) + .stringColumn("SPECIES") // (observation.species.code) + .stringColumn("SPECIES_NAME") // (observation.species.commonName) + .stringColumn("SPECIES_LATIN") // (observation.species.latinName) + .integerColumn("POD_SIZE") // (observation.podSize) + .stringColumn("AGE") // (observation.age) + .integerColumn("DEC_ANGLE") // (observation.decAngle) + .stringColumn("CUE") // (observation.cue) + .stringColumn("BEHAVIOUR") // (observation.behaviour) + .integerColumn("SWIM_DIR") // (observation.swimDir) + .stringColumn("CALVES") // (observation.calves) + .stringColumn("PHOTO") // (observation.photo) + .stringColumn("OBSERVER") // (observation.observerPosition.observer.initials) + .stringColumn("SIDE") // (observation.observerPosition.observer.position.name) + .stringColumn("STATUS") // (observation.observationStatus.name) + .stringColumn("CB_CAUSE") // ** () + .doubleColumn("LAT", 19, 11) // (geoPoint.latitude) + .doubleColumn("LON", 19, 11) // (geoPoint.longitude) + .doubleColumn("SPEED", 19, 11) // (geoPoint.speed) + .doubleColumn("ALTITUDE", 19, 11) // (geoPoint.altitude) + .stringColumn("GPS_TIME") // (format(geoPoint.recordTime, "HHmmss")) + .stringColumn("AIRCRAFT") // (observation.flight.planeImmatriculation) + .stringColumn("COMMENT") // (observation.comment) + .build(); + + EsriGraphicList graphicList = new EsriPointList(); + List<Flight> campaignFlights = context.getFlightService().getFlights(dataModel.getCampaign()); + + // Filter on period + final PeriodDates period = new PeriodDates(dataModel.getBeginDate(), dataModel.getEndDate()); + Iterable<Flight> flights = Iterables.filter(campaignFlights, new Predicate<Flight>() { + + @Override + public boolean apply(Flight input) { + return period.between(input.getBeginDate()); + } + }); + + // Export for each flight + + for (Flight flight : flights) { + + if (logger.isInfoEnabled()) { + logger.info("Export GeoPoints from flight {} - {} - {} - {}", + new Object[]{flight.getFlightNumber(), + flight.getSystemId(), + campaign.getCode(), + region.getCode()} + ); + } + + List<GeoPoint> geoPoints = context.getFlightService().getFlightGeoPoints(flight); + + // One record by GeoPoint + for (GeoPoint geoPoint : geoPoints) { + + Map<String, Object> record = Maps.newHashMap(); + + record.put("REGION", region.getCode()); + record.put("CAMPAIGN", campaign.getCode()); + record.put("FLIGHT", flight.getFlightNumber()); + record.put("COMPUTER", flight.getSystemId()); + record.put("DATE", geoPoint.getRecordTime()); + record.put("HHMMSS", timeFormat.format(geoPoint.getRecordTime())); + record.put("LAT", geoPoint.getLatitude()); + record.put("LON", geoPoint.getLongitude()); + record.put("SPEED", geoPoint.getSpeed()); + record.put("ALTITUDE", geoPoint.getAltitude()); + + builder.addValues(record); + + if (logger.isTraceEnabled()) { + logger.trace("Record={}", record); + } + + OMGraphic graphic = new OMPoint(geoPoint.getLatitude(), geoPoint.getLongitude()); + graphicList.add(graphic); + } } + + startTime = timeLog.log(startTime, "exportObservationsMap", "after building EsriGraphicList and DbfTableModel"); + + // Execute export with EsriShapeExport + DbfTableModel tableModel = builder.getModel(); + String pathFile = new File(dataModel.getExportDirectory(), dataModel.getExportFilename()).getAbsolutePath(); + EsriShapeExport shapeExport = new EsriShapeExport(graphicList, tableModel, pathFile); + shapeExport.export(); + + timeLog.log(startTime, "exportObservationsMap", "after EsriShapeExport execution"); } public void exportGeoPointsMap(ExportMapModel dataModel) { @@ -111,8 +334,8 @@ Preconditions.checkNotNull(dataModel.getEndDate()); if (logger.isInfoEnabled()) { - logger.info("Start GeoPointsMap export to " + - dataModel.getExportDirectory() + "::" + + logger.info("Start GeoPointsMap export to {} :: {}", + dataModel.getExportDirectory(), dataModel.getExportFilename()); } @@ -148,15 +371,14 @@ }); // Export for each flight - Map<String, Object> record = Maps.newHashMap(); for (Flight flight : flights) { if (logger.isInfoEnabled()) { logger.info(String.format("Export GeoPoints from flight %d - %s - %s - %s", - flight.getFlightNumber(), - flight.getSystemId(), - campaign.getCode(), - region.getCode()) + flight.getFlightNumber(), + flight.getSystemId(), + campaign.getCode(), + region.getCode()) ); } @@ -165,7 +387,7 @@ // One record by GeoPoint for (GeoPoint geoPoint : geoPoints) { - record.clear(); + Map<String, Object> record = Maps.newHashMap(); record.put("REGION", region.getCode()); record.put("CAMPAIGN", campaign.getCode()); Added: trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/map/LegStatus.java =================================================================== --- trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/map/LegStatus.java (rev 0) +++ trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/map/LegStatus.java 2012-08-09 09:48:59 UTC (rev 378) @@ -0,0 +1,16 @@ +package fr.ulr.sammoa.application.map; + +/** + * TODO + * + * @author tchemit <chemit@codelutin.com> + * @since 0.5 + */ +public enum LegStatus { + BEAGIN, + ADD, END; + + public String getName() { + return name(); + } +} Property changes on: trunk/sammoa-application/src/main/java/fr/ulr/sammoa/application/map/LegStatus.java ___________________________________________________________________ Added: svn:keywords + Author Date Id Revision Added: svn:eol-style + native Modified: trunk/src/site/rst/import-export.rst =================================================================== --- trunk/src/site/rst/import-export.rst 2012-08-09 09:47:55 UTC (rev 377) +++ trunk/src/site/rst/import-export.rst 2012-08-09 09:48:59 UTC (rev 378) @@ -203,19 +203,19 @@ - REGION : Code de la région - * route.flight.campaign.region.code + * campaign.region.code - CAMPAIGN : Code de la campagne - * route.flight.campaign.code + * campaign.code -- SECTOR* : Numéro du secteur +- SECTOR* : Numéro du secteur (N) * route.transectFlight.transect.strate.sector.sectorNumber - STRATE_TYPE* : Type de strate - * route.transectFlight.transect.strate.strateType + * route.transectFlight.transect.strate.strateType.code - STRATE* : Code de la strate @@ -225,11 +225,11 @@ * route.transectFlight.transect.name -- PASSAGE* : Numéro de passage +- PASSAGE* : Numéro de passage (N) * route.transectFlight.crossingNumber -- FLIGHT : Numéro de vol +- FLIGHT : Numéro de vol (N) * route.flight.flightNumber @@ -239,7 +239,7 @@ - ROUTE_TYPE : Type de parcours (LEG, TRANSIT, CIRCLE_BACK) - * route.routeType + * route.routeType.name - EFFORT_GROUP* : Identifiant du group d'effort @@ -250,15 +250,13 @@ * "L" + route.effortNumber + "-" + route.flight.flightNumber + "-" + route.flight.systemId +- STATUS* : LegStatus.name (BEGIN, ADD, END) - -- STATUS* : Status (BEGIN, ADD, END) - * si route.routeType = TRANSIT ou CIRCLE_BACK => ajout d'une ligne END (ensuite currentLegGroup = null) * si previousRoute.routeType = TRANSIT ou CIRCLE_BACK (ou currentLegGroup = null) => BEGIN * si previousRoute.routeType = LEG et nextRoute.routeType = LEG (ou currentLegGroup != null) => ADD -- DATE : Date du parcours/segment +- DATE : Date du parcours/segment (D) * route.beginTime @@ -266,19 +264,19 @@ * format(route.beginTime, "HHmmss") -- SEA_STATE : Etat de la mer +- SEA_STATE : Etat de la mer (N) * route.seaState -- SWELL : Houle +- SWELL : Houle (N) * route.swell -- TURBIDITY : Turbidité +- TURBIDITY : Turbidité (N) * route.turbidity -- SKY_GLINT : Transparence +- SKY_GLINT : Transparence (N) * route.skyGlint @@ -290,15 +288,15 @@ * route.glareTo -- GLARE_SEVERITY : Intensité d'éblouissement +- GLARE_SEVERITY : Intensité d'éblouissement (N) * route.glareSeverity -- GLARE_UNDER : +- GLARE_UNDER : (L) * route.glareUnder -- CLOUD_COVER : Couverture nuageuse +- CLOUD_COVER : Couverture nuageuse (N) * route.cloudCover @@ -326,26 +324,23 @@ * route.observerPosition[NAVIGATOR].observer.initials - - - - CB_CAUSE** : Cause du circle-back * "O" + route.circleBackCause.observationNumber + "-" + route.circleBackCause.flight.flightNumber + "-" + route.circleBackCause.flight.systemId -- LAT : Latitude du point GPS +- LAT : Latitude du point GPS (N) * geoPoint.latitude -- LON : Longitude du point GPS +- LON : Longitude du point GPS (N) * geoPoint.longitude -- SPEED : Vitesse de l'avion à ce point GPS +- SPEED : Vitesse de l'avion à ce point GPS (N) * geoPoint.speed -- ALTITUDE : Altitude de l'avion à ce point GPS +- ALTITUDE : Altitude de l'avion à ce point GPS (N) * geoPoint.altitude @@ -387,7 +382,7 @@ * observation.flight.campaign.code -- SECTOR* : Numéro du secteur +- SECTOR* : Numéro du secteur (N) * route.transectFlight.transect.strate.sector.sectorNumber @@ -403,11 +398,11 @@ * route.transectFlight.transect.name -- PASSAGE* : Numéro de passage +- PASSAGE* : Numéro de passage (N) * route.transectFlight.crossingNumber -- FLIGHT : Numéro de vol +- FLIGHT : Numéro de vol (N) * route.flight.flightNumber @@ -417,7 +412,7 @@ - ROUTE_TYPE : Type de parcours (LEG, TRANSIT, CIRCLE_BACK) - * route.routeType + * route.routeType.name - EFFORT_GROUP* : Identifiant du group d'effort @@ -432,7 +427,7 @@ * "O" + observation.observationNumber + "-" + observation.flight.flightNumber + "-" + observation.flight.systemId -- DATE : Date de l'observation +- DATE : Date de l'observation (D) * observation.beginTime @@ -464,7 +459,7 @@ * observation.species.latinName -- POD_SIZE : Taille des groupes +- POD_SIZE : Taille des groupes (N) * observation.podSize @@ -472,7 +467,7 @@ * observation.age -- DEC_ANGLE : Angle ou Bande +- DEC_ANGLE : Angle ou Bande (N) * observation.decAngle @@ -484,7 +479,7 @@ * observation.behaviour -- SWIM_DIR : Direction de nage +- SWIM_DIR : Direction de nage (N) * observation.swimDir @@ -502,32 +497,29 @@ - SIDE : Position de l'observateur (L : LEFT, R : RIGHT, C : CENTER) - * observation.observerPosition.observer.position + * observation.observerPosition.observer.position.name - STATUS : Status de l'observation (NEW, CIRCLE_BACK, RECAPTURE, NO_RECAPTURE) - * observation.observationStatus + * observation.observationStatus.name - - - - CB_CAUSE** : Cause du circle-back * "O" + route.circleBackCause.observationNumber + "-" + route.circleBackCause.flight.flightNumber + "-" + route.circleBackCause.flight.systemId -- LAT : Latitude du point GPS +- LAT : Latitude du point GPS (N) * geoPoint.latitude -- LON : Longitude du point GPS +- LON : Longitude du point GPS (N) * geoPoint.longitude -- SPEED : Vitesse de l'avion à ce point GPS +- SPEED : Vitesse de l'avion à ce point GPS (N) * geoPoint.speed -- ALTITUDE : Altitude de l'avion à ce point GPS +- ALTITUDE : Altitude de l'avion à ce point GPS (N) * geoPoint.altitude