11
votes

Comprendre si une cllocation représente la terre ou l'océan

J'essaie de construire une API qui permettrait de comprendre si un Cllocation représente une terre ou non. J'ai besoin de cela pour travailler hors ligne car je suppose que la plupart de mes utilisateurs ne disposent pas de la connectivité. J'utilise mapbox comme serveur de tuiles, mais c'est toujours une question de carte car je n'utilise pas la carte SDK Mapox.

J'ai essayé plusieurs approches pour déterminer si une coordonnée donnée représente une localisation terrestre ou océan:

  • Base de données hors ligne de coordonnées qui constituent grossièrement le littoral du monde. Toujours un problème de déterminer si un point donné est à l'intérieur ou à l'extérieur du contour.
  • Analyse des couleurs d'une ressource de carreaux PNG (il doit y avoir une meilleure façon! Nécessite également de nombreuses données hors ligne à disponibilité afin d'être une approche efficace)

    Aussi (après ce qui précède est traitée) Existe-t-il un moyen efficace de décider d'une coordonnée de tuiles (x, y, z) s'il s'agit ou non d'une carreaux terrestres / mer / côte?

    Si quelqu'un a déjà eu du mal à ce sujet, j'apprécierais des conseils ici.


10 commentaires

Pourquoi est-ce un problème de déterminer si un point est à l'intérieur ou à l'extérieur d'une courbe fermée? Je pense que l'approche standard est de dessiner une demi-ligne du point à l'infini et de compter la fréquence de croix de la courbe. Si ce numéro est étrange, le point est à l'intérieur.


Thank @ Reinhardmänner, je me débats actuellement avec la création du polygone donné un ensemble de points singuliers. En outre, avez-vous un exemple de travail qui démontre ce que vous suggérez?


Je n'ai pas de code de travail, mais vous pouvez peut-être trouver plus d'informations à << a href = "http://fr.wikipedia.org/wiki/point_in_polygon" rel = "Nofollow Noreferrer"> en.wikipedia.org/wiki / POINT_IN_POLYGON >


Essayez de trouver l'altitude .. si c'est 0 ... puis dans 99% de cas, il n'y a pas de terre


@Tontymkenu est l'altitude disponible hors ligne?


Pour trouver la frontière d'un ensemble de points est plus complexe qu'il ne semble. Il est très bien décrit dans le lien ci-dessous, malheureusement sans algorithme. Peut-être que cela aide un peu. Google.de/...


Merci @ Reinhardmänner La présentation est très perspicace. En outre, cela démontre jusqu'où je viens d'une solution concrète :)


J'ai fourni une réponse que j'espère que c'est utile, même si je n'ai pas de source à la main, désolé. J'aimerais poser quand même - ne pensez-vous pas que les gens ayant besoin d'une application pour leur dire s'ils sont en mer ou non, sont susceptibles d'avoir des problèmes plus graves que d'une application susceptible de résoudre? :-)


uppote pour une question soignée


Pourquoi essayer une approche complexe lorsque Apple nous a déjà donné des outils? (Vérifiez ma réponse)


4 Réponses :


6
votes

J'ai passé un certain temps à la recherche d'un algorithme robuste pour ce faire sur la sphère pour le fuseau horaire regarder et n'a même pas trouver une bonne pseudocode, et encore moins c / c ++ J'étais tout à fait heureux avec . Je vais courir à travers ce que je trouve. Je vais finir avec les ressources qui pourraient être utilisées pour mettre cela ensemble assez facilement.

Il est facile ... Sur le plan

Le problème est connu sous le nom "Point Polygon" .

A fréquemment utilisé et simple algorithme POP est "Ray Casting" . POP sur le plan 2D repose sur un point à l'infini. Sur le plan ce qui est très facile. Il y a un nombre infini de points à l'infini. Choisissez une! Mais il n'y a pas tel point sur la sphère.

Vous pouvez vous en sortir avec cela si vous avez un point connu à l'intérieur ou à l'extérieur d'un polygone quelconque de requête donnée. Compte tenu de votre cas d'utilisation, ce n'est pas une exigence onéreuse., Vous pouvez facilement choisir une à point dans la mer, et ce sera en dehors de tous des polygones de terre < / p>

Le "Nombre Winding" POP algorithme échoue également (pour autant que je peux voir) parce que sur la sphère, vous pouvez approcher une arête dans l'une des deux directions.

Un algorithme

Je voulais une approche qui fonctionnerait sans point auxiliaire et sans heuristiques (utilisés pour générer un point auxiliaire à partir des données de bord). Si je suis honnête , je voulais parce que je suis convaincu que ce devrait possible, non parce que Je vraiment besoin.

Pour votre cas d'utilisation, vous pouvez vous en sortir avec l'algorithme de coulée habituelle de rayons et un seul point connu pour être dans l'océan, de sorte que vous n'avez pas besoin de compter sur des heuristiques, mais ils ont probablement travail assez bien de toute façon.

