Suite

Créer des polylignes à partir de tableaux de points

Créer des polylignes à partir de tableaux de points


Permettez-moi de décrire la configuration des données. Une ligne a été fournie sous la forme d'un tableau de paires de coordonnées, une pour chaque sommet. Ce tableau est de taille variable, de 2 à 200 paires de coordonnées par ligne. Ce que j'essaie de comprendre, c'est la meilleure façon de créer ces lignes. Arcpy et ArcObjects sont deux options viables, mais ArcObjects est préféré en raison de sa vitesse (généralement).

J'ai réfléchi à quelques méthodes, mais elles échouent pour une raison ou une autre :

1) Je pourrais utiliser la classe Polyline avec arcpy pour créer des polylignes, puis copier des entités, mais la géométrie résultante n'aurait aucune des attributions nécessaires pour identifier lesdits points.

2) Je pourrais utiliser XY To Line, mais cela ne fonctionne qu'avec une paire de points, et j'ai besoin de quelque chose de beaucoup plus robuste.

Le long et court est que j'ai besoin d'une méthode qui peut créer une polyligne à partir de tableaux et maintenir un schéma pour les données que j'ai créées dans une table. Une idée que j'ai est de créer cette table et ce schéma, puis de créer la polyligne et de copier sonfaçonnerpropriété à la table de sortie, le portage sur l'ID et toute autre attribution est nécessaire. Comment puis-je créer la propriété de forme de la polyligne sans recourir à un fichier de formes intermédiaire ? Ou, s'il y a une meilleure méthode qui vous vient à l'esprit, partagez-la avec moi.

Mettre à jour Ce code semble fonctionner !

IFeatureClass fClass = gpUtil.OpenFeatureClassFromString(chemin); IFeatureCursor curseur = fClass.Insert(true); IFeatureBuffer buffer = fClass.CreateFeatureBuffer();  string[] nodearray = a.Split(';'); foreach (chaîne i dans nodearray) { query.WhereClause = ""PNT_ID" = '" + i+"'"; Console.WriteLine(query.WhereClause.ToString()); ICursor search = table.Search(query, false); IRow row = search.NextRow(); float x = float.Parse(row.get_Value(2).ToString()); float y = float.Parse(row.get_Value(3).ToString()); int id = int.Parse(row.get_Value(1).ToString()); point.X = x; point.Y = y; point.ID = identifiant; point.SpatialReference = sRef; pCollection.AddPoint(point, ref Manquant, ref Manquant); } IGéométrie5 polygéo = (IGéométrie5)pCollection; buffer.set_Value(1, polygeo); buffer.set_Value(2, wayid); curseur.InsérerFeature(tampon);

On dirait que je l'ai. j'ai créé unIPointclasse et l'a utilisé pour remplir unIPointCollectioninstancié comme unPolylineClass. Ensuite, j'ai jeté la collection surIGéométrie5et l'a utilisé commefaçonnerchamp pour la ligne dans ma classe d'entités en sortie, en copiant l'ID avec un tampon.

J'ai tourné la tête en quelques cercles en travaillant avec deux entrées, mais cela semble bien fonctionner.


Je suis aux prises avec un schéma similaire ici.

Je dois identifier les lignes et leurs sommets et maintenir une relation Ligne a sommet entre elles. Je pense que j'ai affaire à une exigence plus importante (je n'en suis pas sûr), mais nous l'implémentons en tant que vues et extensions de classe d'entités (en grande partie pour maintenir nos tables de "segments")

le schéma de base est

Nom de la table de ligne (PK)

Nom de la table de points (PK)

LineSegmentTable LineName (FK) ID Ordre FromPoint (FK) ToPoint (FK)

Géométrie du nom LineView

Dans votre cas, une table de "sommets" pourrait être plus appropriée. Nous fonctionnons également sur Oracle.


Python géospatial

