Beispiel #1
0
        private void VisuPointSuppl(double[] p_point, string p_message, int p_tailleDuPoint)
        {
            SpatialTrace.Enable();

            Color param_couleurContour = Color.FromArgb(125, 125, 125);

            SpatialTrace.SetLineColor(param_couleurContour);
            Color     p_couleurCourante;
            IGeometry v_pointGeom;

            p_couleurCourante = Color.FromArgb(50, 50, 50);
            SpatialTrace.SetFillColor(p_couleurCourante);
            v_pointGeom = FLabServices.createUtilitaires().ConstructPoint(p_point[0], p_point[1], 2154).Buffer(p_tailleDuPoint);
            SpatialTrace.TraceGeometry(v_pointGeom, p_message, p_message);
            SpatialTrace.Disable();
        }
Beispiel #2
0
        internal List <BeanPoint_internal> GetPointsTestsXY_RepartitionUniforme(BeanParamGenerationAutoDePointsTests p_paramGenerationPointsTest)
        {
            List <BeanPoint_internal> v_pointsToTest = new List <BeanPoint_internal>();

            try
            {
                Random   v_random = new Random(p_paramGenerationPointsTest.p32_seed);
                double[] v_coord;
                //[Attention: nécessité de passer en int)
                int v_minX = Convert.ToInt32(Math.Round(p_paramGenerationPointsTest.p11_pointBasGaucheX, 0));
                int v_maxX = Convert.ToInt32(Math.Round(p_paramGenerationPointsTest.p13_pointHautDroitX, 0));
                int v_minY = Convert.ToInt32(Math.Round(p_paramGenerationPointsTest.p12_pointBasGaucheY, 0));
                int v_maxY = Convert.ToInt32(Math.Round(p_paramGenerationPointsTest.p14_pointHautDroitY, 0));
                //
                HashSet <string> p_codes = new HashSet <string>();
                string           p_code;
                int v_no = 0;
                for (v_no = 1; v_no <= p_paramGenerationPointsTest.p31_nbrePoints;)
                {
                    v_coord    = new double[3];
                    v_coord[0] = v_random.Next(v_minX, v_maxX);
                    v_coord[1] = v_random.Next(v_minY, v_maxY);
                    v_coord[2] = 0;
                    //
                    BeanPoint_internal v_point = new BeanPoint_internal(v_coord, p_paramGenerationPointsTest.p10_srid);
                    // p_code = FLabServices.createUtilitaires().GethCodeGeogPoint(v_coord);
                    p_code = FLabServices.createUtilitaires().GetHCodeGeogPoint(v_coord);
                    //(On évite les doublons)
                    if (!p_codes.Contains(p_code))
                    {
                        p_codes.Add(p_code);
                        v_pointsToTest.Add(v_point);
                        v_no++;
                    }
                }
            }
            catch (Exception)
            {
                throw;
            }
            return(v_pointsToTest);
        }
Beispiel #3
0
        public void GetVisuPoints(List <BeanPoint_internal> p_points, Color p_couleur, int p_taillePoint, string p_prefixeLabel)
        {
            if (p_points == null && p_points.Count == 0)
            {
                return;
            }
            Geometry v_pointGeom;
            string   v_label;
            int      v_srid = p_points.First().p11_srid;

            //SpatialTrace.Enable();
            //SpatialTrace.SetLineColor(p_couleur);
            foreach (BeanPoint_internal v_point in p_points)
            {
                v_label     = p_prefixeLabel + " " + v_point.p00_id + "\\" + v_point.p00_id;
                v_pointGeom = FLabServices.createUtilitaires().ConstructPoint(v_point.p10_coord[0], v_point.p10_coord[1], v_srid);
                //SpatialTrace.TraceGeometry(v_pointGeom, v_label, v_label);
            }
            //SpatialTrace.Disable();
        }
Beispiel #4
0
        public void GetVisuArcsTopologie(BeanTopologieFacettes p_topologie, Color p_couleur, string p_prefixeLabel)
        {
            if (p_topologie.p12_arcsByCode == null || p_topologie.p12_arcsByCode.Count == 0)
            {
                return;
            }
            Geometry v_arcGeom;
            string   v_label;
            int      v_srid = p_topologie.p11_pointsFacettesByIdPoint.First().Value.p11_srid;

            //SpatialTrace.Enable();
            //SpatialTrace.SetLineColor(p_couleur);
            foreach (KeyValuePair <string, BeanArc_internal> v_arc in p_topologie.p12_arcsByCode)
            {
                v_label   = p_prefixeLabel + " " + v_arc.Value.p00_idArc + "\\" + v_arc.Value.p01_hcodeArc;
                v_arcGeom = FLabServices.createUtilitaires().GetGeometryLine(v_arc.Value.p11_pointDbt.p10_coord, v_arc.Value.p12_pointFin.p10_coord, v_srid, false);
                //SpatialTrace.TraceGeometry(v_arcGeom, v_label, v_label);
            }
            //SpatialTrace.Disable();
        }
Beispiel #5
0
        //
        private bool TestInversionMatrice(double[,] v_matriceSource, double[,] v_matriceInverse, bool p_envoyerMessageSiKo_vf)
        {
            bool v_resultat = true;

            try
            {
                int param_tolerance = 6;
                v_resultat = FLabServices.createCalculLow().IsInversionMatriceOk(v_matriceSource, v_matriceInverse, param_tolerance);
                if (p_envoyerMessageSiKo_vf && !v_resultat)
                {
                    string v_message = "Tests inversion matrice KO \n ";

                    MessageBox.Show(v_message);
                }
            }
            catch (Exception)
            {
                throw;
            }
            return(v_resultat);
        }