L'approche que je suis venu avec des œuvres comme celle-ci ...

  • Vous devrez boucle à travers vos polygones vous-même. Pour chaque polygone ...
  • Trouver un grand cercle à travers votre point d'interrogation et à travers au moins un bord de votre polygone (un point milieu entre les deux coins fera).
  • Intersect le grand cercle avec les bords de votre polygone.
  • L'intérieur du polygone est à droite pendant que vous marchez ses bords dans l'ordre (ou à gauche, si vous préférez). Cela donne à chaque point d'intersection suffisamment d'informations pour savoir de quel côté est l'intérieur ou à l'extérieur.
  • Du point d'intersection la plus proche, vous pouvez déterminer si votre point d'interrogation est à l'intérieur ou à l'extérieur.

    Conseils de mise en œuvre

    Si vous envisagez de mettre en œuvre ce (ou l'un des autres algorithmes POP), ne pas essayer de travailler en sinus ou cosinus.

    représentent tes points (coins du polygone et point d'interrogation) en tant que vecteurs unitaires. Représenter les grands cercles (bords du polygone et le cercle du point d'interrogation est activé) comme des vecteurs unitaires normaux par rapport au plan que la grande est en marche. Utiliser le produit scalaire et produit croisé. Ne pensez pas dans les angles. Pensez à des vecteurs.

    Il ne devrait pas être trop difficile - je ne l'ai pas besoin tout à fait suffisant pour la mettre en œuvre. Prenez contact si vous le souhaitez freelance écrit!

    Liens à partir de laquelle vous pourriez construire une solution

    Le c ++ bibliothèque Boost a un mise en œuvre POP que je l'ai pas non plus comme cela, mais est en grande partie parce que je suis un perfectionniste -. J'imagine qu'il servira le but dans presque tous les cas

    La base de données tz_world contient des polygones pour les masses terrestres, et il y a un GeoJSON variante de celui-ci. Vous pouvez analyser ce bien avec le construit en NSJSONSerialization classe .

    Voici quelques algorithmes par la NASA pour les points et les sphères (je ne l'ai pas comme leur POP bien).


0 commentaires

13
votes

Ne vous inquiétez pas, semble que Apple a déjà pensé à la question!

Si vous recherchez la classe Cligeocoder Classe (Corelocation), il existe un ReverseGeocodélocation: Achèvementhandler: Méthode.

Dans le gestionnaire d'achèvement, vous pouvez récupérer un tableau de CLPLACemark Objets

clplacemark a deux propriétés intéressantes:

[platefark inlandwater]

Pour les coordonnées qui se situent sur un plan d'eau intérieure, cette propriété contient le nom de ce corps d'eau - le nom d'un lac, du ruisseau, de la rivière ou d'une autre voie navigable.

et [STAYEMARK OCEAN]

Coordonnées qui se trouvent sur un océan, cette propriété contient le nom de l'océan.

Vous devez donc seulement inverser-geocode votre emplacement et vérifier si la propriété océan est définie sur le résultat clplacemark objets.


7 commentaires

C'est génial et une solution bien rangée. Beaucoup mieux que mes algorithmes que vous pouvez écrire! Il est dommage que le clplacemark n'inclut pas le décalage de la zone de tétin locale - ce serait doux.


Merci Jérome, est-ce que je peux y parvenir tout en hors ligne?


Le CLGEOCODER API mentionné dans cette réponse est uniquement en ligne.


Pour le mode hors connexion, vous devez créer votre propre base de données à l'aide de la méthode GLGEOCODER, commençons par la Lat X = -90, essayez de long Y = -180 à LONG Y = +180 incrémentation longue par, dites 0,5 à chaque fois. Puis incrémentez la lat et redémarrez. Cela vous donnera une énorme base de données, mais ne vous inquiétez pas. Pour chaque latitude éprouvée, nous essaierons de définir des "gammes" de longitudes "au-dessus de l'océan". Exemple: pour la Latitude -40, vous pouvez avoir 3 gammes [-180; -100] [-60; +40] [+100; +180].


Ce sont ces gammes que vous devriez conserver sur une base de données. Dans votre application, lors de la test de coordonnées, tours la latitude pour avoir une valeur présente dans la base de données (rond à 0,5 avec cet exemple) et tester si votre longitude est ou non à l'intérieur de l'une des gammes de cette latitude


Approche intéressante, je verrai si j'ai les ressources nécessaires pour l'essayer.


Je pense L'accélérateur d'API de géocodage lève les 10 secondes une minute, la création de la base de données peut donc prendre un certain temps.



0
votes

Vous pouvez consulter l'interactivité UTFGRID de MapObbox, qui peut fonctionner hors ligne (soit en cache des carreaux de grille, qui sont essentiellement du texte, ou pré-grouper dans un fichier MBTILES).

Consultez le EXEMPLE DE MAPBOX IOS Toute la troisième onglet, sur la photo dans le README , qui code essentiellement et récupère des informations sur quel pays est exploité. Ceci est fait au niveau de la résolution de pixels, pré-rastérisé fondamentalement, de sorte que vous n'avez pas besoin de quantités massives de données - il ne stocke pas à une résolution plus élevée, car vous ne pouvez pas toucher plus haut qu'une résolution de pixel.


0 commentaires

0
votes

Utilisation: xxx

voir Cette question


0 commentaires