Cet exemple de script python de base montre comment créer une ligne entre deux points. ESRI a un bon article technique sur la façon de créer une ligne en utilisant python, mais le leur est un peu plus complexe. Conformément à mon objectif de rendre les choses aussi simples que possible, ce script est la forme la plus basique de création d'une ligne. Le code est très similaire à mon dernier article sur la création d'un point, car toutes les formes complexes dans ArcGIS ne sont en réalité que des points avec des lignes de connexion. Le nouvel objet de ce script est le tableau. Pour rester simple, vous pouvez considérer un tableau comme un endroit pour stocker les coordonnées des points avant de tracer une ligne les reliant. Ainsi, lorsque votre script lit un ensemble de coordonnées pour un point, vous les stockez dans un tableau. Ensuite, une fois que vous avez tous les points qui composent la ligne dans le tableau, le script indique au géoprocesseur de créer la ligne reliant les points. Cette fois, je n'ai ajouté que des commentaires très simples, c'est plus proche de ce à quoi ressembleraient les scripts que vous trouvez sur Internet. J'ai également laissé de côté toute gestion des erreurs, c'était pour mettre l'accent sur les parties les plus élémentaires du script. Ne vous inquiétez pas, il reviendra la prochaine fois.

importer sys, chaîne, os, arcgisscripting
gp = arcgisscripting.create()
gp.OverWriteOutput = True

# Définir le dossier de sortie et le nom du fichier

outFolder = r”C:Temp”
outFile = “SingleLine.shp”

# Définir l'espace de travail
gp.workspace = outFolder

# Attribuez les valeurs des coordonnées x et y aux variables de départ

StartXcoord = -63.650997
StartYcoord = 44.679996

# Attribuez les valeurs des coordonnées x et y aux variables de fin
EndXcoord = -74.011221
EndYcoord = 40.663962