Beispiel #6
0
        private void btn_testCH_Click(object sender, EventArgs e)
        {
            List <BeanPoint_internal> v_pointConvexHull;

            v_pointConvexHull = FLabServices.createCalculMedium().GetConvexHull2D(_dataPointsTests);

            //
            string v_message = "ConvexHull calculé";

            v_message += " (" + v_pointConvexHull.Count + " pts sur " + _dataPointsTests.Count + ").";
            v_message += ". Affichez dans SpatialTrace ?";
            if (MessageBox.Show(v_message, "Calcul convexHull", MessageBoxButtons.OKCancel) == DialogResult.Cancel)
            {
                return;
            }

            string v_label       = "";
            Color  v_couleurBase = Color.FromArgb(255, 0, 255, 255);

            FServicesApplicatifs.createVisuSpatialTrace().GetVisuPoints2D(_dataPointsTests, v_label, v_couleurBase, -1);
            v_label = "CH";
            FServicesApplicatifs.createVisuSpatialTrace().GetVisuPoints2D(v_pointConvexHull, v_label, 10);

            SpatialTrace.Enable();
            IGeometry v_ligneCh;

            for (int v_indexPt = 0; v_indexPt < v_pointConvexHull.Count - 1; v_indexPt++)
            {
                v_ligneCh = FLabServices.createUtilitaires().GetGeometryLine(v_pointConvexHull[v_indexPt].p10_coord, v_pointConvexHull[v_indexPt + 1].p10_coord, 2154, true);
                SpatialTrace.TraceGeometry(v_ligneCh, "CH arc: " + v_indexPt, "CH arc: " + v_indexPt);
            }
            v_ligneCh = FLabServices.createUtilitaires().GetGeometryLine(v_pointConvexHull[v_pointConvexHull.Count - 1].p10_coord, v_pointConvexHull[0].p10_coord, 2154, true);
            SpatialTrace.TraceGeometry(v_ligneCh, "CH arc: " + (v_pointConvexHull.Count - 1), "CH arc: " + (v_pointConvexHull.Count - 1));
            SpatialTrace.Disable();
            FVisualisationServices.createVisualisationSpatialTraceServices().AfficheVisu();
            //
            MessageBox.Show("Traitement terminé.");
        }
Beispiel #7
0
        private void btn_testVoronoi_Click(object sender, EventArgs e)
        {
            //
            int param_srid = 2154;

            if (_dataPointsTests == null || _dataPointsTests.Count == 0)
            {
                MessageBox.Show("Générez d'abord les points.");
                return;
            }
            //Il est impératif que tous les points soient distincts:
            Dictionary <string, List <BeanPoint_internal> > v_pourDeduplication;

            v_pourDeduplication = FLabServices.createUtilitaires().GetPointsRegroupesParHCode(_dataPointsTests);
            List <BeanPoint_internal> v_pointsDedupliques = v_pourDeduplication.SelectMany(c => c.Value).ToList();
            //
            BeanTopologieFacettes v_topolFacettes;

            v_topolFacettes = FLabServices.createVoronoiServices().GetTopologieVoronoi(v_pointsDedupliques, param_srid);
            FServicesApplicatifs.createVisuSpatialTrace().GetVisuArcsTopologie(v_topolFacettes, Color.Red, "Vor");
            FServicesApplicatifs.createVisuSpatialTrace().GetVisuIlots(v_topolFacettes, Color.Cyan, "Ilot V");
            FServicesApplicatifs.createVisuSpatialTrace().GetVisuPoints(v_pointsDedupliques, Color.Green, 3, "Pt");
        }
Beispiel #8
0
        public void GetVisuIlots(BeanTopologieFacettes p_topologie, Color p_couleur, string p_prefixeLabel)
        {
            //SpatialTrace.Enable();
            //SpatialTrace.SetFillColor(p_couleur);
            //SpatialTrace.SetLineColor(Color.Blue);
            //SpatialTrace.SetLineWidth(1);

            string v_label;

            foreach (KeyValuePair <int, BeanFacette_internal> v_facette in p_topologie.p13_facettesById)
            {
                if (v_facette.Value.p04_geomFacette != null)
                {
                    v_label = p_prefixeLabel + " Fac " + v_facette.Key;
                    //SpatialTrace.TraceGeometry(v_facette.Value.p04_geomFacette, v_label, v_label);
                }
                else
                {
                    if (v_facette.Value.p02_arcs != null && v_facette.Value.p02_arcs.Count > 0)
                    {
                        //SpatialTrace.SetLineColor(Color.Red);
                        //SpatialTrace.SetLineWidth(3);
                        Geometry v_arcGeom;
                        foreach (BeanArc_internal v_arcPolyg in v_facette.Value.p02_arcs)
                        {
                            v_label = "PB FAC " + v_facette.Key + "_" + p_prefixeLabel + "=> Arc: " + v_arcPolyg.p00_idArc + "\\" + v_arcPolyg.p01_hcodeArc;
                            int v_srid = v_arcPolyg.p11_pointDbt.p11_srid;
                            v_arcGeom = FLabServices.createUtilitaires().GetGeometryLine(v_arcPolyg.p11_pointDbt.p10_coord, v_arcPolyg.p12_pointFin.p10_coord, v_srid, false);
                            //SpatialTrace.TraceGeometry(v_arcGeom, v_label, v_label);
                        }
                        //SpatialTrace.SetLineWidth(1);
                        //SpatialTrace.SetLineColor(Color.Blue);
                    }
                }
            }
            //SpatialTrace.Disable();
        }
Beispiel #9
0
        //
        public void GetVisuPoints2D(List <BeanPoint_internal> p_points, string p_label, Color p_couleurCourante, int p_taillePointAutoSi0OuMoins)
        {
            try
            {
                int param_ratioTaillePoint = 100;
                int v_taillePoints         = p_taillePointAutoSi0OuMoins;
                if (p_taillePointAutoSi0OuMoins <= 0)
                {
                    v_taillePoints = GetTailleAffichageDuPoint(p_points, param_ratioTaillePoint);
                }

                //SpatialTrace.Enable();
                string   v_message;
                Geometry v_pointGeom;

                ////SpatialTrace.SetFillColor(param_couleurCourante);
                //SpatialTrace.SetLineColor(p_couleurCourante);
                foreach (BeanPoint_internal v_point in p_points)
                {
                    v_message = "Pt " + v_point.p00_id + " (" + v_point.p10_coord[2] + " m)";
                    if (p_label != "")
                    {
                        v_message = p_label + "/" + v_message;
                    }

                    v_pointGeom = FLabServices.createUtilitaires().ConstructPoint(v_point.p10_coord[0], v_point.p10_coord[1], v_point.p11_srid).Buffer(v_taillePoints);
                    //SpatialTrace.TraceGeometry(v_pointGeom, v_message, v_message);
                }

                //SpatialTrace.Disable();
            }
            catch (Exception)
            {
                throw;
            }
        }
Beispiel #10
0
        //public BeanTopologie GetBeanTopologieByVoronoiGraph(VoronoiGraph p_voronoiGraph, BeanAlimentationVoronoi p_beanAlimentationVoronoi)
        //{
        //    BeanTopologie v_topologieVoronoi = new BeanTopologie();
        //    try
        //    {
        //        Dictionary<int, BeanArc_internal> v_arcs = new Dictionary<int, BeanArc_internal>();
        //        Dictionary<int, int> v_DicoPointSourceGaucheParArc = new Dictionary<int, int>();
        //        Dictionary<int, int> v_DicoPointSourceDroitParArc = new Dictionary<int, int>();

        //        //Création du réseau
        //        BeanTopologie v_topologieLignes = new BeanTopologie();

        //        double v_vorX_Left;
        //        double v_vorY_Left;
        //        double v_vorX_Right;
        //        double v_vorY_Right;
        //        double v_OrigX_Left;
        //        double v_OrigY_Left;
        //        double v_OrigX_Right;
        //        double v_OrigY_Right;
        //        double v_CorrectionX = 0;
        //        double v_CorrectionY = 0;

        //        ITopologieService v_topologieService = new TopologieService();
        //        IGeometry v_line;
        //        String v_CodeXYPointGauche;
        //        String v_CodeXYPointDroit;
        //        int v_KeyPointGauche;
        //        int v_KeyPointDroit;
        //        int v_KeyArc = 0;
        //        HashSet<string> v_testDoublesLignes = new HashSet<string>();
        //        string v_codeLigne;

        //        if (p_beanAlimentationVoronoi.parametrage.reductionCoordonneesVf)
        //        {
        //            v_CorrectionX = (double)p_beanAlimentationVoronoi.origineXCorrigee;
        //            v_CorrectionY = (double)p_beanAlimentationVoronoi.origineYCorrigee;
        //        }


        //        foreach (VoronoiEdge v_Edges in p_voronoiGraph.Edges)
        //        {
        //            if (!v_Edges.IsInfinite && !v_Edges.IsPartlyInfinite)
        //            {
        //                v_KeyArc++;
        //                //Je créé des variables intermédiaires car modifierLaGeometrie directement le vecteur pose graves pb
        //                v_vorX_Left = v_Edges.VVertexA[0] + v_CorrectionX;
        //                v_vorY_Left = v_Edges.VVertexA[1] + v_CorrectionY;
        //                v_vorX_Right = v_Edges.VVertexB[0] + v_CorrectionX;
        //                v_vorY_Right = v_Edges.VVertexB[1] + v_CorrectionY;
        //                v_OrigX_Left = v_Edges.LeftData[0] + v_CorrectionX;
        //                v_OrigY_Left = v_Edges.LeftData[1] + v_CorrectionY;
        //                v_OrigX_Right = v_Edges.RightData[0] + v_CorrectionX;
        //                v_OrigY_Right = v_Edges.RightData[1] + v_CorrectionY;
        //                //

        //                v_line = v_topologieService.GetLineStringByCoord(v_vorX_Left, v_vorY_Left, v_vorX_Right, v_vorY_Right);

        //                if (v_line.Length > 0)
        //                {
        //                    v_CodeXYPointGauche = GetCodeXY(v_OrigX_Left, v_OrigY_Left);
        //                    v_CodeXYPointDroit = GetCodeXY(v_OrigX_Right, v_OrigY_Right);
        //                    //J'ai rencontré des duplications de lignes (dans un sens et dans l'autre)
        //                    //Ces cas provoquent des boucles sans fin dans la fermeture d'îlots
        //                    // Je mets un patch : A réintégrer DANS TOPOLOGIE SERVICE
        //                    if (v_OrigX_Left < v_OrigX_Right)
        //                    {
        //                        v_codeLigne = v_CodeXYPointGauche + "_" + v_CodeXYPointDroit;
        //                    }
        //                    else
        //                    {
        //                        if (v_OrigX_Left == v_OrigX_Right)
        //                        {
        //                            if (v_OrigY_Left < v_OrigY_Right)
        //                            {
        //                                v_codeLigne = v_CodeXYPointGauche + "_" + v_CodeXYPointDroit;
        //                            }
        //                            else
        //                            { v_codeLigne = v_CodeXYPointDroit + "_" + v_CodeXYPointGauche; }
        //                        }
        //                        else
        //                        { v_codeLigne = v_CodeXYPointDroit + "_" + v_CodeXYPointGauche; }
        //                    }
        //                    //Si la ligne est déjà contenue, je ne l'introduis pas
        //                    if (v_testDoublesLignes.Contains(v_codeLigne)) { break; }

        //                    //
        //                    v_arcs.Add(v_KeyArc, v_line);

        //                    v_KeyPointGauche = -1;
        //                    if (p_beanAlimentationVoronoi.dicoLienCodeXyKeySource.ContainsKey(v_CodeXYPointGauche))
        //                    {
        //                        p_beanAlimentationVoronoi.dicoLienCodeXyKeySource.TryGetValue(v_CodeXYPointGauche, out v_KeyPointGauche);
        //                    }
        //                    v_DicoPointSourceGaucheParArc.Add(v_KeyArc, v_KeyPointGauche);
        //                    v_KeyPointDroit = -1;
        //                    if (p_beanAlimentationVoronoi.dicoLienCodeXyKeySource.ContainsKey(v_CodeXYPointGauche))
        //                    {
        //                        p_beanAlimentationVoronoi.dicoLienCodeXyKeySource.TryGetValue(v_CodeXYPointDroit, out v_KeyPointDroit);
        //                    }
        //                    v_DicoPointSourceDroitParArc.Add(v_KeyArc, v_KeyPointDroit);
        //                }
        //            }//Fin if (!v_Edges.IsInfinite && !v_Edges.IsPartlyInfinite)
        //        }//Fin foreach
        //         //Création de la topologie

        //        v_topologieLignes = v_topologieService.GetTopologie(v_arcs);

        //        ////STRUCTURATION en ILOTS:
        //        //v_topologieVoronoi = v_topologieService.GetTopologieSansImpassesEnrichiesDesIlots(v_topologieLignes);
        //        //v_topologieService.MiseAJourDesIndicateursDeControleTopologieIlot(v_topologieVoronoi);
        //        ////Renumérotation des îlots
        //        //v_topologieService.UpdateIdIlotsByCotesArcs(v_topologieVoronoi, v_DicoPointSourceDroitParArc, v_DicoPointSourceGaucheParArc);
        //        ////FIN STRUCTURATION en ILOTS:
        //    }
        //    catch (Exception v_ex)
        //    {
        //        throw v_ex;
        //    }
        //    return v_topologieVoronoi;
        //}

        public BeanTriangulationDelaunay GetTriangulationDelaunayByVoronoiGraph(VoronoiGraph p_voronoiGraph, BeanAlimentationVoronoi p_beanAlimentationVoronoi)
        {
            BeanTriangulationDelaunay v_triangulationDelaunay = new BeanTriangulationDelaunay();

            try
            {
                //[Je filtre les id négatifs: correspondent au Mbo de construction
                foreach (KeyValuePair <int, Point> v_pointsOriginels in p_beanAlimentationVoronoi.p10_dicoDesPointsSources)
                {
                    if (v_pointsOriginels.Key >= 0)
                    {
                        v_triangulationDelaunay.p00_PointIGeometrySources.Add(v_pointsOriginels.Key, v_pointsOriginels.Value);
                    }
                }
                //
                double v_OrigX_Left;
                double v_OrigY_Left;
                double v_OrigX_Right;
                double v_OrigY_Right;
                double v_CorrectionX = 0;
                double v_CorrectionY = 0;
                //
                if (p_beanAlimentationVoronoi.p12_parametrage.reductionCoordonneesVf)
                {
                    v_CorrectionX = (double)p_beanAlimentationVoronoi.p55_origineXCorrigee;
                    v_CorrectionY = (double)p_beanAlimentationVoronoi.p56_origineYCorrigee;
                }

                BeanArcDelaunay   v_arcDelaunay;
                string            v_CodeXYPointGauche;
                string            v_CodeXYPointDroit;
                ITopologieService v_topologieService = new TopologieService();
                int v_cleDroite;
                int v_cleGauche;
                int v_KeyArc = 0;
                foreach (VoronoiEdge v_Edges in p_voronoiGraph.Edges)
                {
                    if (!v_Edges.IsInfinite && !v_Edges.IsPartlyInfinite)
                    {
                        v_KeyArc++;
                        v_OrigX_Left  = v_Edges.LeftData[0] + v_CorrectionX;
                        v_OrigY_Left  = v_Edges.LeftData[1] + v_CorrectionY;
                        v_OrigX_Right = v_Edges.RightData[0] + v_CorrectionX;
                        v_OrigY_Right = v_Edges.RightData[1] + v_CorrectionY;
                        //
                        //v_CodeXYPointGauche = GetCodeXY(v_OrigX_Left, v_OrigY_Left);
                        v_CodeXYPointGauche = FLabServices.createUtilitaires().GetHCodeGeogPoint(new double[2] {
                            v_OrigX_Left, v_OrigY_Left
                        });
                        //v_CodeXYPointDroit = GetCodeXY(v_OrigX_Right, v_OrigY_Right);
                        v_CodeXYPointDroit = FLabServices.createUtilitaires().GetHCodeGeogPoint(new double[2] {
                            v_OrigX_Right, v_OrigY_Right
                        });
                        //
                        if (p_beanAlimentationVoronoi.p31_correspondanceHCodePointvsIdPoint.ContainsKey(v_CodeXYPointGauche) && p_beanAlimentationVoronoi.p31_correspondanceHCodePointvsIdPoint.ContainsKey(v_CodeXYPointDroit))
                        {
                            v_cleGauche = p_beanAlimentationVoronoi.p31_correspondanceHCodePointvsIdPoint[v_CodeXYPointGauche];
                            v_cleDroite = p_beanAlimentationVoronoi.p31_correspondanceHCodePointvsIdPoint[v_CodeXYPointDroit];
                            if (v_cleDroite >= 0 && v_cleGauche >= 0)
                            {
                                v_arcDelaunay = new BeanArcDelaunay();
                                v_arcDelaunay.p11_idPoint1       = v_cleGauche;
                                v_arcDelaunay.p21_coordPoint1[0] = v_OrigX_Left;
                                v_arcDelaunay.p21_coordPoint1[1] = v_OrigY_Left;
                                //
                                v_arcDelaunay.p12_idPoint2       = v_cleDroite;
                                v_arcDelaunay.p22_coordPoint2[0] = v_OrigX_Right;
                                v_arcDelaunay.p22_coordPoint2[1] = v_OrigY_Right;
                                //
                                v_arcDelaunay.p00_codeArcDelaunay = GetHCodeArcDelaunay(v_cleGauche, v_cleDroite, true);
                                //
                                v_arcDelaunay.p30_arcDelaunay = v_topologieService.GetLineStringByCoord(v_OrigX_Left, v_OrigY_Left, v_OrigX_Right, v_OrigY_Right);
                                v_triangulationDelaunay.p01_arcsDelaunay.Add(v_arcDelaunay);
                            }
                        }
                    }
                }
            }
            catch (Exception v_ex)
            {
                throw v_ex;
            }
            return(v_triangulationDelaunay);
        }
Beispiel #11
0
        public BeanTopologieFacettes GetBeanTopologieByVoronoiGraph(VoronoiGraph p_voronoiGraph, BeanAlimentationVoronoi p_beanAlimentationVoronoi)
        {
            BeanTopologieFacettes v_topologie = new BeanTopologieFacettes();

            try
            {
                List <BeanArc_internal> v_arcsVoronoi = new List <BeanArc_internal>();
                Dictionary <string, BeanArc_internal> v_arcsParHCode = new Dictionary <string, BeanArc_internal>();
                int v_srid = p_beanAlimentationVoronoi.p11_srid;
                //
                Dictionary <string, BeanPoint_internal> v_pointsDesArcsByCode = new Dictionary <string, BeanPoint_internal>();
                Dictionary <int, BeanArc_internal>      v_arcs      = new Dictionary <int, BeanArc_internal>();
                Dictionary <int, int> v_DicoPointSourceGaucheParArc = new Dictionary <int, int>();
                Dictionary <int, int> v_DicoPointSourceDroitParArc  = new Dictionary <int, int>();
                //

                //Création du réseau
                double v_vorX_Left;
                double v_vorY_Left;
                double v_vorX_Right;
                double v_vorY_Right;
                double v_OrigX_Left;
                double v_OrigY_Left;
                double v_OrigX_Right;
                double v_OrigY_Right;
                double v_CorrectionX = 0;
                double v_CorrectionY = 0;

                ITopologieService v_topologieService = new TopologieService();
                int v_KeyArc = 0;
                HashSet <string> v_testDoublesLignes = new HashSet <string>();

                if (p_beanAlimentationVoronoi.p12_parametrage.reductionCoordonneesVf)
                {
                    v_CorrectionX = (double)p_beanAlimentationVoronoi.p55_origineXCorrigee;
                    v_CorrectionY = (double)p_beanAlimentationVoronoi.p56_origineYCorrigee;
                }

                BeanPoint_internal v_pt1;
                BeanPoint_internal v_pt2;
                BeanArc_internal   v_arc;

                //On créé une facette/ilot pour chaque point;
                BeanFacette_internal v_facette;
                Dictionary <int, BeanFacette_internal> v_toutesFacettes;

                v_toutesFacettes = p_beanAlimentationVoronoi.p10_dicoDesPointsSources.ToDictionary(c => c.Key, c => new BeanFacette_internal());
                //[ATTENTION! On doit mettre à jour l'id
                foreach (KeyValuePair <int, BeanFacette_internal> v_fac in v_toutesFacettes)
                {
                    v_fac.Value.p00_idFacette = v_fac.Key;
                }

                //On parcourt les arcs:
                string v_hcodePt1;
                string v_hcodePt2;
                string v_hcodeGraineVoronoiAGauche;
                string v_hcodeGraineVoronoiADroite;
                int    v_idIlotAGauche;
                int    v_idIlotADroite;
                foreach (VoronoiEdge v_Edges in p_voronoiGraph.Edges)
                {
                    if (!v_Edges.IsInfinite && !v_Edges.IsPartlyInfinite)
                    {
                        v_KeyArc++;

                        //L'arc voronoi
                        v_vorX_Left  = v_Edges.VVertexA[0] + v_CorrectionX;
                        v_vorY_Left  = v_Edges.VVertexA[1] + v_CorrectionY;
                        v_vorX_Right = v_Edges.VVertexB[0] + v_CorrectionX;
                        v_vorY_Right = v_Edges.VVertexB[1] + v_CorrectionY;
                        //
                        v_hcodePt1 = FLabServices.createUtilitaires().GetHCodeGeogPoint(new double[2] {
                            v_vorX_Left, v_vorY_Left
                        });
                        if (v_pointsDesArcsByCode.ContainsKey(v_hcodePt1))
                        {
                            v_pt1 = v_pointsDesArcsByCode[v_hcodePt1];
                        }
                        else
                        {
                            v_pt1 = new BeanPoint_internal(v_vorX_Left, v_vorY_Left, 0, v_srid);
                            v_pointsDesArcsByCode.Add(v_hcodePt1, v_pt1);
                        }
                        //
                        v_hcodePt2 = FLabServices.createUtilitaires().GetHCodeGeogPoint(new double[2] {
                            v_vorX_Right, v_vorY_Right
                        });
                        if (v_pointsDesArcsByCode.ContainsKey(v_hcodePt2))
                        {
                            v_pt2 = v_pointsDesArcsByCode[v_hcodePt2];
                        }
                        else
                        {
                            v_pt2 = new BeanPoint_internal(v_vorX_Right, v_vorY_Right, 0, v_srid);
                            v_pointsDesArcsByCode.Add(v_hcodePt2, v_pt2);
                        }

                        //
                        v_arc = new BeanArc_internal(v_pt1, v_pt2);
                        //
                        if (!v_arcsParHCode.ContainsKey(v_arc.p01_hcodeArc))
                        {
                            v_arcsParHCode.Add(v_arc.p01_hcodeArc, v_arc);
                        }

                        //On référence les points 'graines' voronoi à droite et à gauche
                        v_OrigX_Left  = v_Edges.LeftData[0] + v_CorrectionX;
                        v_OrigY_Left  = v_Edges.LeftData[1] + v_CorrectionY;
                        v_OrigX_Right = v_Edges.RightData[0] + v_CorrectionX;
                        v_OrigY_Right = v_Edges.RightData[1] + v_CorrectionY;
                        //
                        v_hcodeGraineVoronoiAGauche = FLabServices.createUtilitaires().GetHCodeGeogPoint(new double[2] {
                            v_OrigX_Left, v_OrigY_Left
                        });
                        v_hcodeGraineVoronoiADroite = FLabServices.createUtilitaires().GetHCodeGeogPoint(new double[2] {
                            v_OrigX_Right, v_OrigY_Right
                        });
                        //
                        v_facette = null;
                        if (p_beanAlimentationVoronoi.p31_correspondanceHCodePointvsIdPoint.ContainsKey(v_hcodeGraineVoronoiAGauche))
                        {
                            v_idIlotAGauche = p_beanAlimentationVoronoi.p31_correspondanceHCodePointvsIdPoint[v_hcodeGraineVoronoiAGauche];
                            v_facette       = v_toutesFacettes[v_idIlotAGauche];
                            v_facette.p02_arcs.Add(v_arc);
                            v_arc.p21_facetteGauche = v_facette;
                        }
                        else
                        {
                            v_arc.p20_statutArc = enumStatutArc.arcExterne;
                        }
                        v_facette = null;
                        if (p_beanAlimentationVoronoi.p31_correspondanceHCodePointvsIdPoint.ContainsKey(v_hcodeGraineVoronoiADroite))
                        {
                            v_idIlotADroite = p_beanAlimentationVoronoi.p31_correspondanceHCodePointvsIdPoint[v_hcodeGraineVoronoiADroite];
                            v_facette       = v_toutesFacettes[v_idIlotADroite];
                            v_facette.p02_arcs.Add(v_arc);
                            v_arc.p21_facetteGauche = v_facette;
                        }
                        else
                        {
                            v_arc.p20_statutArc = enumStatutArc.arcExterne;
                        }
                    } //Fin if (!v_Edges.IsInfinite && !v_Edges.IsPartlyInfinite)
                }     //Fin foreach
                 //Création de la topologie
                v_arcsVoronoi = v_arcsParHCode.Values.OrderBy(c => c.p01_hcodeArc).ToList();

                //On actualise les points des facettes:
                foreach (KeyValuePair <int, BeanFacette_internal> v_fac in v_toutesFacettes)
                {
                    List <BeanPoint_internal> v_points = v_fac.Value.p02_arcs.Select(c => c.p11_pointDbt).ToList();
                    v_points.AddRange(v_fac.Value.p02_arcs.Select(c => c.p12_pointFin).ToList());
                    HashSet <string> v_pointsDeja = new HashSet <string>();
                    foreach (BeanPoint_internal v_pt in v_points)
                    {
                        if (!v_pointsDeja.Contains(v_pt.p01_hCodeGeog))
                        {
                            v_fac.Value.p01_pointsDeFacette.Add(v_pt);
                            v_pointsDeja.Add(v_pt.p01_hCodeGeog);
                        }
                    }
                }

                //
                v_topologie = new BeanTopologieFacettes(v_arcsVoronoi);
                v_topologie.p13_facettesById = v_toutesFacettes;
                //On supprime les éventuelles facettes sans dimension
                List <int> v_idFacettesASupprimer;
                v_idFacettesASupprimer = v_toutesFacettes.Where(c => c.Value.p02_arcs.Count < 3).Select(c => c.Key).ToList();
                BeanFacette_internal v_facetteASupprimer;
                foreach (int v_idFacASuppr in v_idFacettesASupprimer)
                {
                    v_facetteASupprimer = v_topologie.p13_facettesById[v_idFacASuppr];
                    v_topologie.FacetteSupprimer(v_facetteASupprimer);
                }


                //Géométrie:
                List <int>           v_idFacettes = v_topologie.p13_facettesById.Keys.ToList();
                IGeometry            v_geomFacette;
                BeanFacette_internal v_facettePourGeom;
                foreach (int v_idFac in v_idFacettes)
                {
                    v_facettePourGeom = v_topologie.p13_facettesById[v_idFac];
                    v_geomFacette     = FLabServices.createCalculMedium().GetGeometryPolygoneFacetteEtOrdonnePointsFacette(ref v_facettePourGeom, ref v_topologie);
                    v_facettePourGeom.p04_geomFacette = v_geomFacette;
                }
            }
            catch (Exception v_ex)
            {
                throw v_ex;
            }
            return(v_topologie);
        }
Beispiel #12
0
        public BeanAlimentationVoronoi GetBeanAlimentationVoronoiByDicoPointsEtMbo(Dictionary <int, Point> p_DicoPoints, double[] p_coodMinMaxXy, int p_srid)
        {
            BeanAlimentationVoronoi v_BeanAlimentationVoronoi = new BeanAlimentationVoronoi();

            try
            {
                v_BeanAlimentationVoronoi.p11_srid = p_srid;
                v_BeanAlimentationVoronoi.p22_contientObjetsInvalidesVf   = false;
                v_BeanAlimentationVoronoi.p23_contientObjetsSuperposesVf  = false;
                v_BeanAlimentationVoronoi.p21_territoireSuperieurA200kmVf = false;

                v_BeanAlimentationVoronoi.p51_xMin = p_coodMinMaxXy[0];
                v_BeanAlimentationVoronoi.p52_yMin = p_coodMinMaxXy[1];
                v_BeanAlimentationVoronoi.p53_xMax = p_coodMinMaxXy[2];
                v_BeanAlimentationVoronoi.p54_yMax = p_coodMinMaxXy[3];

                List <Double[]> v_ListeDoublePourVectors = new List <Double[]>();
                string          v_codeXYPoint;
                double[]        v_DoublePourVector;
                int             v_keyDoublon;

                foreach (KeyValuePair <int, Point> v_point in p_DicoPoints)
                {
                    v_BeanAlimentationVoronoi.p10_dicoDesPointsSources.Add(v_point.Key, v_point.Value);
                    if (v_point.Value.OgcGeometryType == OgcGeometryType.Point)
                    {
                        //On génère le code à partir des coordonnees
                        //v_codeXYPoint = GetCodeXY((double)v_point.Value.Coordinate.X, (double)v_point.Value.Coordinate.Y);
                        v_codeXYPoint = FLabServices.createUtilitaires().GetHCodeGeogPoint(new double[2] {
                            (double)v_point.Value.Coordinate.X, (double)v_point.Value.Coordinate.Y
                        });

                        if (v_BeanAlimentationVoronoi.p31_correspondanceHCodePointvsIdPoint.ContainsKey(v_codeXYPoint))
                        {
                            //j'ajoute dans la liste des doublons l'id du point en cours
                            v_BeanAlimentationVoronoi.p25_pointsSuperposes.Add(v_point.Key);
                            v_BeanAlimentationVoronoi.p23_contientObjetsSuperposesVf = true;
                            //+ celui déjà listé s'il n'existe pas déjà
                            v_BeanAlimentationVoronoi.p31_correspondanceHCodePointvsIdPoint.TryGetValue(v_codeXYPoint, out v_keyDoublon);
                            if (!v_BeanAlimentationVoronoi.p25_pointsSuperposes.Contains(v_keyDoublon))
                            {
                                v_BeanAlimentationVoronoi.p25_pointsSuperposes.Add(v_keyDoublon);
                            }
                        }
                        else  //Si l'objet est OK à ce stade...
                        {
                            //J'injecte dans la liste des correspondances
                            v_BeanAlimentationVoronoi.p31_correspondanceHCodePointvsIdPoint.Add(v_codeXYPoint, v_point.Key);
                            //
                            v_DoublePourVector    = new double[2];
                            v_DoublePourVector[0] = (double)v_point.Value.Coordinate.X;
                            v_DoublePourVector[1] = (double)v_point.Value.Coordinate.Y;

                            //J'ajoute dans une liste temporaire et pas dans le HS car il semble nécessaire de faire un changement de repère avant d'injecter les données ds le HS<vector>
                            v_ListeDoublePourVectors.Add(v_DoublePourVector);

                            //récupération des points extrêmes
                            if (v_BeanAlimentationVoronoi.p51_xMin > (double)v_point.Value.Coordinate.X)
                            {
                                v_BeanAlimentationVoronoi.p51_xMin = (double)v_point.Value.Coordinate.X;
                            }
                            if (v_BeanAlimentationVoronoi.p52_yMin > (double)v_point.Value.Coordinate.Y)
                            {
                                v_BeanAlimentationVoronoi.p52_yMin = (double)v_point.Value.Coordinate.Y;
                            }
                            if (v_BeanAlimentationVoronoi.p53_xMax < (double)v_point.Value.Coordinate.X)
                            {
                                v_BeanAlimentationVoronoi.p53_xMax = (double)v_point.Value.Coordinate.X;
                            }
                            if (v_BeanAlimentationVoronoi.p54_yMax < (double)v_point.Value.Coordinate.Y)
                            {
                                v_BeanAlimentationVoronoi.p54_yMax = (double)v_point.Value.Coordinate.Y;
                            }
                        }
                    }//Si le IGeometry n'est pas un point (FIN if (v_point.Value.STGeometryType() == OpenGisGeographyType.Point.ToString())
                    else
                    {
                        v_BeanAlimentationVoronoi.p24_pointsInvalidesSaufSuperposes.Add(v_point.Key);
                        v_BeanAlimentationVoronoi.p22_contientObjetsInvalidesVf = true;
                    }
                }//FIN foreach

                //Création des points périphériques artificiels
                Dictionary <int, Double[]> v_dicoPointscadres = GetPointsCadresVoronoi(v_BeanAlimentationVoronoi);


                //Injection dans les listes
                Dictionary <int, IGeometry> v_newListePoint = new Dictionary <int, IGeometry>();

                ITopologieService v_topologieService = new TopologieService();
                foreach (KeyValuePair <int, Double[]> v_pointSup in v_dicoPointscadres)
                {
                    //v_codeXYPoint = GetCodeXY(v_pointSup.Value[0], v_pointSup.Value[1]);
                    v_codeXYPoint = FLabServices.createUtilitaires().GetHCodeGeogPoint(new double[2] {
                        v_pointSup.Value[0], v_pointSup.Value[1]
                    });
                    //PUSTULE FAU
                    if (v_BeanAlimentationVoronoi.p31_correspondanceHCodePointvsIdPoint.ContainsKey(v_codeXYPoint))
                    {
                        continue;
                    }
                    v_BeanAlimentationVoronoi.p31_correspondanceHCodePointvsIdPoint.Add(v_codeXYPoint, v_pointSup.Key);
                    v_BeanAlimentationVoronoi.p10_dicoDesPointsSources.Add(v_pointSup.Key, FLabServices.createUtilitaires().ConstructPoint(v_pointSup.Value[0], v_pointSup.Value[1], p_srid));


                    v_ListeDoublePourVectors.Add(v_pointSup.Value);
                }

                //Changement d'origine des coordonnées
                //(Indispensable pour pouvoir gérer les calculs sur les coord L93 (>10 puissance 5))
                v_BeanAlimentationVoronoi.p55_origineXCorrigee = (int)(Math.Round(v_BeanAlimentationVoronoi.p51_xMin) - 1);
                v_BeanAlimentationVoronoi.p56_origineYCorrigee = (int)(Math.Round(v_BeanAlimentationVoronoi.p52_yMin) - 1);
                if (v_BeanAlimentationVoronoi.p12_parametrage.reductionCoordonneesVf)
                {
                    v_BeanAlimentationVoronoi.p51_xMin = v_BeanAlimentationVoronoi.p51_xMin - v_BeanAlimentationVoronoi.p55_origineXCorrigee;
                    v_BeanAlimentationVoronoi.p53_xMax = v_BeanAlimentationVoronoi.p53_xMax - v_BeanAlimentationVoronoi.p55_origineXCorrigee;
                    v_BeanAlimentationVoronoi.p52_yMin = v_BeanAlimentationVoronoi.p52_yMin - v_BeanAlimentationVoronoi.p56_origineYCorrigee;
                    v_BeanAlimentationVoronoi.p54_yMax = v_BeanAlimentationVoronoi.p54_yMax - v_BeanAlimentationVoronoi.p56_origineYCorrigee;
                }

                foreach (Double[] v_DoubleVectorPourCorrection in v_ListeDoublePourVectors)
                {
                    if (v_BeanAlimentationVoronoi.p12_parametrage.reductionCoordonneesVf)
                    {
                        v_DoubleVectorPourCorrection[0] = v_DoubleVectorPourCorrection[0] - v_BeanAlimentationVoronoi.p55_origineXCorrigee;
                        v_DoubleVectorPourCorrection[1] = v_DoubleVectorPourCorrection[1] - v_BeanAlimentationVoronoi.p56_origineYCorrigee;
                    }
                    v_BeanAlimentationVoronoi.p50_pointsFormatesPourInsertion.Add(new Vector(v_DoubleVectorPourCorrection));
                }
                //
                if (((v_BeanAlimentationVoronoi.p53_xMax - v_BeanAlimentationVoronoi.p51_xMin) > 200000) || ((v_BeanAlimentationVoronoi.p54_yMax - v_BeanAlimentationVoronoi.p52_yMin) > 200000))
                {
                    v_BeanAlimentationVoronoi.p21_territoireSuperieurA200kmVf = true;
                }
                //Ajout des points périphériques
                //AjoutPointsFrontiere(ref v_BeanAlimentationVoronoi);
            }
            catch (Exception v_ex)
            {
                throw v_ex;
            }
            return(v_BeanAlimentationVoronoi);
        }