Что не так с этим GeoTools FeatureId? - PullRequest
2 голосов
/ 13 мая 2011

Используя плагин GeoTools WFS-T, я создал новую строку, и после коммита у меня есть FeatureId, который .getId () возвращает некрасивую строку, которая выглядит примерно так:

newmy_database:my_table.9223372036854775807

Помимо того, что слово «new» в начале «my_database» является сюрпризом, число никоим образом не отражает первичный ключ новой строки (в данном случае «23»). Справедливо, я подумал, что это может быть какая-то внутренняя система нумерации. Однако теперь я хочу, чтобы внешний ключ в другой таблице получил первичный ключ новой строки в этой таблице, и я не уверен, как получить значение из этого FID. В некоторых местах предлагается использовать FID в запросе, подобном следующему:

Filter filter = filterFactory.id(Collections.singleton(fid));
Query query = new Query(tableName, filter);
SimpleFeatureCollection features = simpleFeatureSource.getFeatures(query);

Но это не удаётся при разборе FID, на подчеркивании всех мест! Это подчеркивание было при создании строки (мне пришлось передать «my_database: my_table» в качестве таблицы для добавления строки).

Я уверен, что либо с идентификатором что-то не так, либо я каким-то образом неправильно его использую. Кто-нибудь может пролить свет?

1 Ответ

2 голосов
/ 25 мая 2011

Похоже, что пара вещей идет не так, и, возможно, нужен отчет об ошибке.

FeatureId с "new" в начале является временным идентификатором; после замены необходимо заменить реальным результатом.

Есть несколько способов узнать об этом:

1) Вы можете прослушать BatchFeatureEvent; это предлагает информацию о "временном идентификаторе" -> "идентификатор wfs"

2) Внутренне эта информация анализируется из результата транзакции, возвращенного из вашей WFS. Результат сохраняется в WFSTransactionState для доступа к нему. Это было до изобретения BatchFeatureEvent.

Transaction transaction = new transaction("insert");
try {
     SimpleFeatureStore featureStore =
           (SimpleFeatureStore) wfs.getFeatureSource( typeName );
     featureStore.setTransaction( transaction );
     featureStore.addFeatures( DataUtilities.collection( feature ) );

     transaction.commit();

     // get the final feature id
     WFSTransactionState wfsts = (WFSTransactionState) transaction.getState(wfs);

     // In this example there is only one fid. Get it.
     String result = wfsts.getFids( typeName )[0];
}
finally {
     transaction.close();
}         

Я обновил документацию с приведенным выше примером:

...