# Attribuer la référence spatiale
sr = gp.CreateSpatialReference (“C:Program FilesArcGISCoordinate SystemsGeographic Coordinate SystemsWorldWGS 1984.prj”, “#”, “#”, &# 8220#”, “#”, “#”)

# Créez la classe d'entités à laquelle la ligne sera ajoutée
gp.CreateFeatureClass (outFolder, outFile, “POLYLINE”, “#”, “#”, “#”, sr)

# Créez le curseur d'insertion et pointez-le sur le fichier que vous venez de créer
cur = gp.InsertCursor (outFile)

# Déplacer le curseur pour pointer sur la première ligne vide du fichier

# Créez l'objet Array pour stocker les points de la ligne
LineArray = gp.CreateObject(“Array”)

# Créez l'objet Point pour stocker les coordonnées des points

pnt = gp.CréerObjet (“Point”)

# Définir les coordonnées de départ x & y
pnt.x = StartXcoord
pnt.y = StartYcoord

# Ajouter le point au tableau

# Définir les coordonnées de fin x & y
pnt.x = EndXcoord
pnt.y = EndYcoord

# Ajoutez à nouveau le point au tableau

# Définissez la propriété de forme de la première ligne du fichier de formes sur les valeurs contenues dans le LineArray. Comme nous devions définir le type de fichier de formes (polyligne) lors de l'utilisation de CreateFeatureClass, la propriété shape du fichier sait qu'elle doit créer des lignes entre chaque point du tableau.


Propédades

Renvoie une représentation JSON de la géométrie sous forme de chaîne.

La chaîne renvoyée peut être convertie en dictionnaire par la fonction eval de Python.

Renvoie la représentation binaire bien connue (WKB) pour la géométrie OGC. Il fournit une représentation portable d'une valeur géométrique sous la forme d'un flux contigu d'octets.

Renvoie la représentation textuelle connue (WKT) pour la géométrie OGC. Il fournit une représentation portable d'une valeur géométrique sous forme de chaîne de texte.

L'aire d'une entité surfacique. Vide pour tous les autres types d'entités.

Le véritable centroïde s'il se trouve dans ou sur l'entité, sinon, le point d'étiquette est renvoyé. Renvoie un objet point.

L'étendue de la géométrie.

Le premier point de coordonnées de la géométrie.

Une chaîne délimitée par des espaces des paires de coordonnées du rectangle à enveloppe convexe.

Vrai, si le nombre de pièces pour cette géométrie est supérieur à un.

Le point où se trouve l'étiquette. Le labelPoint est toujours situé dans ou sur une entité.

La dernière coordonnée de l'entité.

La longueur de l'entité linéaire. Zéro pour les types d'entités point et multipoint.

La longueur 3D de l'entité linéaire. Zéro pour les types d'entités point et multipoint.

Le nombre de pièces géométriques pour la fonction.

Le nombre total de points pour l'entité.

Le centre de gravité d'une entité.

Le type de géométrie : polygone, polyligne, point, multipoint, multipatch, cote ou annotation.


Pouvez-vous ajouter/supprimer des points d'une polyligne dans Google Dessins ?

Dans Google Drawings, vous pouvez créer une polyligne, c'est-à-dire une ligne contenant des points où la ligne peut être "pliée". Une fois que vous avez créé la polyligne avec un certain nombre de points, vous pouvez modifier la polyligne pour changer l'emplacement et l'orientation des points.

Existe-t-il un moyen d'ajouter ou de supprimer des points ?

Ou devez-vous créer une nouvelle ligne ?

Cette page de 2010 dit que cette fonctionnalité n'existe pas. Je n'ai rien trouvé de plus récent qui dit d'une manière ou d'une autre.


Voir les propriétés pour une liste de toutes les propriétés qui peuvent être transmises au constructeur.

Le cache est utilisé pour stocker des valeurs calculées à partir de géométries qui doivent être effacées ou recalculées lors de la mutation.

L'étendue de la géométrie.

Indique si la géométrie a des valeurs M.

Indique si la géométrie a des valeurs z (élévation).

Un tableau de chemins, ou segments de ligne, qui composent la polyligne.

La référence spatiale de la géométrie.

Détails de la propriété

Le cache est utilisé pour stocker des valeurs calculées à partir de géométries qui doivent être effacées ou recalculées lors de la mutation. Un exemple est l'étendue d'un polygone.

Le nom de la classe. Le nom de classe déclaré est au format esri.folder.className .

L'étendue de la géométrie. Pour un point, l'étendue est nulle.

Indique si la géométrie a des valeurs M.

Indique si la géométrie a des valeurs z (élévation).

Valeurs Z définis dans un système de coordonnées géographiques ou métriques sont exprimés en mètres. Cependant, dans les scènes locales qui utilisent un système de coordonnées projetées, les unités verticales sont supposées être les mêmes que les unités horizontales spécifiées par le service.

Un tableau de chemins, ou segments de ligne, qui composent la polyligne. Chaque chemin est un tableau bidimensionnel de nombres représentant les coordonnées de chaque sommet du chemin dans la référence spatiale de la vue. Chaque sommet est représenté par un tableau de deux, trois ou quatre nombres. Le tableau ci-dessous montre les différentes structures d'un tableau de sommets.


La classe WeightedLocation exprime visuellement des données pondérées ainsi que des informations géographiques. Un poids de données est normalisé dans la plage 0-1 .

Le sous-module de visualisation gère en interne toutes les données avec une instance WeightedLocation. Si aucun poids n'est appliqué aux données, 1 est utilisé par défaut.

Les poids normalisés pour chaque type de visualisation sont les suivants :

    : Un poids dans une carte thermique représente l'intensité d'impact de chaque point. La plage d'intensité est de 0,1-1. L'intensité sans poids est de 1 . : Un poids dans une carte de densité de points est utilisé comme rayon d'un point. La plage d'un rayon est 1- . Un rayon sans poids est un rayon personnalisé .

Il existe plusieurs façons de créer des données pondérées pour les informations géographiques. Comme dans le code ci-dessous, vous pouvez créer une nouvelle instance avec l'opérateur new.

Ou vous pouvez utiliser des données littérales comme dans le code ci-dessous. Ensuite, le sous-module de visualisation le convertit en interne en WeightedLocation.


Masquage avec des fichiers de formes

Les données de modèle maillées manquent généralement d'informations telles que le pays auquel appartiennent les cases de la grille. Ces informations sociales ou politiques sont disponibles sous forme de données vectorielles, c'est-à-dire de segments de ligne qui entourent les zones respectives. Un format courant pour cela est le " ESRI shapefile ". Comment utiliser ces informations de forme dans l'analyse et la visualisation de données avec NCL et en dehors des systèmes d'information géographique (SIG) est décrit dans cet article, plus précisément comment convertir les fichiers de formes ESRI en NetCDF et comment les utiliser correctement.

Bienvenue dans le premier article du blog Vis @DKRZ !

Beaucoup d'entre vous ont peut-être rencontré le problème de ne visualiser qu'une partie régionale d'un ensemble de données plus vaste pour illustrer la situation d'un pays ou d'une région spécifique. C'est simple pour une visualisation régionale d'un sous-ensemble rectangulaire de la grille du modèle, mais si seules les valeurs de données dans une forme irrégulière (telles que les frontières politiques) doivent être affichées, cela devient plus difficile. Ici, fichiers de formes peut vous aider à analyser et/ou visualiser des données à l'intérieur de limites de forme irrégulière.

Dans cet article de blog, nous donnons un exemple de création d'un masque quadrillé basé sur une polyligne fermée définie dans un fichier de formes afin d'analyser et/ou de visualiser des données quadrillées uniquement à l'intérieur de celui-ci.

Les fichiers de formes peuvent contenir des données géométriques telles que les frontières d'un pays ou d'un État, des villes, des voies de circulation, des rivières, des plans d'eau et des données connexes telles que la population, la végétation, etc. Les informations géospatiales sont stockées sous forme de géométries telles que des « points », des « polylignes ». ou « polygones ».

Un shapefile n'est en fait pas un seul fichier, c'est plutôt un ensemble de fichiers contenant différentes parties de l'information. Les plus importants sont :

  • un fichier .shp, qui contient la géométrie
  • un fichier .shx, qui contient l'index de position de la géométrie de l'entité
  • un fichier .dbf, qui contient les attributs de chaque forme

Notez que la plupart des applications ont besoin de l'ensemble complet de fichiers pour fonctionner correctement, même si vous ne chargez que le fichier '.shp'.

L'ensemble de fichiers de formes utilisé pour cet article peut être téléchargé à partir de
https://www.diva-gis.org/gdata
(-> Allemagne -> zones administratives -> DEU_adm.zip)

Ici, nous utilisons DEU_adm0.shp et DEU_adm1.shp.

1. Que contient le shapefile ?

NCL fournit l'outil de ligne de commande ncl_filedump qui donne un résumé du contenu du shapefile.

Le shapefile contient quelques variables, mais pour le moment nous n'avons pas besoin d'en savoir plus sur son contenu à part le fait que les variables x et y sont les coordonnées lon/lat de la frontière de l'Allemagne.

2. Créez un fichier de masque NetCDF à partir du fichier de formes

Pour créer un fichier de masque basé sur le fichier de formes, nous avons besoin d'un deuxième fichier avec la description de la grille pour le fichier de sortie.

Supposons que nous voulions créer un masque quadrillé pour l'Allemagne qui contienne un "0" pour les cellules de la grille en dehors de l'Allemagne et un "1" pour celles à l'intérieur. Le fichier de masque de sortie doit avoir une résolution de grille de 0,1x0,1 degrés et englober la région de l'Allemagne.

Si vous avez un fichier de grille 0,1x0,1 deg, tout va bien. Sinon, vous pouvez facilement en générer un (global) avec CDO (Climate Data Operators). Ici, nous utilisons la grille de topographie intégrée et la remappons à la résolution de sortie souhaitée :

Étant donné que NCL est capable de lire les fichiers de formes et fournit certaines fonctions de fichiers de formes, le script suivant est écrit dans le langage de commande NCL. Vous devrez d'abord télécharger la bibliothèque à partir de NCAR afin d'utiliser ces fonctions de fichier de formes :

Pour une utilisation ultérieure, nous sauvegardons le fichier dans $HOME/NCL/shapefiles/.

Il s'agit d'un script NCL qui crée un masque pour l'Allemagne sur une grille 0,1x0,1deg et l'enregistre dans un fichier netCDF :

Pour vérifier le résultat, vous pouvez visualiser le contenu du fichier masque avec ncview ou Panoply.

3. Masquez vos données à l'aide du fichier masque

Nous voulons uniquement utiliser les données à l'intérieur de l'Allemagne, les valeurs en dehors de l'Allemagne ont été définies sur la valeur manquante. Comme nous n'avons pas de données réelles à montrer, nous prenons les données topographiques que CDO propose déjà.

a) Masquage sur la même grille

Nous prenons le fichier topo_0.1x0.1deg_global.nc d'en haut et utilisez simplement CDO avec l'opérateur 'mul' pour multiplier le fichier de données avec le fichier de masque (les deux ont la même grille).

b) Masquage vers une autre grille

