2009-09-15 9 views
9

Sto lavorando su un'applicazione in cui uno dei requisiti è che io sia in grado di eseguire in tempo reale invertire le operazioni basate su dati GPS geocoding. In particolare, devo essere in grado di determinare lo stato/provincia in cui una coppia di latitudine, longitudine mappa e rilevare quando ci siamo trasferiti da uno stato/una provincia a un'altra.Reverse Geocoding Senza Web Access

Ho un paio di idee finora, ma si chiese se qualcuno avesse qualche idea su uno dei seguenti:

  • Qual è l'approccio migliore per affrontare questo problema in modo efficiente?
  • Dove è un buon posto per trovare e qual è il formato appropriato per Nord confini dello stato/provincia americana

Come antipasto, ecco i due idee principali che ho:

  1. rottura del Nord America in una griglia con ciascun rettangolo nella mappatura della griglia a una particolare provincia di stato. Fai una ricerca su questo tavolo (che cresce rapidamente e più precisi vorresti essere) in base alla latitudine e poi alla longitudine (o viceversa).
  2. Definire poligoni per ciascuno degli stati e fare qualche tipo di calcolo per determinare in quale poligono di latitudine/longitudine coppia giace. Non sono sicuro di come andare esattamente su questo. Le mappe di immagini HTML vengono in mente come un modo per definire i limiti di uno stato/provincia.

Sto lavorando in python per gli interessati o quelli che potrebbero avere una bella libreria che vorrebbero suggerire.

Per essere chiari ... non ho accesso al Web a mia disposizione, in modo da utilizzare un servizio di geocodifica inversa esistente non è un'opzione in fase di esecuzione

+0

Mi piacerebbe saperne di più su come hai risolto questo. Dove hai finito per ottenere i dati di confine? – radven

risposta

6

Io suggerisco di usare una variante della vostra prima idea: utilizzare un spatial index. Un indice spaziale è una struttura di dati creata da rettangoli, che mappano lat/long al payload. In questo caso probabilmente mapperai i rettangoli alle coppie provinciali. Un R-tree potrebbe essere una buona opzione. Ecco uno R-tree python package. È possibile rilevare il roaming confrontando i risultati di ricerche consecutive.

+0

Anche se non ero in grado di utilizzare il progetto python r-tree per la mia implementazione ho usato alcune delle idee dietro l'albero r in cui ho costruito un semplice indice spaziale usando rettangoli di delimitazione per ciascuno degli stati. Dopo aver determinato quali caselle di delimitazione il punto si trovava in ho usato un test point-in-poligono per capire il resto ... funziona alla grande! –

+0

Felice di sentirlo. Ho frainteso che anche tu avevi bisogno di questa ricerca per le contee - per le quali un algoritmo simile dovrebbe funzionare, ha solo bisogno di molti più dati. In ogni caso, avere un roaming felice. –

0

Ho un database con tutti questi dati e un po ' strumenti di accesso. Ho fatto il mio dai dati della tigre del censimento. Immagino che sarebbe fondamentalmente un'esportazione del mio database in sqlite e un po 'di traduzione del codice.

+0

Puoi condividere il db? In che formato è? – Moshe

+0

@Mosche Ne ho uno qui da qualche parte in formato sqlite. Mandami una mail e vedrò cosa posso fare. – Dustin

4

vorrei stare lontano da implementare la propria soluzione da zero. Questa è un'impresa piuttosto grande e ci sono già strumenti per farlo. Se stai cercando un approccio open source (leggi: gratuito), dai un'occhiata a questo post del blog: Using PostGIS to Reverse Geocode.

+0

Ottima idea! Questo potrebbe essere il modo migliore per risolvere questo tipo di problema sul desktop. Senza preavviso, e avrei dovuto dirlo, sto lavorando su una piattaforma embedded che non ha il supporto per Postgres (e non può essere facilmente trasferita in quanto non è linux embedded, sebbene sia basata su posix). Un derivato di Digi connectport è la piattaforma: http://www.digi.com/products/wirelessdropinnetworking/idigi-kits/x4-zb.jsp –

1

Se è possibile ottenere i limiti di stato come poligoni (ad esempio, tramite OpenStreetMap), determinare lo stato corrente è solo un test point-in-poligono.

Se sono necessari i dati dell'indirizzo, una soluzione offline potrebbe utilizzare Microsoft Mappoint.

1

è possibile ottenere i dati per l'intero Stati Uniti da open street map È quindi possibile estrarre i dati necessari, come città o stato in luoghi che cosa mai formato che funziona meglio per la vostra applicazione. Nota anche se la qualità dei dati è buona, non è garantito che sia completamente accurata, quindi se hai bisogno di precisione completa potresti dover cercare altrove.

4

ho creato un modulo di geocodifica inversa non in linea per i paesi: https://bitbucket.org/richardpenman/reverse_geocode

>>> import reverse_geocode 
>>> coordinates = (-37.81, 144.96), (31.76, 35.21) 
>>> reverse_geocode.search(coordinates) 
[{'city': 'Melbourne', 'code': 'AU', 'country': 'Australia'}, 
{'city': 'Jerusalem', 'code': 'IL', 'country': 'Israel'}] 

Vedrò se posso aggiungere i dati per gli stati.

+1

Grazie a hoju, lo strumento è davvero sorprendente. E l'ho cacciato per anni! – zfz

+0

Sono contento che sia stato utile per altre persone - Avevo bisogno di questo per i miei progetti – hoju

+0

Ciao, questo sembra incredibile. Io non sono Python Dev me stesso ma a volte includo script Python all'interno del mio Node.js. Potresti dirmi quale versione di Python si aspetta il tuo script? – Kunok