шейп-файл не сохраняет часть времени в атрибуте даты - PullRequest
0 голосов
/ 28 февраля 2019

Я хочу сохранить дату и время в шейп-файле, но атрибут даты сохраняет только часть даты.Например, я добавил «Чт 28 февраля 100 * * 01: 20: 00 EST 2019» в атрибут даты, но когда я распечатал его из созданной мной функции, я получил «Чт 28 февраля 00: 00: 00 EST 2019 ".
Руководство пользователя шейп-файла здесь , и в нем говорится, что он поддерживает «интерпретацию даты и времени с указанием даты и времени».
Кстати, я работаю с FIRMS data , и обнаружил, что это сохраняет дату и время в двух полях, они действительно так могут из-за этой проблемы.Если это ошибка, могут ли разработчики геоинструментов исправить ее, пожалуйста?

1 Ответ

0 голосов
/ 02 марта 2019

Технически хранит время вне спецификации dbf3, на которой построены шейп-файлы.В идеале вы должны переключиться на лучший формат файла, такой как геопакет .Но вы можете включить поведение из спецификации , установив свойство org.geotools.shapefile.datetime (либо в вашей программе, либо в качестве системного параметра).Я открыл ошибку документации , так как, похоже, об этом параметре почти ничего не говорится, кроме как в старом сообщении списка рассылки .

Этот код демонстрируеткак это использовать:

File out = new File("date.shp");
out.createNewFile();
FileDataStore ds = FileDataStoreFinder.getDataStore(out);
SimpleFeatureTypeBuilder typeBuilder = new SimpleFeatureTypeBuilder();
typeBuilder.setName("test");
typeBuilder.add("the_geom", Point.class);
typeBuilder.setCRS(DefaultGeographicCRS.WGS84);
typeBuilder.setDefaultGeometry("the_geom");
typeBuilder.add("date", Date.class);
typeBuilder.add("timestamp", Calendar.class);
SimpleFeatureType schema = typeBuilder.buildFeatureType();

ds.createSchema(schema);

SimpleFeatureStore featureStore = (SimpleFeatureStore) ds.getFeatureSource();
System.setProperty("org.geotools.shapefile.datetime", "true");
GeometryFactory gf = new GeometryFactory();
SimpleFeatureBuilder builder = new SimpleFeatureBuilder(schema);
builder.set("date", new Date());
builder.set("timestamp", Calendar.getInstance());
builder.set("the_geom", gf.createPoint(new Coordinate(0, 0)));
SimpleFeature f = builder.buildFeature(null);
System.out.println(f);

featureStore.addFeatures(DataUtilities.collection(f));
ds.dispose();

FileDataStore in = FileDataStoreFinder.getDataStore(out);

  System.out.println(in.getFeatureReader().next());

Без установленного свойства выдает:

SimpleFeatureImpl:test=[SimpleFeatureImpl.Attribute: the_geom<the_geom id=fid--4318b68d_1693e3b2f4e_-8000>=POINT (0 0), SimpleFeatureImpl.Attribute: date<date id=fid--4318b68d_1693e3b2f4e_-8000>=Sat Mar 02 11:47:39 GMT 2019, SimpleFeatureImpl.Attribute: timestamp<timestamp id=fid--4318b68d_1693e3b2f4e_-8000>=java.util.GregorianCalendar[time=1551527259980,areFieldsSet=true,areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id="Europe/London",offset=0,dstSavings=3600000,useDaylight=true,transitions=242,lastRule=java.util.SimpleTimeZone[id=Europe/London,offset=0,dstSavings=3600000,useDaylight=true,startYear=0,startMode=2,startMonth=2,startDay=-1,startDayOfWeek=1,startTime=3600000,startTimeMode=2,endMode=2,endMonth=9,endDay=-1,endDayOfWeek=1,endTime=3600000,endTimeMode=2]],firstDayOfWeek=2,minimalDaysInFirstWeek=4,ERA=1,YEAR=2019,MONTH=2,WEEK_OF_YEAR=9,WEEK_OF_MONTH=0,DAY_OF_MONTH=2,DAY_OF_YEAR=61,DAY_OF_WEEK=7,DAY_OF_WEEK_IN_MONTH=1,AM_PM=0,HOUR=11,HOUR_OF_DAY=11,MINUTE=47,SECOND=39,MILLISECOND=980,ZONE_OFFSET=0,DST_OFFSET=0]]
SimpleFeatureImpl:date=[SimpleFeatureImpl.Attribute: the_geom<Point id=date.1>=POINT (0 0), SimpleFeatureImpl.Attribute: date<date id=date.1>=Sat Mar 02 00:00:00 GMT 2019, SimpleFeatureImpl.Attribute: timestamp<timestamp id=date.1>=Sat Mar 02 00:00:00 GMT 2019]

и с ним вы получаете:

SimpleFeatureImpl:test=[SimpleFeatureImpl.Attribute: the_geom<the_geom id=fid--6d9c8770_1693e3c0660_-8000>=POINT (0 0), SimpleFeatureImpl.Attribute: date<date id=fid--6d9c8770_1693e3c0660_-8000>=Sat Mar 02 11:48:35 GMT 2019, SimpleFeatureImpl.Attribute: timestamp<timestamp id=fid--6d9c8770_1693e3c0660_-8000>=java.util.GregorianCalendar[time=1551527315038,areFieldsSet=true,areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id="Europe/London",offset=0,dstSavings=3600000,useDaylight=true,transitions=242,lastRule=java.util.SimpleTimeZone[id=Europe/London,offset=0,dstSavings=3600000,useDaylight=true,startYear=0,startMode=2,startMonth=2,startDay=-1,startDayOfWeek=1,startTime=3600000,startTimeMode=2,endMode=2,endMonth=9,endDay=-1,endDayOfWeek=1,endTime=3600000,endTimeMode=2]],firstDayOfWeek=2,minimalDaysInFirstWeek=4,ERA=1,YEAR=2019,MONTH=2,WEEK_OF_YEAR=9,WEEK_OF_MONTH=0,DAY_OF_MONTH=2,DAY_OF_YEAR=61,DAY_OF_WEEK=7,DAY_OF_WEEK_IN_MONTH=1,AM_PM=0,HOUR=11,HOUR_OF_DAY=11,MINUTE=48,SECOND=35,MILLISECOND=38,ZONE_OFFSET=0,DST_OFFSET=0]]
SimpleFeatureImpl:date=[SimpleFeatureImpl.Attribute: the_geom<Point id=date.1>=POINT (0 0), SimpleFeatureImpl.Attribute: date<date id=date.1>=2019-03-02 11:48:35.038, SimpleFeatureImpl.Attribute: timestamp<timestamp id=date.1>=2019-03-02 11:48:35.038]
...