Si, par exemple, la grille de vos données d'entrée est sur une grille de 1x1 degré, vous devrez d'abord remapper le fichier de masque également sur une grille de 1x1 degré. Encore une fois, CDO peut être utilisé pour remapper le fichier de masque sur la grille de votre fichier de données.

Fichier de données: topo_1x1deg_global.nc
Fichier de masque : DEU_adm0_mask_array_0.1x0.1deg_global.nc

Remappez le masque sur la grille du fichier de données d'entrée :

Sélectionnez une sous-région plus petite pour l'Allemagne :

4. Visualisez les données masquées avec NCL

Les données traitées peuvent maintenant être tracées avec NCL, par exemple :

5. Sélectionnez une partie du fichier de formes avec NCL

Vous pouvez également utiliser uniquement NCL pour lire un fichier de formes et sélectionner des données pour une région. L'exemple suivant montre comment sélectionner et tracer les données pour l'état fédéral Schleswig-Holstein en Allemagne à l'aide du fichier de formes DEU_adm1.shp.

Maintenant, nous devons regarder de plus près le contenu du fichier de formes avec ncl_filedump

Ce que vous pouvez voir immédiatement dans la partie dimensions, c'est qu'il y a 16 entités, 125 segments et un total de 207860 points. Les 16 entités sont les états fédéraux dont les noms sont stockés dans la variable NAME_1.

