J'essaie de construire une API qui permettrait de comprendre si un J'ai essayé plusieurs approches pour déterminer si une coordonnée donnée représente une localisation terrestre ou océan: p>
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? P>
Si quelqu'un a déjà eu du mal à ce sujet, j'apprécierais des conseils ici. P> Cllocation code> 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. P>
4 Réponses :
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 em>. 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. P>
Le problème est connu sous le nom "Point Polygon" . P>
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. P>
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 à em> point dans la mer, et ce sera en dehors de tous em> 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. p>
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 em>, je voulais parce que je suis convaincu que ce devrait em> possible, non parce que p> 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, strong> de sorte que vous n'avez pas besoin de compter sur des heuristiques, mais ils ont probablement travail assez bien de toute façon. p>
L'approche que je suis venu avec des œuvres comme celle-ci ... p>
Si vous envisagez de mettre en œuvre ce (ou l'un des autres algorithmes POP), ne pas em> essayer de travailler en sinus ou cosinus. P>
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. P>
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! P>
Le c ++ bibliothèque Boost a un mise en œuvre POP a > 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 p>
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 Voici quelques algorithmes par la NASA pour les points et les sphères (je ne l'ai pas comme leur POP bien). p> Il est facile ... Sur le plan h1>
Un algorithme h1>
Conseils de mise en œuvre h1>
Liens à partir de laquelle vous pourriez construire une solution h1>
NSJSONSerialization classe code>
. P>
Ne vous inquiétez pas, semble que Apple a déjà pensé à la question! p>
Si vous recherchez la classe Dans le gestionnaire d'achèvement, vous pouvez récupérer un tableau de 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. P>
blockQuote>
et Coordonnées qui se trouvent sur un océan, cette propriété contient le nom de l'océan. P>
blockQuote>
Vous devez donc seulement inverser-geocode votre emplacement et vérifier si la propriété Cligeocoder CODE> Classe (Corelocation), il existe un
ReverseGeocodélocation: Achèvementhandler: Code> Méthode. P>
CLPLACemark CODE> Objets P>
clplacemark code> a deux propriétés intéressantes: p>
[platefark inlandwater] code> p>
[STAYEMARK OCEAN] CODE> P>
océan code> est définie sur le résultat
clplacemark code> objets. P>
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 code> 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 CODE> 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 i> 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.
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). p>
Consultez le EXEMPLE DE MAPBOX IOS Toute la troisième onglet, sur la photo dans le README CODE>, 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. p>
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
code> .. 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)