trovare case in un raggio


10

Durante un'intervista mi è stato chiesto quanto segue: Un'applicazione immobiliare che elenca tutte le case che sono attualmente sul mercato (cioè, in vendita) a una determinata distanza (diciamo ad esempio che l'utente vuole trovare tutte le case entro 20 miglia), come progetteresti la tua applicazione (sia la struttura dei dati che l'alogiritmo) per creare questo tipo di servizio?

Qualche idea? Come lo implementeresti? Gli ho detto che non sapevo perché non avevo mai fatto cose geo-correlate prima.

Risposte:


6

Probabilmente sono dopo una risposta che menziona l'indicizzazione spaziale , molto probabilmente selezionando un database che fornisce immediatamente l'indicizzazione spaziale , ma potresti anche ottenere alcuni punti menzionando che può essere implementato nell'applicazione stessa se necessario, ad esempio implementando una R -Tree (potrebbe essere utile se la selezione del DB è stata risolta per altri motivi? Ma dimostra anche che sai come funzionano i database spaziali). L'indicizzazione spaziale ti consentirà di ottenere rapidamente un sottoinsieme di posizioni che si adattano all'interno di una casella di ricerca, puoi perfezionarlo ulteriormente calcolando la distanza effettiva (se necessario, il rettangolo da solo può essere abbastanza buono ovviamente) per ognuno per dare una vera ricerca cerchio / ellisse

Dato che le distanze sono probabilmente 20 M o meno, probabilmente stai bene supponendo una terra piatta per calcolare la distanza anche se inizierai a vedere errori evidenti verso la fine dei 20 M, se sono necessari intervalli molto più ampi con precisione, dovresti anche iniziare a guardare modelli di distanza migliori per il globo, ad es. Haversine distance

ci sono ovviamente anche una miriade di altri dettagli che potrebbero essere discussi, ad es. progettazione dell'interfaccia utente, schema DB, che potrebbero essere argomenti interi a sé stanti


A 20 miglia, gli errori dovuti a un modello di terra piatta saranno trascurabili. Ad ogni modo, quando un utente vuole vedere un elenco di case entro 20 miglia dal suo ufficio, non gli importa se una casa che si trova a 20 miglia e 10 metri di distanza è inclusa nei risultati.
Kevin Cline,

1
anzi, e se alcuni falsi positivi non sono importanti, puoi anche saltare del tutto il calcolo della distanza effettiva e restituire semplicemente l'MBR
jk.

Una cosa di cui sono curioso: dato il vasto numero di case in vendita, le aziende (come Zillo forse?) Memorizzano tutto in un db e continuano a scegliere da esso? Immagino che sarebbe un enorme successo in termini di prestazioni e sarebbe molto più veloce archiviare tutto in memoria con una rappresentazione grafica - forse una matrice o un elenco di adiacenza e usare algoritmi a distanza per trovare le case più vicine. Cosa ne pensi?
Paul Smith

@paulsmith Non lo so, ma sospetto fortemente che si trovi in ​​un DB spaziale, un DB spaziale probabilmente utilizzerà comunque una rappresentazione grafica internamente (molto probabilmente un R-Tree come discusso, ma ci sono altre opzioni) la chiave è in grado di selezionare solo gli elementi in un rettangolo di delimitazione minimo in primo luogo
jk.

8

Ogni volta che ti trovi di fronte a una domanda come questa e semplicemente non hai esperienza nel settore problematico, è bene fare un paio di cose.

Per prima cosa ammetti che non hai competenze specifiche in questo dominio problematico.

In secondo luogo , spiega come risolvere il problema.

Anche se non ho esperienza specifica quando lavoro con la ricerca geografica, sono sicuro che ci sono algoritmi ben documentati e tecnologie esistenti per risolvere il problema. Esplorerei questi per acquisire la conoscenza delle soluzioni comuni che sono disponibili per me e fare una scelta sull'implementazione in base ai requisiti del progetto.

In terzo luogo , ridurre sempre i problemi come questo fino ai loro componenti di base. Sai che le posizioni su una mappa sono distribuite in 2 dimensioni. Sai che se ti vengono date coordinate x arbitrarie, la distanza y da ciascuna coordinata da un'altra coordinata viene calcolata formando un triangolo e risolvendo per la lunghezza sconosciuta. Spero anche tu sappia che se ti viene chiesto di trovare tutte le coordinate all'interno di un riquadro di delimitazione, puoi farlo semplicemente calcolando le estensioni del riquadro che vuoi trovare e usando semplicemente maggiore di, minore della logica lungo entrambi gli assi.

Infine , non ho mai assunto uno sviluppatore che sembrava rinunciare a domande. Se faccio una domanda e la persona dice "Non lo so" e non tenta nemmeno di pensarci verbalmente, mi dà l'impressione che non contribuiranno alle sessioni di brainstorming - che è fondamentale per le organizzazioni che scrivono software .


tutti buoni consigli
jk.

@Ben, sono assolutamente d'accordo con tutte le cose che hai menzionato, tuttavia perché l'intervistatore ha detto esplicitamente prima dell'inizio della sessione che va bene dire che non lo sai, ho appena seguito le sue istruzioni e gli ho detto in anticipo che non lo sapevo: )
Paul Smith

4

Questo è probabilmente ovvio, ma per molte applicazioni la soluzione lenta del povero potrebbe andare bene.

Avere una tabella in un database relazionale che memorizza latitudine e longitudine. Interroga per tutte le località che hanno una latitudine entro 20 miglia e una longitudine entro 20 miglia. Questo ti dà un rettangolo di delimitazione delle dimensioni del rettangolo di delimitazione più piccolo che contiene il raggio che vuoi veramente cercare (e ignora anche la curvatura della terra).

Quindi prendi il set che viene restituito (da una query utilizzando gli indici) e filtralo utilizzando un calcolo accurato della distanza.

Quindi, prestazioni non efficienti, ma molto efficienti in tempo per lo sviluppo. Per molte applicazioni potrebbe essere una scelta migliore.


2

Probabilmente il modo più semplice è utilizzare un quadrifoglio per memorizzare le posizioni delle case, assumendo distribuito in un paesaggio 2D. La ricerca dovrebbe essere abbastanza semplice.

Se stai utilizzando un RDBMS abilitato per GIS per archiviare i tuoi contenuti, non devi preoccuparti di questo. Vedi questa domanda per alcune informazioni sulle prestazioni dei protagonisti.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.