使用GeoTools WFS-T插件,我创建了一个新行,提交后,我有了一个FeatureId whos .getId()返回一个看起来像这样的丑陋字符串:
newmy_database:my_table.9223372036854775807
除了“ my_database”开头的单词“ new”令人惊讶之外,该数字也没有反映新行的主键(在本例中为“ 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”作为要添加行的表通过)。
我确定id出了点问题,或者我以某种方式不正确地使用了它。谁能阐明任何想法?
最佳答案
似乎有几处问题出在哪里-可能需要一个错误报告。
开头为“ new”的FeatureId是一个临时ID。一旦调用了提交,应将其替换为实际结果。
有很多方法可以了解这一点:
1)您可以监听BatchFeatureEvent;这提供了有关“临时ID”->“ WFS ID”的信息
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();
}
我已使用上述示例更新了文档:
http://docs.geotools.org/latest/userguide/library/data/wfs.html