Connaissant l'indice correspondant d'un État fédéral, vous pouvez lire ses polygones à l'aide des fonctions NCL standard. Avec la fonction gc_inout NCL offre également la possibilité de vérifier si les points des données sont dans un polygone ou non. Si seuls ces points sont enregistrés dans un nouveau tableau, les données peuvent être dessinées très facilement par la suite.
L'exemple de script suivant crée un tracé de carte de base sur lequel le tracé de contour et les polylignes du fichier de formes pour l'État fédéral Schleswig-Holstein (index 14) sont superposés.


Eigenschaften

Renvoie une représentation Esri JSON de la géométrie sous forme de chaîne.

La chaîne renvoyée peut être convertie en dictionnaire à l'aide de la fonction Python json.loads.

Renvoie la représentation binaire bien connue (WKB) pour la géométrie OGC. Il fournit une représentation portable d'une valeur géométrique sous la forme d'un flux contigu d'octets.

Renvoie la représentation textuelle connue (WKT) pour la géométrie OGC. Il fournit une représentation portable d'une valeur géométrique sous forme de chaîne de texte.

Toutes les vraies courbes de la géométrie seront densifiées en courbes approximatives dans la chaîne WKT.

L'aire d'une entité surfacique. Vide pour tous les autres types d'entités.

Le véritable centroïde s'il se trouve dans ou sur l'entité, sinon, le point d'étiquette est renvoyé. Renvoie un objet point.

L'étendue de la géométrie.

Le premier point de coordonnées de la géométrie.

Une chaîne délimitée par des espaces des paires de coordonnées du rectangle à enveloppe convexe.

True , si le nombre de pièces pour cette géométrie est supérieur à un.

Le point où se trouve l'étiquette. Le labelPoint est toujours situé dans ou sur une entité.

La dernière coordonnée de l'entité.

La longueur de l'entité linéaire. Zéro pour les types d'entités point et multipoint.

La longueur 3D de l'entité linéaire. Zéro pour les types d'entités point et multipoint.

Le nombre de pièces géométriques pour la fonction.

Le nombre total de points pour l'entité.

