Pieren a écrit :
Arrête, j'en tremble déjà. Bon j'ai peut-être des solutions mais c'est à tester. Pas chez nous. Ca n'a rien de difficile, c'est déjà dans le logiciel et c'est de loin le plus simple que j'ai eu à coder, c'est quelques lignes. Entre les projections, les communications avec le cadastre et l'api, le parser SVG, le reconnaissance des chiffres, ... Comme tu le dis au dessus, je ne veux pas générer des erreurs en nombre automatiquement, j'aimerai rester dans l'acceptable. Et dans ce cas, à moins de m'expliquer une méthode pour assurer un nombre tolérable d'erreur, pour ma part je ne m'engage pas là dessus. Mais rien n'empêche par la suite d'associer automatiquement les adresses aux bâti les plus proches, ca n'a rien de difficile même à l'échelle de la France car c'est finalement très peu de points. Je donnerai tous les éléments si qqun souhaite le faire. double Distance(ref PointD pt1seg, ref PointD pt2seg) { double ampx = pt2seg.X - pt1seg.X; double ampy = pt2seg.Y - pt1seg.Y; return Math.Sqrt((ampx * ampx) + (ampy * ampy)); } PointD IntersectionOrthoPointSegment(PointD ptadr, PointD ptseg1, PointD ptseg2) { PointD ptintersec = new PointD(Double.NaN, Double.NaN); double longueur = Distance(ref ptseg1, ref ptseg2); double déterminant = (((ptadr.X - ptseg1.X) * (ptseg2.X - ptseg1.X)) + ((ptadr.Y - ptseg1.Y) * (ptseg2.Y - ptseg1.Y))) / (longueur * longueur); if (déterminant < 0.0 || déterminant > 1.0) return ptintersec; // le point n'est pas dans le segment ptintersec.X = ptseg1.X + déterminant * (ptseg2.X - ptseg1.X); ptintersec.Y = ptseg1.Y + déterminant * (ptseg2.Y - ptseg1.Y); return ptintersec; } IntersectionVoie VoieLaPlusProche(Adresse adresse, double distancemax) { IntersectionVoie intersection = new IntersectionVoie(); PointD ptcoords = new PointD(adresse.Lon, adresse.Lat); PointD pttmp = new PointD(); double distancemin = double.MaxValue; double distance = double.MaxValue; foreach (VoieAdressable voie in g_Voies) { for (int i = 0; i < voie.Points.Count - 1; i++) { pttmp = IntersectionOrthoPointSegment(ptcoords, voie.Points[i], voie.Points[i + 1]); if (Double.IsNaN(pttmp.X)) continue; distance = Distance(ref ptcoords, ref pttmp); if (distance > distancemax) continue; if (distance > distancemin) continue; distancemin = distance; intersection.Point = pttmp; intersection.IdVoie = voie.IdWay; } } Benoît R. |
_______________________________________________ Talk-fr mailing list Talk-fr@openstreetmap.org http://lists.openstreetmap.org/listinfo/talk-fr