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.
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# :)
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 :)
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.
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?
// 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);
// Test if points are inside the map bounds foreach (SqlGeography point in sourcecollection) { if (gb.ConstructedGeography.STIntersects(point)) { finalcollection.Add(point); } } }
Mvh. Lasse
Synes godt om
Ny brugerNybegynder
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.