Je travaille avec une zone immense, 7 états de forêt et de non-forêt en utilisant les données NLCD. Dans certaines des zones boisées est un complot (c'est la thèse de mon maître sur lequel je travaille). J'ai perplexe tout le monde que j'ai demande avec ce grand ensemble de donnees, mais nous sommes certains qu'il existe une solution. La zone forêt/non-forêt est un raster signé et discret. J'ai été en mesure de faire la zone boisée en polygones en sous-classant la zone boisée. Je ne suis pas capable de faire de la zone non-forestière en polygones (trop grande). J'essayais donc d'obtenir la distance du point (le point est dans le polygone) jusqu'au bord du polygone boisé. Avez-vous des suggestions pour obtenir la distance d'un point à la lisière de la forêt?distance d'un point dans un polygone à un bord de polygone
Répondre
Eh bien, cela dépend vraiment d'un certain nombre de choses; spécifiquement, quel bord voulez-vous? Voulez-vous trouver l'arête la plus proche, ou avez-vous d'autres critères pour lesquels vous souhaitez sélectionner un arête (par exemple, direction cardinale)?
Si vous souhaitez trouver l'arête la plus proche, vous voulez essentiellement parcourir tous les segments de ligne définis par le polygone, en effectuant un calcul de distance de segment à point; cela trouvera votre distance. Il y a une bonne implémentation de l'algorithme en Python sur la question this, et il y a une bonne description des algorithmes.
Si vous n'êtes pas sûr que le point est dans le polygone externe, testez-le en premier. Ensuite, pour tester la distance lisière de la forêt la plus proche, vous pouvez essayer quelque chose comme ceci:
http://www.bdcc.co.uk/Gmaps/BdccGeo.js
Google a une foule de résultats pour « distance du point au bord du polygone »
Voici quelques code qui produit la distance d'un point à un bord, que le polygone soit convexe ou non, CCW ou non. Vous devrez tester tous les bords de vos polygones. Cela peut être un peu lent pour un grand nombre d'arêtes.
- (double) distanceFromPoint:(yourPoint)testPoint
{
double pointX = edgePointB.x - edgePointA.x;
double pointY = edgePointB.y - edgePointA.y;
double k = pointX * pointX + pointY * pointY;
double u = ((testPoint.x - edgePointA.x) * pointX + (edgePointA.y - edgePointA.y) * pointY)/k;
if (u > 1)
u = 1;
else if (u < 0)
u = 0;
double x = edgePointA.x + (u * pointX);
double y = edgePointA.y + (u * pointY);
double dx = x - testPoint.x;
double dy = y - testPoint.y;
return sqrt((dx * dx) + (dy * dy));
}
Fonctionne parfaitement, mais vous avez fait une faute de frappe: u = ((testPoint.x - edgePointA.x) * pointX + (* testPoint.y * - edgePointA.y) * pointY)/k; – scippie
Pouvez-vous être un peu plus précis sur ce que vous voulez? Voulez-vous une distance moyenne, ou la distance la plus courte? Autre chose? – Breton
Le polygone est-il convexe? – Dave
Aussi, vous allez calculer cela pour plusieurs points, non? – Dave