2009-12-12 20 views
2

J'ai trouvé les données de forme pour les frontières de tous les pays et une classe pour le traiter et j'ai écrit un script pour convertir la longitude et la latitude en pixels sur une image et pour dessiner les pays en utilisant imagefilledpolygon et imageline. Tout fonctionne bien sauf:PHP - générer une carte du monde à partir des données de frontière

1) J'ai une variable d'échelle $ que je peux changer. A $ scale = 1, l'image est de 360x180 pixels (1 pixel = 1 degré latitude/longitude). Idéalement, l'image finale que je souhaite serait environ $ scale = 2 (720x360) mais les lignes de bordure à 1 pixel d'épaisseur semblent très épaisses. Donc, je pensais que la meilleure solution serait de générer la carte à $ scale = 10 puis redimensionner l'image générée. Le problème est imagecopyresized ne pas antialias quand il redimensionne et il me laisse avec une image vraiment déchiquetée, comment puis-je redimensionner et antialias?

2) Le nombre de points pour générer un polygone d'un pays est BEAUCOUP. Le plan est d'utiliser le même code pour produire un imagemap HTML pour faire des pays des liens. Cependant, je crains pour l'instant qu'il y ait trop de points pour un imagemap (la taille du fichier peut être trop grande). Mon approche initiale était de sauter x nombre de points, ce qui conduit à un certain succès, Si je traite 1 sur 10 points, je reçois un résultat acceptable la plupart du temps. Idéalement j'aurais encore moins ... quand j'ai essayé 1 sur 40, j'ai trouvé que certaines frontières de pays se chevauchaient et qu'il y avait quelques écarts entre les pays (mais certaines des côtes les plus fréquentées semblaient mieux). Quel est le moyen sensé de réduire le nombre de points tout en maintenant un niveau de précision raisonnable?

Si quelqu'un est intéressé je posterai le code (une fois terminé.)

+1

Cela ne répond pas à votre question, mais peut-être avec l'image Magik vous obtiendrez de meilleurs résultats plus rapides/de traitement. – AntonioCS

Répondre

0

Je n'ont pas de code pour cela, il est plus juste d'une idée pour votre deuxième problème. Vos classes qui génèrent la carte peuvent-elles prendre une coordonnée x/y et déterminer dans quel pays vous vous trouvez? Si vous le pouvez, vous pouvez éviter d'utiliser une carte-image et utiliser javascript pour déterminer la coordonnée x/y du clic. Résolvez ceci dans un endroit et agissez comme vous le feriez normalement. L'inconvénient de ceci est bien sûr que si javascript est désactivé, cela ne fonctionnera pas.

Sons bien quand même.

+0

Cela pourrait fonctionner avec ajax: stocker tous les points sur le serveur, puis lorsque l'utilisateur clique interroge le clic souris xy ... oui je peux voir que le travail. Problème est que je voulais souris sur les données (nom du pays) ... Je pense que s'il y avait une requête ajax sur chaque mouvement de la souris pourrait être un peu lourd :) – Mark

+0

ouais ... certainement pas pour chaque mouvement :) – raytiley

0

résolu le premier:

imagecopyresampled est la fonction que je n'avais pas besoin imagecopyresized

0

Pour la deuxième partie de votre problème, ce que vous devez faire est de ne pas utiliser tous les points 10, mais seulement utiliser les cela ajoute quelque chose à la carte. Vous pouvez essayer d'utiliser un point uniquement s'il dépasse une certaine distance du dernier point rendu. Cela signifie que dans les zones plus denses, vous utilisez moins de points, mais lorsqu'ils sont espacés, vous en utilisez autant que vous le souhaitez.

+0

yeh, j'étais Considérant que ... J'ai le sentiment que je peux avoir le même problème quand il prend des points importants en laissant un écart entre deux pays ou en causant un chevauchement. Je suppose qu'il n'y a pas de mal à essayer. – Mark

+0

Eh bien, vous pouvez toujours modifier les résultats en changeant la distance de seuil si vous trouvez que vous obtenez trop ou pas assez de points. – justinlatimer