2011-05-12 2 views
2

Utilisation du plug-in WFS-T GeoTools, j'ai créé une nouvelle ligne, et après une livraison, j'ai un FeatureId Whos .getId() retourne une chaîne laide qui ressemble à quelque chose comme ceci:Qu'est-ce qui ne va pas avec cet FeatureId de GeoTools?

newmy_database:my_table.9223372036854775807 

Mis à part le fait que le mot "new" au début de "my_database" soit une surprise, le nombre ne reflète en aucun cas la clé primaire de la nouvelle ligne (qui dans ce cas est "23"). Assez juste, j'ai pensé que ceci pourrait être un système interne de numérotation. Cependant, maintenant je veux une clef étrangère dans une autre table pour obtenir la clé primaire de la nouvelle rangée dans celle-ci, et je ne suis pas sûr comment obtenir la valeur de ce FID. Certains endroits donnent à penser que vous pouvez utiliser un dans une requête FID comme ceci:

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

Mais cela ne fonctionne pas à l'analyse de la FID, au trait de soulignement de tous les lieux! Ce trait de soulignement était là quand la ligne a été créée (je devais passer "my_database: my_table" comme table pour ajouter la ligne à).

Je suis sûr que soit il y a quelque chose de mal avec l'ID, ou je l'utilise de manière incorrecte d'une manière ou d'une autre. Quelqu'un peut-il nous éclairer?

+0

où est GeoTools plug-in WFS-T? un lien –

+0

Cette question a été postée il y a quatre ans. Je ne travaille plus avec GeoTools et je ne l'ai pas fait depuis longtemps. Si vous ne pouvez pas le trouver sur google, alors peut-être qu'il n'existe plus. – AlbeyAmakiir

Répondre

2

Il semble que deux choses se passent mal - et qu'un rapport de bogue est peut-être nécessaire.

Le FeatureId avec "nouveau" au début est un identifiant temporaire; cela devrait être remplacé par le résultat réel une fois que le commit a été appelé.

Il y a un certain nombre de façon d'être au courant de ceci:

1) Vous pouvez écouter un BatchFeatureEvent; cela offre les informations sur "temp id" -> "wfs id"

2) En interne cette information est analysée à partir du résultat de la transaction retourné à partir de votre WFS. Le résultat est enregistré dans WFSTransactionState pour que vous puissiez y accéder. C'était avant que BatchFeatureEvent ait été inventé.

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(); 
}   

J'ai mis à jour la documentation avec l'exemple ci-dessus: