Quelle est la meilleure façon de lire, de représenter et de rendre des données cartographiques?

je suis intéressé par l'écriture d'une simple application de navigation comme un projet de compagnie. Après avoir cherché des données cartographiques gratuites, j'ai choisi le US Census Bureau TIGER 2007 Ligne/Shapefile données de la carte. Les données sont divisées en fichiers zip pour chaque comté et j'ai téléchargé une seule carte comtés données pour ma région.

quelle serait la meilleure façon de lire les données cartographiques dans un format utilisable?

comment devrait-on J'ai:

  • lire dans ces fichiers
  • les analyser-expression régulière ou une bibliothèque qui peut déjà analyser ces Shapefiles?
  • charger les données dans mon application - dois-je charger les points directement dans une structure de données en mémoire? Utiliser une petite base de données? Je n'ai pas besoin de persistance une fois que vous fermez l'application des données de la carte. L'utilisateur peut charger le Shapefile à nouveau.

Quelle serait la meilleure façon de rendre le carte une fois que j'ai lu les données dans le Shapefile?

idéalement, j'aimerais pouvoir lire dans un fichier de forme de données de carte de comtés et rendre toutes les polylignes sur l'écran et permettre la rotation et la mise à l'échelle.

Comment devrais-je:

  • Convertir les points lat / lon en coordonnées d'écran? - Pour autant que je sache, le Shapefile utilise la longitude et la latitude pour ses points. Donc, évidemment, je vais devoir convertir ces coordonnées d'une façon ou d'une autre à l'écran pour afficher le les caractéristiques de la carte.
  • rendre les données de la carte (une série de polylines pour les routes, les limites, etc) d'une manière que je peux facilement tourner et l'échelle de la carte entière?
  • Rendre l'ensemble de ma carte comme une série de "tuiles" de sorte que seules les fonctionnalités/les lignes à l'intérieur de la zone d'affichage sont rendus?

Ex. de données TIGER rendu comme un affichage de la carte:

texte alternatif http://i43.tinypic.com/ngosjl.png

toute personne ayant une certaine expérience et une certaine perspicacité dans Quelle est la meilleure façon pour moi de lire dans ces dossiers, comment je devrais les représenter (base de données, dans la structure de données de mémoire) dans mon programme, et comment je devrais rendre (avec la rotation/échelle) les données de carte sur l'écran serait apprécié.

Modifier: pour clarifier, Je ne veux pas utiliser D'API GoogleMaps ou Yahoo maps. De même, Je ne veux pas utiliser OpenStreetMap. Je suis à la recherche d'une approche plus à partir de zéro que l'utilisation de ces IPA/programmes. Ce sera un bureau application.

12
demandé sur mmcdole 2008-10-21 21:22:45

11 réponses

tout d'Abord, je vous recommande d'utiliser le 2008 TIGER files.

Deuxièmement, comme d'autres le font remarquer, il y a beaucoup de projets qui sont déjà en train de lire, d'interpréter, de convertir et d'utiliser les données. Construire votre propre analyseur pour ces données est presque trivial, cependant, il n'y a aucune raison de passer en revue le code d'un autre projet et essayer d'extraire ce dont vous avez besoin à moins que vous projetez d'utiliser leur projet dans son ensemble.

si vous voulez commencer par le bas niveau

Analyse

construire votre propre analyseur TIGER (raisonnablement facile - juste une DB de segments de ligne), et construire un rendu simple en plus de cela (lignes, polygones, lettres/noms) va également être assez facile. Vous voudrez regarder divers types de projection cartographique pour la phase de rendu. Le plus fréquemment utilisé (et donc le plus familier pour les utilisateurs) est l' projection de Mercator - c'est très simple et rapide. Vous pourriez je veux jouer avec le soutien d'autres projections.

cela fournira un peu de "plaisir" en termes de voir comment projeter une carte, et comment inverser cette projection (par exemple, un utilisateur clique sur la carte, vous voulez voir le lat/lon qu'ils ont cliqué - nécessite d'Inverser l'équation de projection actuelle).

Rendu

lorsque j'ai développé mon renderer, j'ai décidé de baser ma fenêtre sur une taille fixe (appareil encastré), et un grossissement fixe. Cela signifie que Je pourrais centrer la carte à un lat/lon, et avec le centre pixel=centre lat/lon à un grossissement donné, et compte tenu de la projection mercator je pourrais calculer quel pixel représente chaque lat/lon, et vice-versa.

certains programmes permettent plutôt à la fenêtre de varier, et au lieu d'utiliser un grossissement et un point fixe, ils utilisent deux points fixes (souvent les coins supérieur gauche et inférieur droit d'un rectangle définissant la fenêtre). Dans ce cas, il devient facile de déterminer le pixel transfert lat/lon - ce ne sont que quelques calculs d'interpolation. La rotation et la mise à l'échelle rendent cette fonction de transfert un peu plus complexe, mais ne devrait pas l'être considérablement - c'est toujours une fenêtre rectangulaire avec interpolation, mais les coins des fenêtres n'ont pas besoin d'être dans une orientation particulière par rapport au nord. Cela ajoute quelques cas de coin (vous pouvez tourner la carte à l'envers et la voir comme si de l'intérieur de la terre, par exemple) mais ceux-ci ne sont pas onéreux, et peut être traitée comme vous travaillez sur il.

une fois que vous avez effectué le transfert Lat/lon vers pixel, le rendu des lignes et des polygones est assez simple, sauf pour les problèmes graphiques normaux (tels que les bords des lignes ou des polygones se chevauchant de façon inappropriée, anti-aliasing, etc). Mais rendre une carte de base laide telle qu'elle est faite par de nombreux locataires open source est assez simple.

vous serez également en mesure de jouer avec la distance et de grands calculs de cercle - par exemple, une belle règle de base est que chaque degré de lat ou lon à l'équateur est d'environ 111,1 KM - mais l'un change au fur et à mesure que vous vous rapprochez de l'un des pôles, tandis que l'autre continue à rester à 111,1 kM.

stockage et Structures

la façon dont vous stockez et référez les données, cependant, dépend grandement de ce que vous prévoyez de faire avec elle. Un grand nombre de problèmes difficiles se posent si vous voulez utiliser la même structure de base de données pour la démographie vs routage - une structure de base de données Donnée et l'indexation sera rapide pour un, et lent pour les autres.

utilisation de zipcodes et chargement seulement les zipcodes à proximité fonctionne pour les petits projets de rendu de carte, mais si vous avez besoin d'un itinéraire à travers le pays, vous avez besoin d'une structure différente. Certaines implémentations ont des bases de données de "superposition" qui ne contiennent que des routes principales et des routes snaps vers la superposition (ou à travers de multiples superpositions - local, métro, comté, état, pays). Cela se traduit par rapide, mais parfois inefficace routage.

Carrelage

il n'est pas facile de colmater votre carte. À des grossissements inférieurs, vous pouvez rendre une carte entière et la découper. À des grossissements plus élevés, vous ne pouvez pas rendre l'ensemble à la fois (en raison de contraintes de mémoire/espace), donc vous devez le découper.

couper les lignes aux limites des tuiles pour pouvoir rendre des tuiles individuelles donne des résultats moins que parfaits - souvent, ce qui est fait c'est que les lignes sont rendues au-delà de la limite des tuiles (ou, au moins, les données de l'extrémité de la ligne est conservée, bien que le rendu s'arrête une fois qu'il trouve qu'il est tombé du bord) - cela réduit l'erreur qui se produit avec des lignes ressemblant à ils ne correspondent pas tout à fait comme ils voyagent à travers les carreaux.

vous verrez de quoi je parle en travaillant sur ce problème.

il n'est pas trivial de trouver les données qui vont dans une tuile donnée aussi bien - une ligne peut avoir les deux extrémités en dehors d'une tuile donnée, mais voyage à travers la tuile. Vous aurez besoin de consulter les graphiques livres à ce sujet (Le Livre de Michael Abrash est la référence fondamentale, disponible gratuitement maintenant au lien précédent). Tandis qu'il parle principalement de jeu, le fenêtrage, la coupe, les bordures de polygone, collision, etc tous s'appliquent ici.

Toutefois, vous pouvez jouer à un niveau supérieur.

une fois que vous avez fait ce qui précède (soit en adaptant un projet existant, soit en faisant ce qui précède vous-même), vous pouvez vouloir jouer avec d'autres scénarios et algorithme.

le géocodage inversé est assez facile. entrer lat / lon (ou cliquer sur la carte) et obtenir l'adresse la plus proche. Ceci vous enseigne comment interpréter les adresses le long des segments de ligne dans les données TIGER.

le géocodage de base est un problème difficile. Écrire un analyseur d'adresse est un projet utile et intéressant, et ensuite convertir cela en lat/lon en utilisant les données de tigre est non-trivial, mais beaucoup de plaisir. Commencer simple et petit, en exigeant exact correspondance du nom et du format, puis commencer à examiner l'appariement "like" et l'appariement phonétique. Il ya beaucoup de recherche dans ce domaine - regardez les projets de moteur de recherche pour obtenir de l'aide ici.

trouver le chemin le plus court entre deux points est un problème non négligeable. Il y a beaucoup, beaucoup d'algorithmes pour le faire, dont la plupart sont brevetés. Je recommande que si vous essayez cela aller avec un algorithme facile de votre propre conception, puis faire quelques recherches et comparer votre conception à l'état de l'art. C'est très amusant si vous aimez la théorie des graphes.

en suivant un chemin et en donnant des instructions préemptives n'est pas aussi facile qu'il y paraît à première vue. Étant donné un ensemble d'instructions avec un tableau associé de paires lat/lon, "suivre" la route en utilisant une entrée externe (GPS, ou GPS simulé) et développer un algorithme qui donne des instructions à l'utilisateur pendant qu'ils approchent chaque intersection réelle. Remarquez qu'il y a plus de paires lat/lon que instructions en raison de courbes de routes, etc, et vous aurez besoin de détecter la direction de voyage et ainsi de suite. Beaucoup d'étuis de coin que vous ne verrez pas jusqu'à ce que vous essayiez de le mettre en œuvre.

recherche de points d'intérêt. celui - ci est intéressant - vous devez trouver l'emplacement actuel, et tous les points d'intérêt (ne fait pas partie de tigre, faire votre propre ou obtenir une autre source) à une certaine distance (comme le corbeau vole, ou la distance plus difficile de conduite) de l'origine. Celui-ci est intéressant en ce que vous devez convertir la base de données POI dans un format qui est facile à rechercher dans cette circonstance. Vous ne pouvez pas prendre le temps de passer en revue des millions d'entrées, faire le calcul de la distance (sqrt(x^2 + y^2)), et retourner les résultats. Vous devez avoir une méthode ou un algorithme pour couper la quantité de données vers le bas d'abord.

vendeur itinérant. Routage avec de multiples destinations. Juste une version plus dure du routage régulier.

Vous pouvez trouver un certain nombre de liens de nombreux projets et sources d'information sur ce sujet ici.

bonne chance, et s'il vous plaît publiez tout ce que vous faites, peu importe comment rudimentaire ou laid, afin que d'autres peuvent bénéficier!

- Adam

24
répondu Adam Davis 2009-01-28 16:54:31