La référence spatiale de la géométrie.

Le centre de gravité d'une entité.

Le type de géométrie : polygone, polyligne, point, multipoint, multipatch, cote ou annotation.


Ajouter des polygones de carte

Un MapPolygon est une forme qui se compose d'au moins trois coordonnées, sinon il ne peut pas être rendu. Semblable à MapPolyline , les coordonnées sont connectées. Les polygones peuvent être utiles pour mettre en évidence une zone sur la carte.

Noter: L'ordre des coordonnées compte.

Voir l'exemple ci-dessous sur la façon dont un polygone peut être créé. Les coordonnées sont connectées en fonction de leur ordre dans la liste. La forme résultante peut être remplie d'une couleur à l'aide d'une nouvelle instance MapPolygonStyle :

Un MapPolygon se compose de trois éléments :

  • Une liste de trois coordonnées géographiques ou plus qui définissent où placer le polygone sur la carte.
  • Un GeoPolygon qui contient cette liste de coordonnées.
  • Un MapPolygonStyle pour définir comment visualiser le polygone. Assurez-vous de définir au moins une couleur, sinon le MapPolygon restera invisible.

Puisqu'un polygone est défini par trois points ou plus, vous devez créer une liste de matrices, qui doit contenir au moins trois GeoCoordinates . Sinon, une exception sera levée. En utilisant la classe MapPolygonStyle, des attributs tels que l'ordre de dessin ou la couleur peuvent être définis. Cela peut être une couleur de remplissage, comme indiqué ci-dessus, ou une couleur de trait (et éventuellement une largeur de trait) pour spécifier le contour - ou les deux : De cette façon, vous pouvez créer des polygones de carte remplis et non remplis. Voir pour un exemple la capture d'écran.

La définition d'un ordre de tracé peut être utile pour définir quel élément de la carte doit être rendu le plus haut. Les valeurs les plus élevées seront dessinées au-dessus des valeurs les plus basses. Notez que les marqueurs de carte seront toujours dessinés au-dessus de tout ce qui est rendu sur la carte, tandis que les polylignes de carte sont toujours dessinées sous les bâtiments extrudés, les étiquettes et autres polygones de carte et cercles de carte. Le cas d'utilisation le plus courant des polylignes de carte est de rendre un itinéraire sur la carte, tandis que les marqueurs de carte sont censés indiquer un emplacement, ils ne doivent donc pas être masqués.

  • L'ordre de tracé des polylignes de la carte n'est efficace que par rapport aux autres polylignes de la carte.
  • L'ordre de tracé des polygones de carte et des cercles de carte n'est efficace que par rapport aux autres polygones et cercles de carte.

Veuillez noter que l'ordre chronologique dans lequel les éléments de la carte sont ajoutés à la carte ne ne pas influencer quel élément est rendu en premier. La valeur par défaut de l'ordre de tracé des éléments cartographiques tels que MapPolyline , MapPolygon et MapCircle est 0. L'ordre de tracé des autres éléments de la carte, tels que les rues ou les rivières, dépend du style de carte que vous utilisez actuellement - il peut être adapté pour une carte personnalisée styles définis dans un fichier YAML, consultez la section sur les styles de carte personnalisés pour plus d'informations.

Les polygones de carte peuvent être utilisés pour créer des formes complexes remplies ou non remplies. Cependant, un polygone auto-sécant peut conduire à des résultats indésirables car les coordonnées sont connectées dans l'ordre de la liste. Comme alternative, vous pouvez ajouter plusieurs polygones - ou assurez-vous d'ajouter les coordonnées telles qu'elles apparaissent sur le contour de la forme souhaitée.

Veuillez noter que, contrairement à une polyligne de carte, le contour d'un polygone de carte est connecté automatiquement entre la dernière coordonnée et la première coordonnée de la liste.

Après avoir créé un ou plusieurs polygones de carte, vous pouvez les ajouter à une scène de carte avec :

Si un polygone de carte est déjà associé à une scène de carte, toute nouvelle tentative de l'ajouter à nouveau sera ignorée.

Capture d'écran : Affichage d'un polygone.

Notez qu'une vue de carte ne permet qu'une seule scène et que tous les éléments de la carte sont placés directement dessus. Si vous souhaitez regrouper vos éléments de carte, vous souhaiterez peut-être les organiser à l'aide d'un tableau et les ajouter ou les supprimer individuellement.

Un mapPolygon peut être immédiatement supprimé de la carte en appelant :

Noter: Les éléments MapPolygon sont sélectionnable et il est possible de stocker des métadonnées qui peuvent être récupérées lors de la sélection de l'article. Pour un exemple, voir la section ci-dessous sur les marqueurs de carte.

Mettre à jour le style de polygone

Comme vous l'avez vu ci-dessus, la couleur de remplissage et d'autres propriétés telles que la largeur du trait de contour peuvent être spécifiées à l'aide d'une instance MapPolygonStyle. Il est possible de modifier dynamiquement les propriétés déjà appliquées. Pour cela, vous n'avez pas besoin de créer une nouvelle instance MapPolygonStyle.

Au lieu de cela, vous pouvez réutilisation le style actuel après l'ajout d'un polygone de carte à une scène de carte, modifiez certaines de ses propriétés et appelez la méthode updateStyle() sur l'instance de polygone de carte - il vous suffit de transmettre l'instance de style mise à jour en tant que paramètre. L'apparence sur la carte changera instantanément. Par exemple, vous pouvez créer des polygones de carte animés de cette manière.


Ajouter des marqueurs de carte

Vous pouvez utiliser des marqueurs de carte pour pointer avec précision un emplacement sur la carte. Les marqueurs de carte seront toujours dessinés au-dessus de tout ce qui est rendu sur la carte.

La méthode suivante ajoutera un marqueur de carte à la carte :

Dans cet exemple, nous chargeons un PNG ("here_car.png") à partir des ressources et créons une MapImage à partir de celui-ci. Cette MapImage peut ensuite être définie sur une instance de MapMarker.

Le SDK HERE pour Android prend en charge les ressources PNG avec ou sans transparence (canal alpha) - ainsi que toutes les autres ressources bitmap courantes prises en charge nativement par Android. Les graphiques vectoriels ne sont pas encore pris en charge, même lorsqu'ils sont convertis de SVG en une représentation XML dans Android Studio.

Pour voir l'image, nous devons ajouter le MapMarker à une scène de carte. Veuillez noter que la MapImage sera affichée centrée sur les coordonnées géographiques fournies.

Capture d'écran : Affichage d'images de carte placées au hasard. Le cercle rouge de la carte en haut marque l'emplacement du marqueur.

Vous pouvez également mettre à jour les coordonnées géographiques après l'ajout du marqueur à la carte : il apparaîtra instantanément au nouvel emplacement après l'appel de mapMarker.setCoordinates().

Veuillez noter que l'ordre chronologique dans lequel les marqueurs de carte sont ajoutés à la carte détermine quel marqueur est rendu en premier. Cela peut être ajusté en définissant un ordre de tirage.

Marqueurs de POI ancrés

Par défaut, chaque image est centrée sur l'emplacement fourni, et vous souhaiterez peut-être modifier cela pour certains types de marqueurs. Un exemple est le marqueur de POI, qui pointe généralement vers l'emplacement avec sa position en bas au milieu.

Par conséquent, l'emplacement où l'image est rendue doit être déplacé. Le centre par défaut se situe à (0,5, 0,5). Si le coin inférieur droit de la vue doit pointer vers l'emplacement défini pour les coordonnées géographiques, le point d'ancrage doit être défini sur (1, 1).

Les points d'ancrage offrent un moyen pratique de spécifier l'emplacement où un marqueur doit être rendu : le coin supérieur gauche correspond à un point d'ancrage de (0, 0) tandis que le coin inférieur droit correspond à un point d'ancrage de (1, 1). Indépendamment de la taille de la vue, le point qui fait la moitié de la largeur ou de la hauteur sera toujours de 0,5 - ceci est similaire au concept de coordonnées UV de texture normalisées.

Illustration : Les points d'ancrage normalisés peuvent spécifier n'importe quel emplacement à l'intérieur ou à l'extérieur d'un marqueur de carte.

Si vous souhaitez déplacer le POI pour qu'il pointe vers l'emplacement, vous pouvez conserver l'emplacement central par défaut (0,5), mais vous devez décaler l'image vers le haut de 1. 1 est aussi long que la hauteur de l'image. Notez que vous pouvez également spécifier des valeurs supérieures à 1 ou inférieures à 0, afin de pouvoir déplacer l'image vers n'importe quel emplacement possible. 2 représenterait le double de la hauteur de l'image et ainsi de suite.

Pour ajouter un marqueur de POI ancré à la carte, consultez l'exemple ci-dessous :

Pour l'exemple ci-dessus, une image de POI personnalisée appelée "poi.png" est ajoutée dans différentes résolutions au projet. La plate-forme Android choisira la résolution d'image appropriée en fonction de la densité d'affichage de l'appareil. Voir l'exemple d'application qui l'accompagne sur la façon dont cela peut être fait.

Capture d'écran : Affichage des marqueurs de carte placés au hasard. Le cercle rouge de la carte marque l'emplacement d'ancrage du marqueur.

Contrairement aux polylignes, chaque MapImage conservera sa taille, quel que soit le zoom avant ou arrière de la carte.

Choisir des marqueurs de carte

Après avoir ajouté les marqueurs de carte sur la carte, vous pouvez utiliser un écouteur de gestes tactiles pour savoir si un utilisateur a tapé sur un marqueur de carte :

Dès que le geste de toucher est détecté, nous pouvons utiliser les coordonnées de vue de l'emplacement touché sur l'écran pour demander à la vue de la carte les marqueurs de carte autour de cet endroit. Dans la plupart des cas, la spécification d'un rayon de deux pixels est adéquate. Ensuite, le PickMapItemsCallback permet d'accéder aux éléments de carte trouvés, tels qu'un MapPolygon ou un MapMarker .

Par convention, le SDK HERE utilise des écouteurs pour les événements récurrents tels que les événements de geste. Les événements uniques, qui ne doivent être traités qu'une seule fois, nécessitent un rappel.

Lors de la sélection d'éléments du même type, vous pouvez comparer les instances en appelant la méthode equals() remplacée.

Ajout de métadonnées

Dans de nombreux cas, les utilisateurs peuvent vouloir interagir avec les marqueurs affichés - par exemple, en appuyant sur un résultat de recherche pour voir plus de détails sur un restaurant. À cette fin, un MapMarker peut contenir une instance de la classe Metadata, il est donc possible d'y attacher divers types de données - même les types personnalisés sont pris en charge.

Les métadonnées peuvent contenir plusieurs paires clé/valeur. Ci-dessous, nous créons une nouvelle clé nommée "key_poi" et définissons une chaîne comme valeur contenant les informations sur le type du marqueur :

Certes, vous pouvez définir toutes les informations dont vous pourriez avoir besoin. Au moment où nous voulons lire le contenu d'une instance de métadonnées, nous demandons simplement les données stockées pour une clé, qui est "key_poi" dans notre exemple :

Une instance MapMarker, par défaut, ne contient pas de métadonnées et mapMarker.getMetadata() peut retourner null . Les données accessibles par une clé peuvent également être nulles si l'objet Metadata ne contient pas de telles informations.

Si c'est le cas, nous recherchons la chaîne stockée pour notre clé "key_poi" et appelons une méthode d'assistance pour présenter la chaîne contenue à l'utilisateur. Vous pouvez choisir n'importe quelle chaîne comme clé en fonction de vos préférences, mais utilisez une clé unique, sinon vous écraserez le contenu stocké pour un élément de données différent. Pour voir le code source de l'exemple complet, veuillez vérifier le Exemple d'application MapMarker.

Vous pouvez également stocker des objets personnalisés dans les métadonnées à l'aide de l'interface CustomMetadataValue. Un exemple peut être trouvé dans la section Rechercher où un objet de données de résultat de recherche est stocké dans son ensemble.


Voir la vidéo: Covadis: Lotissement. Morcellement