Avatar billede lasserasch Juniormester
01. februar 2011 - 14:14 Der er 8 kommentarer

Find koordinater som er indenfor kortudsnit.

Hejsa.

Jeg har en samling over Koordinater. Altså latitude og longitude i en SQL db.

disse bliver trukket ud i en List<> og og gemt i et 'Waypoint' objekt jeg har lavet.

Jeg skal løbe listen igennem og finde de objekter som skal vises på en bestemt kortudsnit.

Jeg er dog kommet lidt i tvivl omkring fremgangsmåde. Man kan vel ikke bare se kortet som en flad firkant med 4 hjørner. Jorden er jo rund :-)

Så hvordan pokker løber man en liste af waypoints igennem og finder ud af om de er inden for kortets rammer. F.eks. et Google Map kort eller lign?


Pt. ser min kode halvfærdig ud. Jeg har brug for noget input... Håber en kan hjælpe.

Mvh.
Lasse




/// <summary>
        /// Returns waypoints that are within the specified map coordinates.
        /// </summary>
        /// <param name="lnglr">Longitude lower right</param>
        /// <param name="lngll">Longitude  lower left</param>
        /// <param name="lngurt">Longitude upper right</param>
        /// <param name="lngul">Longitude  upper left</param>
        /// <param name="latlr">Latitude lower right</param>
        /// <param name="latll">Latitude lower left</param>
        /// <param name="latur">Latitude upper right</param>
        /// <param name="latul">Latitude upper left</param>
        /// <returns></returns>
        public List<Waypoint> getWaypoints(decimal lnglr, decimal lngll, decimal lngurt, decimal lngul, decimal latlr, decimal latll, decimal latur, decimal latul)
        {
            List<Waypoint> result = new List<Waypoint>();
            List<Waypoint> list = getWaypoints();

            foreach (Waypoint wp in list)
            {
                if (wp.Longitude > lngll & wp.Longitude > lnglr)
                {
                    if (wp.Longitude < lngul & wp.Longitude < lngurt)
                    {
                      .....
                    }
                }
            }
        }

Avatar billede jonatanpedersen Nybegynder
01. februar 2011 - 21:03 #1
Der findes utalige typer af map projections. Find ud af hvilken en er blevet brugt til det kort du bruger og regn så baglæns, se http://en.wikipedia.org/wiki/Map_projection for mere info.
Avatar billede jonatanpedersen Nybegynder
01. februar 2011 - 21:06 #2
FYI. Google bruger en variation af http://en.wikipedia.org/wiki/Mercator_projection
Avatar billede janus_007 Nybegynder
02. februar 2011 - 00:35 #3
Det er slet ikke så svært som man måske skulle tro :)

Jeg ville helt sikkert arbejde med Geography, jeg ville nok også droppe begrebet waypoints og så bruge det som allerede findes, altså Geography.
Så istedet for din getWaypoints(..... og mange mange...) som jo kun kan bruges til rektangler, så brug Geography:

getWaypoints(SqlGeography geo)
{}

Du skal bruge Intersect-metoden for at finde det du vil.
På den måde har du lavet en metode som tager alverdens former :)

Led efter SqlGeography, implementeringen er lavet i C#, men udstilles til Sql som CLR, dvs. du kan bruge det direkte i C# :)
Avatar billede lasserasch Juniormester
02. februar 2011 - 09:37 #4
Hmmm.... janus_007. Det forstår jeg ikke rigtig så meget ud fra. Kan du give et link til noget konkret information eller måske et eksempel?

Mvh.
Lasse
Avatar billede janus_007 Nybegynder
02. februar 2011 - 20:15 #5
hej Lasse

jo lidt pseudo kan da godt lade sig gøre:


Kortudsnittet bygger du op med en builder, ala:

SqlGeographyBuilder gb = new SqlGeographyBuilder();

gb.SetSrid(4326); /tjek google for denne SRID :)

gb.BeginGeography(OpenGisGeographyType.Polygon); //her siger vi det er en polygon... en rektangel er jo faktisk en polygon med fire hjørner.

Husk når du bygger en polygon/ shape, så skal den være afsluttet, dvs. i dit tilfælde 4 punkter men 5 koordinater for at den skal være afsluttet korrekt, det sidste koordinat er lig med det første :)

Hvordan du lige render din rektangel igennem er jo op til dig, men det kunne gøres sådan her.
gb.BeginFigure(shapefoo.Points[0].Latitude, shapefoo.Points[0].Longitude);
for (int i = 1; i < shapefoo.Points.Count; i++)
{
  gb.AddLine(shapefoo.Points[i].Latitude, shapefoo.Points[i].Longitude);
            }
gb.EndFigure();
gb.EndGeography();


Når du så skal lave finde dine punkter(waypoints), så ændrer du bare typen til: somePoints.BeginGeography(OpenGisGeographyType.Point og bygger en geography igen.

Nu kan du så lave alle mulige finurligheder med de to, eks.vis:

SqlGeography geo = new SqlGeography();

var intersect = gb.ConstructedGeography.STIntersects(somePoints).Istrue;

Du kan selv søge videre efter SqlGeography og STIntersects, der findes som nævnt mange andre sjove sager :)
Avatar billede janus_007 Nybegynder
02. februar 2011 - 20:21 #6
jo forresten... hvis du ikke lige selv har Microsoft.SqlServer.Types.dll så findes den på nettet ellers kan du tage min :) jeg har lagt den op her:

http://dl.dropbox.com/u/546202/Assemblies/Microsoft.SqlServer.Types.dll
Avatar billede lasserasch Juniormester
28. august 2011 - 21:27 #7
Hej Janus_007. Beklager at jeg ikke har vendt tilbage.

Jeg skal videre med dette projekt nu, og læser dit svar igennem.
Der er dog nogle ting jeg ikke rigtig forstår.

Det er første gang jeg skal lave sådan nogle beregninger, så beklager hvis jeg virker helt newbee i mine spørgsmål :-)

Du skriver "shapefoo" i dit eksempel. Hvad er det for et objekt?

Jeg forstår nok ikke helt hvad det er du skriver om.

Jeg går ud fra at jeg skal bygge mit rektangel op ved at angive koordinaterne til de 4 punkter som mit kort giver mig. (Google maps).

Altså jeg skal vel fortælle hver der er øverste venstre hjørne, øverste højre hjørne, nederste venstre hjørne, nederste højre hjørne.

Men hvordan laver man det i kode?

Og så går jeg ud fra at jeg efterfølgende skal lave punkt objekter, som jeg så kan holde op imod mit rektangel og på en eller anden måde bruge "STIntersects" til at finde ud af om mit punkt ligger inden for rammen (mit rektangel)?

Jeg går ud fra at jeg kan bruge Googles Koordinat sets metoder (GetBounds) til at fodre min metode med de nødvendige koordinater.

Jeg har kigget på google nogle timer nu, men kan bare ikke rigtig finde et helt konkret og forståeligt eksempel på det.

Mvh.
Lasse
Avatar billede lasserasch Juniormester
28. august 2011 - 22:17 #8
Hej igen...

Det er hvad jeg har nu. Jeg har ikke testet det. Men hvis jeg forstår dig korrekt, så burde min kode vel give mig en liste over de 2 punkter som er inde for et Google Map korts rammer. Ik?


  public void Test()
        {
            double u_llat = 0;
            double u_llng = 10;

            double u_rlat = 10;
            double u_rlng = 10;

            double l_rlat = 10;
            double l_rlng = 0;

            double l_llat = 0;
            double l_llng = 0;

            // Collections
            List<SqlGeography> sourcecollection = new List<SqlGeography>(); // Collection holding all points from database.
            List<SqlGeography> finalcollection = new List<SqlGeography>(); // Collection holding all points that is within the map bounds.

            // Test Data
            sourcecollection.Add(SqlGeography.Point(5, 5, 4326));
            sourcecollection.Add(SqlGeography.Point(9, 6, 4326));
            sourcecollection.Add(SqlGeography.Point(11, 12, 4326));

            // Build the Square from Map coordinates
            SqlGeographyBuilder gb = new SqlGeographyBuilder();
            gb.SetSrid(4326);
            gb.BeginGeography(OpenGisGeographyType.Polygon);

            gb.BeginFigure(l_llat, l_llng);
            gb.AddLine(u_llat, u_llng);
            gb.AddLine(u_rlat, u_rlng);
            gb.AddLine(l_rlat, l_rlng);
            gb.AddLine(l_llat, l_llng);
            gb.EndFigure();
            gb.EndGeography();

            // Test if points are inside the map bounds
            foreach (SqlGeography point in sourcecollection)
            {
                if (gb.ConstructedGeography.STIntersects(point))
                {
                    finalcollection.Add(point);
                }
            }
        }


Mvh.
Lasse
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester