2014-05-15 4 views
0

En ce moment j'ai une table dans la base de données Oracle 10g avec les colonnes LAT(FLOAT) et LNG(FLOAT).Interrogez-vous sur la distance entre deux objets sans utiliser la fonctionnalité Oracle Spatial?

La tâche consiste à trouver toutes les entrées dans une distance spécifique (rayon) d'un point donné (centre). L'application elle-même est en Java, Hibernate est utilisée comme implémentation JPA. Après quelques recherches, j'ai trouvé que Oracle Spatial doit être utilisé. Cependant, il n'existe aucun moyen de convertir mes colonnes en SDO_GEOMETRY, donc je ne suis pas en mesure d'utiliser la fonction SDO_WITHIN_DISTANCE d'Oracle.

Existe-t-il une solution de contournement pour implémenter une telle fonctionnalité?

Actuellement, je suis juste Interrogation toutes les entrées et itérer sur eux avec la formule Haversine - et cela deviendra goulot d'étranglement très bientôt :-)

Merci pour votre aide!

+0

Vous pouvez toujours mettre en œuvre Haversine alghorithm –

+0

@JakubKania Merci pour votre réponse! J'utilise actuellement l'algorithme de Haversine, mais ce n'est pas assez précis - j'ai besoin de vérifier les distances (500 -> 5000) et il ne fournit pas de résultats précis. – user1772574

+2

Vous ne pouvez pas convertir directement les colonnes, mais vous ne pouvez pas la table pour inclure une nouvelle colonne de type spatial et le calculer à partir des valeurs dans Lat et Lng ??? –

Répondre

0

Si vous ne pouvez pas modifier les colonnes de la table cible, vous pouvez utiliser un déclencheur pour matérialiser les données dans une table distincte en tant que sdo_geometry, utiliser sdo_within_distance, puis joindre les lignes à votre table d'origine.

+0

Eh bien, semble être le déclencheur était la solution la plus "élégante" pour ce cas. Merci @Ben! – user1772574

1

L'utilisation de données spatiales existantes codées dans les colonnes X et Y sans introduction de colonnes supplémentaires est simple: il suffit d'utiliser un index basé sur une fonction. Cela signifie qu'il n'y a pas de changement sur les tables existantes: il suffit d'ajouter une fonction et l'index basé sur la fonction avec éventuellement une vue pour rendre tout plus transparent.

Voir la réponse complète here

Questions connexes