Trouver le centre de la Foliole polygone?
J'ai un tas de notice de polygones sur une carte que j'ai créée. Chaque polygone représente quelque chose de différent. Un ensemble spécifique de l'information est affichée dans une fenêtre en fonction de la page que l'utilisateur est sur. J'ai besoin de trouver un moyen de faire de la "popup" bulle ouvert dans le centre du polygone qu'il représente.
Chaque polygone est dessiné à l'aide du code suivant:
var L20 = [
[74.0995, -99.92615],
[74.14008, -99.4043],
[74.07691, -99.33838],
[74.03617, -99.86023]
];
var L19 = [
[74.02559, -99.84924],
[74.06636, -99.32739],
[74.0029, -99.26147],
[73.96197, -99.77783]
];
var L18 = [
[73.95142, -99.76684],
[73.99235, -99.25048],
[73.92889, -99.18456],
[73.8878, -99.69543]
];
var set1 = L.polygon([L20, L19, L18], {
color: "#fff",
weight: 1,
stroke: true,
opacity: 0.05,
fillColor: "#346B1F",
}).addTo(map);
Le popup est dessiné à l'aide du code suivant:
var popup = L.popup({})
.setLatLng([73.64017, -100.32715])
.setContent(content).openOn(map);
var popup = L.popup();
Donc j'ai besoin de trouver un moyen pour .setLatLang
pour déterminer ou le centre du polygone.
Je suis venu avec 3 solutions qui peuvent travailler, vous ne savez pas comment vous y prendre.
- trouver un moyen d'utiliser les coordonnées d'un polygone à déterminer le centre du polygone où la popup s'ouvre.
- appel un point du polygone, puis décaler la position de la fenêtre contextuelle.
- Utiliser un id pour chaque polygone, de sorte que chaque popup sait la zone de la boîte (polygone), il peut être ouvert en.
Quelqu'un peut m'aider s'il vous plaît?
OriginalL'auteur Nxlevel | 2014-04-01
Vous devez vous connecter pour publier un commentaire.
Il existe quelques façons de rapprocher le centre de gravité d'un polygone.
La méthode la plus simple (mais moins précise de la méthode) est d'obtenir le centre de la boîte englobante qui contient le polygone, comme yarl suggéré, à l'aide de
polygon.getBounds().getCenter();
J'ai d'abord répondu à la question avec la formule pour trouver le centre de gravité des points, qui peuvent être trouvés en faisant la moyenne des coordonnées de ses sommets.
Tandis que le centre de gravité des points est assez proche rapprochement pour me duper, un intervenant a souligné qu'il n'est pas le centre de gravité du polygone.
Une mise en œuvre basée sur la formule d'un le centre de gravité de la non-auto-intersection polygone fermé donne le résultat correct:
Cette réponse est incorrecte. Imaginez un rectangle qui est légèrement arrondi sur le côté droit. Votre méthode place le centre de gravité le long du bord droit, puisque les deux sommets sur le côté gauche sont sous-représentés dans la moyenne par rapport à la arbitrairement grand nombre sur la droite. Cela fonctionne si chaque point "pèse" le même, mais pas si chaque unité de surface "pèse" le même, ce qui est vraiment ce que tout le monde signifie que, quand ils parlent du centre de gravité d'un polygone.
Merci pour cette remarque @CarlLeth. J'ai corrigé la réponse (je pense). Pouvez-vous vérifiez pour moi?
OriginalL'auteur Steve Clanton
Depuis quelques temps Dépliant a intégré getCenter() méthode:
Pour la plupart des formes, le centre de la boîte englobante sera assez proche du centre du polygone. Les triangles rectangles et en forme de L sont autant d'exemples où la différence est notable, mais c'est beaucoup mieux pour la plupart des cas, je serais d'accord.
Cela ne fonctionnera pas si votre polygone est en forme de U. Le centre de la boîte englobante va le mettre à l'extérieur du polygone.
OriginalL'auteur yarl
Le problème que vous essayez de résoudre est appelé le pôle d'inaccessibilité problème. Trouver le meilleur endroit pour mettre une étiquette dans un polygone n'est pas complètement résolu par trouver le centre de la boîte englobante. Considérons un polygone dans la forme de la lettre U. Le centre de la boîte englobante met l'étiquette à l'extérieur du polygone. Il m'a fallu une éternité pour trouver cette bibliothèque remarquable: https://github.com/mapbox/polylabel
De la README.MD:
var p = polylabel(polygon, 1.0);
OriginalL'auteur Kristopher
en supposant que chaque polygone a seulement 4 faces, c'est simple
à l'aide de cet exemple obtenir un max et min lat: 74.03617 et 74.14008 respectivement si longtemps: -99.92615 et 99.33838 respectivement
Alors d'obtenir la valeur moyenne pour chaque: (max - min) /2 = 0.051955 et -0.293885 puis les ajouter à la quantité minimale
vous donne un centre de
74.088125, -99.632265
puis steves réponse est correcte - mais votre question a trois options au fond et il est plus facile d'apprendre à écrire votre propre code - je me suis adressé à votre question 😛
OriginalL'auteur Graham Ritchie