Frage

Ich bin daran interessiert, schreiben eine simple navigation application as a pet-Projekt.Nach der Suche rund um für Kostenlose anzeigen-Daten, die ich haben sich auf die US Census Bureau TIGER 2007/Line Shapefile Kartendaten.Die Daten werden unterteilt in zip-Dateien für die einzelnen Landkreise und ich heruntergeladen habe eine einzelne Grafschaften Karte-Daten, die für meinen Bereich.

Was wäre der beste Weg, Lesen Sie in dieser map-Daten in ein nutzbares format?

Wie sollte ich:

  • Lesen Sie in diesen Dateien
  • Analysieren Sie Reguläre Ausdrücke oder einige Bibliotheken, die bereits analysiert diese shape-Dateien?
  • Laden Sie die Daten in meine Anwendung - Sollte ich lade die Punkte direkt in einige datastructure in Erinnerung?Verwenden Sie eine kleine Datenbank?Ich habe keine Notwendigkeit für die Persistenz einmal Sie schließen Sie die Anwendung der Karte die Daten.Der Nutzer kann das laden der shape-Datei erneut.

Was wäre der beste Weg, um das Rendern der Karte, die ich einmal gelesen habe, die im Shapefile-Daten?

Im Idealfall möchte ich in der Lage sein, zu Lesen in einem counties map data shape-Datei und machen alle poly-Linien auf dem Bildschirm und erlauben die Rotation und Skalierung.

Wie sollte ich:

  • Convert lat/lon-Punkte-Bildschirm-Koordinaten?- Soweit ich weiß das Shapefile verwendet Längengrad und Breitengrad für seine Punkte.Also offensichtlich bin ich gehen zu müssen, um zu konvertieren, diese irgendwie zu-Bildschirm-Koordinaten, um die Karte anzuzeigen features.
  • Rendern der Karte Daten (Eine Reihe von Polylinien für Straßen, Grenzen, etc.) in einer Weise, dass ich kann leicht drehen und skalieren Sie die gesamte Karte?
  • Render meine ganze map als eine Reihe von "Kacheln", also nur die Funktionen/Leitungen innerhalb des Anzeigebereichs, werden auch gerendert?

Ex.der TIGER-Daten gerendert als display-anzeigen:
alt text

Jeder mit etwas Erfahrung und Einsicht in das, was der beste Weg für mich, zu Lesen in diesen Dateien, wie soll ich Sie vertreten (Datenbank, in-memory-datastructure) in meinem Programm, und wie ich Rendern soll (mit drehen/skalieren) die map-Daten auf dem Bildschirm würde werden geschätzt.

EDIT:Um zu klären, ich tun nicht wollen jede Google oder Yahoo maps API.Ebenso möchte ich nicht verwenden, OpenStreetMap.Ich bin auf der Suche nach mehr aus-scratch Ansatz als die Verwendung dieser apis/Programme.Dies wird eine desktop Anwendung.

War es hilfreich?

Lösung

Zuerst empfehle ich, dass Sie verwenden Sie die 2008 TIGER-Dateien.

Zweitens, wie andere darauf hinweisen, es gibt viele Projekte, die es jetzt schon Lesen, zu interpretieren, zu konvertieren, und verwenden Sie die Daten.Bauen Sie Ihre eigenen parser für diese Daten ist fast trivial, aber es gibt keinen Grund, zu gehen Sie durch ein anderes Projekt-code und versuchen zu extrahieren, was Sie brauchen, wenn Sie planen, Ihr Projekt als ganzes.

Wenn Sie möchten, beginnen Sie von der unteren Ebene

Analyse

Bauen Sie Ihre eigenen TIGER-parser (relativ einfach - nur ein DB-Linie Segmente) und eine einfache Anzeige auf top von, dass (Linien, Polygone, Buchstaben/Namen) ist auch ziemlich einfach.Sie wollen den Blick auf die unterschiedlichen Kartenprojektion-Typen für die render-phase.Die am häufigsten verwendeten (und daher den meisten Benutzern vertraut) ist die Mercator-Projektion - es ist ziemlich einfach und schnell.Sie könnte spielen wollen, mit Unterstützung von anderen Projektionen.

Dies wird ein bisschen 'Spaß' im Sinne von dem sehen, wie Projekt eine Karte, und wie die umgekehrte, dass die Projektion (sagen wir, ein Benutzer klickt auf die Karte, die Sie sehen wollen, die lat/lon-Sie geklickt haben, erfordert die Umkehrung der aktuellen Projektion Gleichung).

Rendering

Wenn ich entwickelte meine renderer habe ich beschlossen, meine Fenster auf eine Feste Größe (embedded System) und eine Feste Vergrößerung.Dies bedeutete, dass ich könnte zentrieren Sie die Karte auf ein lat/lon, und mit den pixel-center=center lat/lon bei einer bestimmten Vergrößerung, und angesichts der mercator-Projektion konnte ich berechnen, welche pixel repräsentiert jedem lat/lon), und Umgekehrt.

Einige Programme stattdessen erlauben, das Fenster zu variieren und anstelle von Vergrößerung und einem festen Punkt, Sie verwenden Sie zwei Feste Punkte (oft die oberen linken und unteren rechten Ecken eines Rechtecks definieren Sie das Fenster).In diesem Fall wird es trivial, festzustellen, dass das pixel lat/lon-transfer - es ist nur ein paar interpolation Berechnungen.Rotation und Skalierung stellen Sie diese transfer-Funktion ein wenig komplexer, aber es sollte nicht deutlich werden, so ist es immer noch ein rechteckiges Fenster mit interpolation, aber die Fenster Ecken müssen nicht in einer bestimmten Orientierung in Bezug auf Nord.Dies fügt ein paar Grenzfällen (Sie können die Karte in und auswendig und Ansicht, als ob aus dem Innern der Erde, zum Beispiel), aber diese sind nicht beschwerlich, und können behandelt werden, wie Sie arbeiten.

Sobald Sie haben die lat/lon-pixel-transfer erfolgt, Rendern von Linien und Polygonen ist ziemlich einfach, außer für die normale Grafik-Probleme (wie Kanten, Linien oder Polygone überlappen unangemessen, anti-aliasing, etc.).Aber das Rendern einer grundlegenden hässlich Karte, wie es viele open-source-Renderer ist relativ einfach.

Sie werden auch in der Lage zu spielen mit dem Abstand und der große Kreis Berechnungen - zum Beispiel eine gute Regel der Daumen ist, dass jeden Grad des lat-oder lon-am äquator ist etwa 111.1 KM - aber eines ändert sich, wenn Sie näher an der pole, während die anderen weiterhin auf 111,1 kM.

Storage und Strukturen

Wie Sie speichern und beziehen sich auf die Daten, jedoch, hängt stark davon ab, was Sie planen zu tun.Viele schwierige Probleme entstehen, wenn Sie möchten, verwenden Sie die gleiche Datenbank-Struktur für Demographie vs routing - einer gegebenen Datenbank-Struktur und die Indexierung schnell, und langsam für die anderen.

Mit zipcodes und laden Sie nur die in der Nähe zipcodes arbeitet für die kleine Karte rendering-Projekte, aber wenn Sie eine route quer durch das Land müssen Sie eine andere Struktur.Einige Implementierungen haben 'overlay' Datenbanken enthalten nur die wichtigsten Straßen und schnappt Routen, um die überlagerung (oder durch mehrere overlays - local, metro, county, state, country).Das Ergebnis ist eine schnelle, aber manchmal ineffizient routing.

Fliesen

Fliesen-Ihre Karte ist eigentlich nicht leicht.Bei niedrigeren Vergrößerungen, Sie können machen eine gesamte Karte und schneiden Sie es.Bei höherer Vergrößerung können Sie nicht machen die ganze Sache auf einmal (wegen Speicher/space constraints), so haben Sie in Scheiben schneiden.

Schneiden Linien an der Grenze der Fliesen, so dass Sie machen können einzelne Fliesen Ergebnisse in weniger als perfekte Ergebnisse - oft das, was geschehen ist, ist die Linien gerendert werden, die außerhalb der Fliesen-Grenze (oder zumindest die Daten der Zeile, Ende gehalten wird, obwohl das rendering Stoppt, sobald er findet es gefallen an der Kante) - dies reduziert Fehler, der Auftritt, mit Linien suchen, wie Sie nicht ganz übereinstimmen, wie Sie Reisen über die Fliesen.

Sie werden sehen, was ich spreche, als Sie die Arbeit an diesem problem.

Es ist nicht trivial zu finden, die Daten, die in einer bestimmten Kachel - eine Zeile kann haben beide enden außerhalb einer bestimmten Kachel, sondern Reisen über die Fliesen.Sie müssen konsultieren, Grafik Bücher über das (Michael Abrash ' s Buch ist das wegweisende Referenz, frei verfügbar jetzt auf den vorherigen link).Während er spricht hauptsächlich über Spiele, die Fenster -, clipping -, polygon-Kanten, collision, etc alle die hier gelten.

Jedoch, möchten Sie vielleicht, um zu spielen, auf einer höheren Ebene.

Sobald Sie die oben getan haben (entweder durch Anpassung eines bereits vorhandenen Projekts oder tun die oben yourself) - Sie wollen spielen, mit anderen Szenarien und algorithmen.

Reverse geocoding ist relativ einfach. Eingabe lat/lon (oder klicken Sie in auf der Karte) und Sie bekommen die nächstgelegene Adresse.Dies lehrt Sie, wie zu interpretieren, Adressen entlang der Liniensegmente in TIGER-Daten.

Basic geocoding ist ein schwieriges problem. Schreiben einer Adresse parser ist ein nützliches und Interessantes Projekt, und dann die Umwandlung dieser in lat/lon mit der TIGER-Daten ist nicht trivial, aber eine Menge Spaß.Beginnen Sie klein und einfach, indem die genauen Namen und das format passenden, und dann beginnen, zu schauen, " wie " das matching und die phonetische übereinstimmung.Es gibt eine Menge Forschung in diesem Bereich - Blick auf die Suchmaschinen-Projekte für etwas Hilfe hier.

Finden Sie den kürzesten Weg zwischen zwei Punkten ist ein nicht-triviales problem. Es gibt viele, viele algorithmen, um dies zu tun, von denen die meisten sind patentiert.Ich empfehle, dass, wenn Sie versuchen, dies mit einem einfachen Algorithmus von Ihrem eigenen design, und dann tun Sie etwas Forschung und vergleichen Sie Ihre design, um den Stand der Technik.Es ist eine Menge Spaß, wenn man in der Graphentheorie.

Folgen Sie einem Pfad und präventiv Anweisungen geben ist nicht so einfach, wie es sieht auf den ersten Blick.Da eine Reihe von Anweisungen, die mit einer verbundenen Reihe von lat/lon-Paare, "Folgen", die route mithilfe externer Eingang (GPS, oder simuliertes GPS) und entwickeln einen Algorithmus, der gibt dem Benutzer Anweisungen, wie Sie nähern jede echte Kreuzung.Beachten Sie, dass es mehr lat/lon-Paare als Anweisungen durch geschwungene Straßen, etc, und Sie müssen, um zu erkennen, Richtung von Reise-und so weiter.Viele von Ecke zu Fällen, die Sie nicht sehen, bis Sie versuchen, es zu implementieren.

Punkt von Interesse suchen. Dieser ist interessant - Sie brauchen, um zu finden Sie die aktuelle Lage, und alle Punkte von Interesse (nicht Teil der TIGER, machen Sie Ihre eigene oder erhalten eine andere Quelle) in einem bestimmten Abstand (wie die Krähe fliegt, oder härter fahren Abstand) von der Herkunft.Dies ist interessant, dass Sie konvertieren müssen, die POI-Datenbank in einem format, das leicht ist, um die Suche in dieser Umstand.Sie können nicht die Zeit nehmen, um durch zu gehen Millionen von Einträgen, gehen die Distanz-Berechnung (sqrt(x^2 + y^2)), und gibt die Ergebnisse zurück.Sie müssen eine Methode oder der Algorithmus reduziert die Menge der Daten, die Sie unten erste.

Traveling salesman. Routen mit mehreren Zielen.Nur eine härtere version des regulären Arbeitsplan.

Finden Sie eine Vielzahl von links zu vielen Projekten und Informationsquellen zu diesem Thema hier.

Viel Glück, und bitte veröffentlichen, was immer Sie tun, egal wie rudimentär oder hässlich werden, damit andere davon profitieren können!

-Adam

Andere Tipps

SharpMap ist ein Open-Source-.NET 2.0 Mapping-Engine für WinForms und ASP.NET. Dies kann alle Funktionen, die Sie benötigen. Es befasst sich mit den meisten gängigen GIS Vektor- und Rasterdatenformate einschließlich ESRI Shape-Dateien.

Die Lösung lautet:

  • ein Geospatial Server wie mapserver, geoserver, Grad (Open-Source).

Sie können Shape-Dateien lesen und dienen (und viele andere Dinge). Zum Beispiel geoserver (wenn vorhanden) dienen Daten aus dem US Census Bureau TIGER Shape-Dateien als Demo

Es gibt viele Beispiele im Web dieser Lösung mit

Funny Frage. Hier ist, wie ich es tun.

Ich nehme an, was Geometrie ich in benötigen, was auch immer Formaten sie kommen in Ich habe Daten von USGS worden ziehen, so dass zu einem Bündel beträgt.

Ich schrieb dann ein Programm, das diese Form Definitionen in eine Form „kompiliert“, das effizient zu machen. Das bedeutet, alle Projektionen und Datenformatkonvertierungen zu tun, die effizient notwendig sind, um die Daten anzuzeigen. Einige Details:

  • Für eine 2D-Anwendung können Sie verwenden, was Sie wollen Projektion: Map Projections .
  • Für 3D, möchten Sie diese Breiten- / Längengrade konvertieren in 3D-Koordinaten. Hier einige Mathematik auf, wie das zu tun: Transformation von Kugelkoordinaten zu normalen rechtwinkligen Koordinaten .
  • Break up alle Grundelemente in einem Quadtree / Octree (2D / 3D). Astknoten in diesem Baum Verweise auf alle Geometrie enthalten, dass (Achse ausgerichtet) Bounding-Box des Blattknoten schneidet. (Das bedeutet, dass ein Stück Geometrie mehr als einmal verwiesen werden kann.)
  • Die Geometrie wird dann in eine Tabelle von Eckpunkten und eine Tabelle von Zeichenbefehlen. Dies ist ein ideales Format für OpenGL. Befehle können über glDrawArrays ausgestellt Verwendung Vertexpuffer ( Vertex Buffer Objekte ).
  • Ein allgemeines Besuchermuster wird verwendet, um die Quadtree / Octree zu gehen. Walking beinhaltet das Testen, ob der Besucher den gegebenen Knoten des Baums schneidet, bis ein Blattknoten gefunden wird. Besucher sind: Zeichnung, Kollisionserkennung und Auswahl. (Da die Baumblätter doppelte Referenzen enthalten kann auf die Geometrie, die Wanderer markiert Knoten als besucht wird und ignoriert sie danach. Diese Markierungen haben zurückgesetzt oder auf andere Weise aktualisiert werden, bevor die nächste Wanderung zu tun.)
  • ein räumliches Unterteilungssystem (eines der Bäume) und eine Zeichnung effiziente Darstellung zu verwenden ist entscheidend für eine hohe Bildrate zu erreichen. Ich habe das in dieser Art von Anwendungen zu finden, Sie möchten, dass Ihre Frame-Rate so hoch wie möglich 20 fps auf ein Minimum. Nicht zu erwähnen, dass viele Performance finden Sie viele Möglichkeiten geben, eine besser aussehende Karte zu erstellen. (Bergwerk ist weit von gut aussehenden, aber einem Tag dorthin kommt.)
  • Die räumliche Unterteilung hilft Darstellungsleistung durch die Anzahl der Zeichenbefehle Reduzierung an den Prozessor gesendet. Allerdings könnte es eine Zeit kommen, wenn der Benutzer tatsächlich will den gesamten Datensatz (vielleicht eine Luftaufnahme) anzuzeigen. In diesem Fall müssen Sie eine Detailebene Steuerung. Da meine Anwendung mit Straßen beschäftigt, gebe ich Priorität auf Autobahnen und größeren Straßen. Meine Zeichnung Code weiß, wie viele Primitive ich ziehen kann, bevor meine Framerate sinkt. Die Grundelemente werden ebenfalls von dieser Priorität sortiert. Ich zeichne nur die ersten x Posten, bei denen x die Anzahl von Primitiven, die ich an meinem gewünschten Framerate ziehen kann.

Der Rest ist die Kamerasteuerung und Animation von was auch immer Daten, die Sie anzeigen möchten.

Hier sind einige Beispiele meiner bestehenden Implementierung:

Bild http://seabusmap.com/assets/Picture%205.png Bild http://seabusmap.com/assets/Picture%207.png

für Tiger Daten lokal speichern, würde ich wählte Postgresql mit der postgis Tools.

sie eine beeindruckende Sammlung von Werkzeugen haben, für Sie vor allem die Tiger Geocoder bietet eine gute Möglichkeit, die Tiger-Daten zu importieren und verwenden.

Sie müssen einen Blick auf die Werkzeuge nehmen, die mit postgis interagieren, wahrscheinlich eine Art von mapserver

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

  

Es gibt jetzt mehr Open-Source-Tools, die mit PostGIS arbeiten. Das uDig Projekt arbeitet an einer vollständigen Lese- / Schreib Desktop-Umgebung, die direkt mit PostGIS arbeiten kann. Für Internet-Mapping kann die University of Minnesota Mapserver verwendet PostGIS als Datenquelle. Das GeoTools Java GIS-Toolkit hat PostGIS-Unterstützung, wie der Web Feature Server GeoServer. GRASS unterstützt PostGIS als Datenquelle. Der JUMP Java Desktop-GIS-Viewer verfügt über ein einfaches Plugin für das Lesen von PostGIS-Daten und die QGIS Desktop hat eine gute PostGIS-Unterstützung. PostGIS Daten können auf mehrere Ausgabe GIS-Formate mit dem OGR C ++ Bibliothek und Kommandozeilen-Programmen (und cource mit dem gebündelten Form Datei dumper) exportiert werden. Und natürlich jede Sprache, die mit PostgreSQL arbeiten kann, kann mit PostGIS arbeiten - die Liste enthält Perl, PHP, Python, TCL, C, C ++, Java, C #, und vieles mehr.

bearbeiten. Mapserver Sonneschirme das Wort SERVER in seinem Namen hat, wird dies in einer Desktop-Umgebung nutzbar sein

Auch wenn Sie bereits die TIGER-Daten zu verwenden, entschieden, könnten Sie Interesse an OSM (Open Street Map) , beacuse OSM verfügt über einen kompletten Import der TIGER-Daten darin, mit Benutzern angereichert Daten beigetragen. Wenn Sie mit dem TIGER-Format halten, wird Ihre App internationale Anwender nutzlos, mit OSM Sie bekommen TIGER und alles andere auf einmal.

OSM ist ein offenes Projekt eine kollaborativ bearbeitet freie Weltkarte kennzeichnet. Sie können auch strukturierte XML, entweder Abfrage für eine Region all diese Daten erhalten, oder die ganze Welt in einer großen Datei herunterladen.

Es gibt einige Karte Renderer für OSM in verschiedenen Programmiersprachen, die meisten von ihnen Open Source, aber noch gibt es viel zu tun.

Es gibt auch einen OSM Routing-Dienst avaliable. Es verfügt über eine Web-Schnittstelle und kann auch abfragbar über einen Web-Service-API sein. Auch hier ist es nicht alles fertig. Benutzer auf jeden Fall einen Desktop oder mobile Routing-Anwendung gebaut oben auf diesem nutzen könnten.

Auch wenn Sie mit diesem Projekt nicht gehen möchten, können Sie eine Menge Inspiration aus ihm heraus. Werfen Sie einen Blick auf die Projekt Wiki und an den Quellen der verschiedenen Software-Projekten, die beteiligt sind (Sie werden feststellen, Links zu ihnen innerhalb des Wiki).

Sie könnten auch mit Microsofts Visual Erde Mapping-Anwendung und api arbeiten oder Google api verwenden. Ich habe immer im Handel mit ESRI Produkten programmiert und nicht mit dem offenen api so viel gespielt.

Auch sollten Sie bei Herstellern suchen! und Finder! Sie sind relativ neue Programme, aber ich denke, dass sie frei sind. Könnte auf die Einbettung der Daten beschränkt werden. Maker hier gefunden werden kann.

Das Problem ist, dass die räumliche Verarbeitung in dem nicht kommerziellen Maßstab ist ziemlich neu.

Wenn Sie nichts dagegen nicht für eine Lösung zu bezahlen Safe Software ein Produkt FME genannt produziert. Dieses Tool hilft Ihnen, Daten von einem beliebigen Format zu übersetzen, um fast jedes andere. Einschließlich KML das Google Earth-Format oder macht es als JPEG (oder eine Reihe von JPEG-Dateien). Nach der Umwandlung der Daten können Sie Google Earth in Ihre Anwendung mit ihren API oder nur Anzeige einbetten die gekachelten Bilder.

Als eine Seite nicht FME ist eine sehr leistungsfähige Plattform so, während der Übersetzungen machen Sie können Teile von Daten hinzuzufügen oder zu entfernen, die Sie nicht unbedingt benötigen. Quellen zusammenführen, wenn Sie mehr als eine haben. Konvertieren Koordinaten (ich erinnere mich nicht, was genau Google Earth verwendet). Speichern Sie Backups in einer Datenbank. Aber im Ernst, wenn Ihr bereit, ein paar Dollar berappen Sie in aussehen sollte.

Sie können auch Flags erstellen (ähnlich wie in Ihrer Probe Karte), die eine Position enthalten (wo es zu setzen) und andere Daten / Informationen über den Standort. Diese Flags gibt es in vielen Formen und Größen.

Eine Vereinfachung über eine Mercator oder andere Projektion ist ein konstanter Umrechnungsfaktor für die geografische Breite und Länge zu übernehmen. Multiplizieren Sie die Breitengrade von 69,172 Meilen; für die Länge, die mittlere Breite Ihrer Karte Bereich auswählen und (180-Länge) von Cosinus (middle_latitude) * 69,172 multiplizieren. Sobald Sie in Meilen umgewandelt haben, können Sie eine weitere Reihe von Konvertierungen verwenden, um Bildschirmkoordinaten zu erhalten.

Dies ist, was im Jahr 1979 für mich wieder gearbeitet.

Meine Quelle für die Anzahl der Meilen pro Grad.

Als ich gab diese Antwort die Frage markiert war

„Was ist der beste Weg wäre, eine Shape-Datei (Kartendaten) mit Polylinien in .net? Machen“

Nun ist es eine andere Frage, aber ich lasse meine Antwort auf die ursprüngliche Frage.

  

Ich schrieb eine .net-Version, die ziehen könnte   Vektor-Daten (wie zum Beispiel der Geometrie von   eine SHP-Datei) in Klar GDI + c #. Es   war ganz lustig.

     

Der Grund dafür war, dass wir mussten   behandeln verschiedene Versionen   Geometrien und Attribute mit einer Menge   so zusätzliche Informationen konnten wir   eine Komponente nicht kommerzielle Karte verwenden oder   ein Open Source ein.

     

Die Hauptsache ist, wenn dies zu tun ist   gründen ein Ansichtsfenster und   übersetzen / Transformation Koordinaten WGIS84   auf einen Maßstabsverkleinerungs und GDI + x, y   Koordinaten und warten mit Projektions   auch wenn Sie überhaupt neu projizieren müssen.

Eine Lösung ist MapXtreme zu verwenden. Sie haben API für Java und C #. Die API ist in der Lage, diese Dateien zu laden und sie machen.

Für Java:

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

Für .NET:

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

Ich habe diese Lösung in einer Desktop-Anwendung und es hat gut funktioniert. Es bietet viel mehr, dass nur Informationen zu machen.

Nun könnte dies zu tun von Grunde auf eine ganze Weile dauern. Sie haben eine Testversion, die Sie herunterladen können. Ich denke, es druckt nur „MapXtreme“ über die Karte als Wasserzeichen, aber es ist vollständig nutzbar sonst

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top