Qual è il modo migliore per leggere, rappresentare e rendere i dati della mappa?

Sono interessato a scrivere un’applicazione di navigazione semplicistica come un progetto per animali domestici. Dopo aver cercato informazioni cartografiche gratuite, mi sono stabilito sui dati della mappa TIGRE 2007 Line / Shapefile di US Census Bureau . I dati sono suddivisi in file zip per singole contee e ho scaricato una singola mappa delle contee per la mia zona.

Quale sarebbe il modo migliore per leggere i dati di questa mappa in un formato utilizzabile?

Come dovrei:

  • Leggi in questi file
  • Analizzali – Espressione regolare o qualche libreria che può già analizzare questi Shapefile?
  • Carica i dati nella mia applicazione – Dovrei caricare i punti direttamente in qualche datastructure in memoria? Utilizzare un piccolo database? Non ho bisogno di persistenza una volta chiusa l’applicazione dei dati della mappa. L’utente può caricare nuovamente lo Shapefile.

Quale sarebbe il modo migliore per eseguire il rendering della mappa dopo aver letto i dati di Shapefile?

Idealmente mi piacerebbe essere in grado di leggere uno shapefile di dati mappa contee e renderizzare tutte le polilinee sullo schermo e consentire la rotazione e il ridimensionamento.

    Come dovrei:

    • Convertire i punti lat / lon nelle coordinate dello schermo? – Per quanto ne so, lo Shapefile usa longitudine e latitudine per i suoi punti. Quindi ovviamente dovrò convertirli in qualche modo in coordinate dello schermo per mostrare le caratteristiche della mappa.
    • Renderizza i dati della mappa (una serie di polilinee per strade, confini, ecc.) In modo da poter ruotare e scalare facilmente l’intera mappa?
    • Renderizza la mia intera mappa come una serie di “tessere” in modo che vengano visualizzate solo le caratteristiche / linee all’interno dell’area di visualizzazione?

    Ex. dei dati TIGER visualizzati come mappa di visualizzazione:
    alt text http://sofit.miximages.com/maps/ngosjl.png

    Chiunque abbia una certa esperienza e conoscenza di quale sia il modo migliore di leggere in questi file, come dovrei rappresentarli (database, nella memoria dati) nel mio programma e come dovrei renderizzare (con rotazione / ridimensionamento) i dati della mappa sullo schermo sarebbe apprezzato.

    EDIT: Per chiarire, non voglio utilizzare alcuna API di Google o Yahoo per le mappe. Allo stesso modo, non voglio usare OpenStreetMap. Sto cercando un approccio più da zero rispetto all’utilizzo di tali apis / programmi. Questa sarà un’applicazione desktop .

    Innanzitutto, ti consiglio di utilizzare i file TIGER 2008 .

    Secondo, come altri sottolineano, ci sono molti progetti là fuori che già leggono, interpretano, convertono e usano i dati. Costruire il proprio parser per questi dati è quasi banale, quindi, non c’è motivo di passare attraverso il codice di un altro progetto e cercare di estrarre ciò che serve a meno che non si preveda di utilizzare il loro progetto nel suo complesso.

    Se vuoi iniziare dal livello più basso

    parsing

    Costruire il proprio parser TIGER (ragionevolmente facile – solo un DB di segmenti di linea), e build un semplice rendering su di esso (linee, poligoni, lettere / nomi) sarà anche abbastanza facile. Dovrai esaminare vari tipi di proiezione di mappe per la fase di rendering. Il più usato (e quindi più familiare per gli utenti) è la proiezione di Mercator : è abbastanza semplice e veloce. Potresti voler giocare con il supporto di altre proiezioni.

    Ciò fornirà un po ‘di’ divertimento ‘in termini di vedere come proiettare una mappa e come invertire tale proiezione (ad esempio un utente fa clic sulla mappa, si desidera vedere la lat / lon su cui hanno fatto clic) richiede di invertire la proiezione corrente equazione).

    Rendering

    Quando ho sviluppato il mio renderer ho deciso di basare la mia finestra su una dimensione fissa (dispositivo incorporato) e un ingrandimento fisso. Ciò significava che potevo centrare la mappa a lat / lon, e con il pixel centrale = centro lat / lon ad un dato ingrandimento, e data la proiezione di mercatore potevo calcolare quale pixel rappresentava ogni lat / lon, e viceversa.

    Alcuni programmi invece permettono alla finestra di variare, e invece di usare l’ingrandimento e un punto fisso, usano due punti fissi (spesso gli angoli in alto a sinistra e in basso a destra di un rettangolo che definisce la finestra). In questo caso diventa banale determinare il trasferimento da pixel a lat / lon – sono solo alcuni calcoli di interpolazione. Rotazione e ridimensionamento rendono questa funzione di trasferimento un po ‘più complessa, ma non dovrebbe essere considerevole, è pur sempre una finestra rettangular con interpolazione, ma gli angoli delle windows non devono necessariamente avere un orientamento particolare rispetto al nord. Ciò aggiunge alcuni casi d’angolo (è ansible trasformare la mappa verso l’esterno e visualizzarla come se provenisse dall’interno della terra, ad esempio) ma questi non sono onerosi e possono essere affrontati mentre ci si lavora.

    Una volta completato il trasferimento da lat / lon a pixel, il rendering di linee e poligoni è abbastanza semplice, tranne che per problemi grafici normali (come bordi di linee o poligoni che si sovrappongono in modo inappropriato, anti-aliasing, ecc.). Ma rendere una brutta mappa di base come quella di molti riproduttori open source è abbastanza semplice.

    Sarai anche in grado di giocare con calcoli di distanza e di grande cerchio – ad esempio una buona regola empirica è che ogni grado di latitudine o lon all’equatore è di circa 111.1KM – ma uno cambia man mano che ci si avvicina ad entrambi i poli, mentre l’altro continua a rimanere a 111.1kM.

    Stoccaggio e strutture

    Il modo in cui memorizzi e fai riferimento ai dati, tuttavia, dipende molto da ciò che pensi di fare con esso. Un sacco di problemi difficili sorgono se si desidera utilizzare la stessa struttura di database per i dati demografici o il routing: una data base di dati e l’indicizzazione saranno veloci per uno e lenti per l’altro.

    L’utilizzo dei codici di avviamento postale e il caricamento dei soli codici di avviamento nelle vicinanze funzionano solo per piccoli progetti di rendering delle mappe, ma se hai bisogno di un percorso in tutto il paese devi disporre di una struttura diversa. Alcune implementazioni hanno database “sovrapposti” che contengono solo strade principali e percorsi di snap alla sovrapposizione (o attraverso più sovrapposizioni: locale, metropolitana, contea, stato, paese). Ciò si traduce in un instradamento veloce, ma a volte inefficiente.

    Rivestimenti

    Affiancare la tua mappa non è in realtà facile. A ingrandimenti inferiori puoi visualizzare un’intera mappa e ridurla. A ingrandimenti più alti non è ansible rendere l’intera cosa in una volta (a causa di limiti di memoria / spazio), quindi è necessario suddividerla.

    Tagliare le linee ai bordi delle tessere in modo da rendere i singoli riquadri risultati in risultati non perfetti – spesso ciò che viene fatto è che le linee siano rese oltre il limite delle tessere (o, almeno, i dati della fine della linea vengono mantenuti, anche se il rendering si ferma una volta trova che è caduto dal bordo) – questo riduce l’errore che si verifica quando le linee sembrano non del tutto corrispondenti mentre viaggiano attraverso le tessere.

    Vedrai di cosa sto parlando mentre lavori su questo problema.

    Non è banale trovare i dati che vanno in una tessera data – una linea può avere entrambe le estremità fuori da una tessera, ma attraversare la tessera. Avrai bisogno di consultare libri di grafica su questo ( il libro di Michael Abrash è il riferimento fondamentale , liberamente disponibile ora al link precedente). Mentre parla principalmente di giochi, la finestra, il ritaglio, i bordi dei poligoni, la collisione, ecc. Si applicano qui.

    Tuttavia, potresti voler giocare ad un livello più alto.

    Una volta che hai fatto quanto sopra (adattando un progetto esistente o facendo tu stesso quello sopra) potresti voler giocare con altri scenari e algoritmi.

    Il geocoding inverso è ragionevolmente facile. Inserisci lat / lon (o fai clic sulla mappa) e ottieni l’indirizzo più vicino. Questo ti insegna come interpretare gli indirizzi lungo i segmenti di linea nei dati TIGER.

    La geocodifica di base è un problema difficile. Scrivere un parser di indirizzi è un progetto utile e interessante, e quindi convertirlo in lat / lon usando i dati TIGER è non banale, ma molto divertente. Inizia semplice e piccolo richiedendo il nome esatto e la corrispondenza del formato, quindi inizia a esaminare la corrispondenza “simile” e la corrispondenza fonetica. C’è molta ricerca in questo settore – guarda i progetti dei motori di ricerca per avere qualche aiuto qui.

    Trovare il percorso più breve tra due punti è un problema non banale. Ci sono molti, molti algoritmi per farlo, molti dei quali sono brevettati. Raccomando che se provi questo, procedi con un semplice algoritmo del tuo progetto, quindi fai qualche ricerca e confronta il tuo progetto con lo stato dell’arte. È molto divertente se ti interessa la teoria dei grafi.

    Seguire un percorso e dare istruzioni in modo preventivo non è così facile come sembra il primo rossore. Dato un insieme di istruzioni con una serie associata di coppie lat / lon, “segui” il percorso utilizzando l’input esterno (GPS o GPS simulato) e sviluppa un algoritmo che fornisce all’utente le istruzioni mentre si avvicinano a ogni intersezione reale. Si noti che ci sono più coppie lat / lon rispetto alle istruzioni a causa di strade ricurve, ecc. E sarà necessario rilevare la direzione del viaggio e così via. Un sacco di casi d’angolo che non vedrai finché non proverai a implementarlo.

    Ricerca del punto di interesse. Questo è interessante: devi trovare la posizione corrente e tutti i punti di interesse (non parte di TIGER, crearne di nuovi o ottenere un’altra fonte) entro una certa distanza (in linea d’aria o più difficile – distanza di guida) di l’origine. Questo è interessante in quanto devi convertire il database POI in un formato che è facile da cercare in questa circostanza. Non è ansible prendere il tempo per passare milioni di voci, eseguire il calcolo della distanza (sqrt (x ^ 2 + y ^ 2)) e restituire i risultati. È necessario disporre di un metodo o di un algoritmo per ridurre prima la quantità di dati.

    Commesso viaggiatore Instradamento con più destinazioni. Solo una versione più difficile del routing regolare.

    Qui puoi trovare una serie di link a molti progetti e fonti di informazioni su questo argomento.

    Buona fortuna, e per favore pubblica qualunque cosa tu faccia, non importa quanto rudimentale o brutto, così altri possono trarne beneficio!

    -Adamo

    SharpMap è un motore di mapping .NET 2.0 open-source per WinForms e ASP.NET. Questo potrebbe fornire tutte le funzionalità di cui hai bisogno. Si occupa dei più comuni formati di dati vettoriali e raster GIS inclusi gli shapefile ESRI.

    la soluzione è:

    • un server geospaziale come mapserver, geoserver, degree (opensource).

    Possono leggere e servire shapefile (e molte altre cose). Ad esempio, geoserver (se installato) fornisce i dati degli shapefile TIGER di US Census Bureau come demo

    • una libreria cartografica javascript come gli openlayer (vedere gli esempi al testo del link

    Ci sono molti esempi sul web usando questa soluzione

    Domanda divertente Ecco come lo faccio.

    Raccolgo qualsiasi geometria di cui ho bisogno in qualsiasi formato entrino. Ho raccolto dati da USGS, quindi ammonta a un sacco di:

    • File SHP ( descrizione tecnica di Shapefile ESRI )
    • File DBF ( file dati Xbase (* .dbf) )

    Ho quindi scritto un programma che “compila” quelle definizioni di forma in una forma che è efficiente da rappresentare. Ciò significa fare tutte le proiezioni e le conversioni di formato dei dati che sono necessarie per visualizzare in modo efficiente i dati. Alcuni dettagli:

    • Per un’applicazione 2D, è ansible utilizzare qualsiasi proiezione desiderata: Proiezioni mappa .
    • Per 3D, si desidera convertire quelle latitudine / longitudini in coordinate 3D. Ecco alcuni calcoli su come farlo: trasformazione da coordinate sferiche a normali coordinate rettangolari .
    • Rompi tutti i primitivi in ​​un quadrifoglio / un octree (2D / 3D). I nodes foglia in questo albero contengono riferimenti a tutta la geometria che interseca la casella di delimitazione di quel nodo foglia (allineato all’asse). (Ciò significa che un pezzo di geometria può essere referenziato più di una volta).
    • La geometria viene quindi suddivisa in una tabella di vertici e una tabella di comandi di disegno. Questo è il formato ideale per OpenGL. I comandi possono essere emessi tramite glDrawArrays utilizzando i buffer dei vertici ( oggetti Vertex Buffer ).
    • Un modello di visitatore generale è usato per camminare sul quadrifoglio / albero di Natale. Camminare implica testare se il visitatore interseca i nodes dati dell’albero fino a quando non si incontra un nodo foglia. I visitatori includono: disegno, rilevamento collisioni e selezione. Poiché le foglie dell’albero possono contenere riferimenti duplicati alla geometria, il camminatore contrassegna i nodes come visitati e li ignora in seguito, che devono essere ripristinati o comunque aggiornati prima di eseguire la camminata successiva.
    • L’utilizzo di un sistema di partizionamento spaziale (uno degli alberi) e una rappresentazione efficiente dal punto di vista del disegno sono fondamentali per ottenere elevati framerate. Ho scoperto che in questi tipi di applicazioni, il frame rate è il più alto ansible di 20 fps al minimo. Per non parlare del fatto che molte prestazioni ti daranno molte opportunità per creare una mappa migliore. (Il mio è tutt’altro che bello, ma ci arriverà un giorno.)
    • Il partizionamento spaziale aiuta a migliorare le prestazioni riducendo il numero di comandi di estrazione inviati al processore. Tuttavia, potrebbe venire un momento in cui l’utente desidera effettivamente visualizzare l’intero set di dati (forse una vista arial). In questo caso, hai bisogno di un livello di sistema di controllo dei dettagli. Poiché la mia applicazione riguarda le strade, do la priorità alle autostrade e alle strade più grandi. Il mio codice di disegno sa quante primitive posso disegnare prima che il framerate scenda. Anche i primitivi vengono ordinati in base a questa priorità. Disegno solo i primi x elementi in cui x è il numero di primitive che posso disegnare al mio framerate desiderato.

    Il resto è il controllo della fotocamera e l’animazione di qualsiasi dato che si desidera visualizzare.

    Ecco alcuni esempi della mia implementazione esistente:

    Picture http://sofit.miximages.com/maps/Picture 5.png Immagine http://sofit.miximages.com/maps/Picture 7.png

    per memorizzare localmente i dati tigre, avrei scelto Postgresql con gli strumenti postgis .

    hanno una collezione impressionante di strumenti, in particolare Tiger Geocoder offre un buon modo per importare e utilizzare i dati della tigre.

    dovrai dare un’occhiata agli strumenti che interagiscono con postgis, molto probabilmente una sorta di mapserver

    da http://postgis.refractions.net/documentation/ :

    Ora ci sono diversi strumenti open source che funzionano con PostGIS. Il progetto uDig sta lavorando su un ambiente desktop di lettura / scrittura completo che può funzionare direttamente con PostGIS. Per la mapping di Internet, l’Università del Minnesota Mapserver può utilizzare PostGIS come fonte di dati. Il toolkit GIS Java di GeoTools supporta PostGIS, così come il GeoServer Web Feature Server. GRASS supporta PostGIS come origine dati. Il visualizzatore GIS del desktop Java JUMP ha un semplice plug-in per leggere i dati PostGIS e il desktop QGIS ha un buon supporto PostGIS. I dati PostGIS possono essere esportati in diversi formati GIS di output utilizzando la libreria OGR C ++ e gli strumenti della riga di comando (e di cource con il dumper del file Shape in bundle). E naturalmente qualsiasi linguaggio che possa funzionare con PostgreSQL può funzionare con PostGIS – l’elenco include Perl, PHP, Python, TCL, C, C ++, Java, C # e altro.

    modifica: depite mapserver con la parola SERVER nel suo nome, questo sarà utilizzabile in un ambiente desktop.

    Sebbene tu abbia già deciso di utilizzare i dati TIGER, potresti essere interessato a OSM (Open Street Map) , perché OSM ha una completa importazione dei dati TIGER al suo interno, arricchiti con i dati forniti dagli utenti. Se ti attieni al formato TIGER, la tua app sarà inutile per gli utenti internazionali, con OSM otterrai TIGER e tutto il resto contemporaneamente.

    OSM è un progetto aperto che include una mappa del mondo gratuita modificata in modo collaborativo. È ansible ottenere tutti questi dati come XML ben strutturato, eseguire query per una regione o scaricare il mondo intero in un file di grandi dimensioni.

    Ci sono alcuni renderizzatori di mappe per OSM disponibili in vari linguaggi di programmazione, molti dei quali sono open source, ma c’è ancora molto da fare.

    Esiste anche un servizio di routing OSM disponibile. Ha un’interfaccia web e potrebbe anche essere eseguibile tramite un’API di servizi web. Ancora una volta, non è tutto finito. Gli utenti potrebbero sicuramente utilizzare un’applicazione di routing desktop o mobile costruita in cima a questo.

    Anche se non decidi di andare con quel progetto, puoi trarne molta ispirazione. Basta dare un’occhiata al wiki del progetto e alle fonti dei vari progetti software che sono coinvolti (troverai collegamenti all’interno del wiki).

    Puoi anche lavorare con l’applicazione e l’API di mapping visiva di Microsoft o utilizzare l’API di Google. Ho sempre programmato commercialmente con i prodotti ESRI e non ho giocato così tanto con le API aperte.

    Inoltre, potresti voler guardare Maker! e cercatore! Sono programmi relativamente nuovi ma penso che siano gratuiti. Potrebbe essere limitato a incorporare i dati. Maker può essere trovato qui.

    Il problema è che l’elaborazione spaziale è abbastanza nuova nella scala non commerciale.

    Se non ti dispiace pagare una soluzione, Safe Software produce un prodotto chiamato FME. Questo strumento ti aiuterà a tradurre i dati da qualsiasi formato a quasi tutti gli altri. Compreso KML il formato di Google Earth o renderlo come JPEG (o serie di JPEG). Dopo aver convertito i dati, puoi incorporare google earth nella tua applicazione utilizzando la loro API o semplicemente visualizzare le immagini affiancate.

    Come parte, non FME è una piattaforma molto potente, quindi mentre fai le tue traduzioni puoi aggiungere o rimuovere parti di dati di cui non hai necessariamente bisogno. Unisci le fonti se ne hai più di una. Converti le coordinate (non ricordo cosa usi esattamente Google Earth). Archiviare backup in un database. Ma seriamente se sei disposto a sborsare qualche dollaro dovresti esaminare questo.

    Puoi anche creare dei flag (molto simili alla tua mappa di esempio) che contengono una posizione (dove inserirla) e altri dati / commenti sulla posizione. Queste bandiere sono disponibili in molte forms e dimensioni.

    Una semplificazione su un Mercatore o altra proiezione è assumere un fattore di conversione costante per latitudine e longitudine. Moltiplicare i gradi di latitudine di 69,172 miglia; per la longitudine, scegli la latitudine media della tua area della mappa e moltiplica (180-longitudine) per il coseno (middle_latitude) * 69.172. Una volta convertiti in miglia, puoi utilizzare un altro insieme di conversioni per ottenere le coordinate dello schermo.

    Questo è ciò che ha funzionato per me nel 1979.

    La mia fonte per il numero di miglia per grado.

    Quando ho dato questa risposta la domanda è stata etichettata

    “Quale sarebbe il modo migliore per rendere uno Shapefile (dati mappa) con polilinee in .Net?”

    Ora è una domanda diversa ma lascio la risposta alla domanda originale.

    Ho scritto una versione .net in grado di disegnare i dati vettoriali (come la geometria da un file shp) usando semplicemente GDI + in c #. È stato abbastanza divertente

    Il motivo era che dovevamo gestire diverse versioni di geometrie e attributi con molte informazioni aggiuntive, quindi non potevamo usare un componente di mappa commerciale o uno open source.

    La cosa principale quando si fa questo è stabilire una vista e tradurre / trasformare le coordinate WGIS84 in un downscale e GDI + x, y coordinate e attendere con proiezione se si ha addirittura bisogno di riproiettare del tutto.

    Una soluzione è usare MapXtreme. Hanno API per Java e C #. L’API è in grado di caricare questi file e renderli.

    Per Java:

    http://www.mapinfo.com/products/developer-tools/desktop%2c-mobile-%26-internet-offering/mapxtreme-java

    Per .NET:

    http://www.mapinfo.com/products/developer-tools/desktop%2c-mobile-%26-internet-offering/mapxtreme-2008

    Ho usato questa soluzione in un’applicazione desktop e ha funzionato bene. Offre molto di più che solo il rendering delle informazioni.

    Ora fare tutto da capo potrebbe richiedere un po ‘di tempo. Hanno una versione di valutazione che è ansible scaricare. Penso che stampi semplicemente “MAPXTREME” sulla mappa come filigrana, ma è completamente utilizzabile altrimenti