2012-01-27 7 views
15

Szukam dokładnego algorytmu lub usługi do obliczenia powierzchni Ziemi, gdzie punkty są obliczane na podstawie współrzędnych GPS.Obliczanie obszaru wielokąta narysowanego na mapie google

Używam Google Map Api w wersji 3 i rysuję wielokątów na podstawie zarejestrowanych współrzędnych, ale nie sądzę, że standardowe sposoby obliczania powierzchni wielokąta będą uwzględniać zbocza (wzgórza). Czy muszę pracować nad konturami takich rzeczy?

Czy istnieją usługi stron trzecich mogą być ArcGis lub inne, które również uwzględniają stoki.

Odpowiedz

31

Tak, jest to zdecydowanie możliwe. Jest szybki poradnik z przykładowym kod tutaj:

https://web.archive.org/web/20130301120148/http://geojason.info/demos/line-length-polygon-area-google-maps-v3

Odpowiedni fragment brzmi:

google.maps.geometry.spherical.computeArea(yourPolygon.getPath()); 

Oficjalna dokumentacja: odpowiedź

http://code.google.com/apis/maps/documentation/javascript/reference.html#spherical

+0

będzie to API uwzględniać podniesienie ziemi ?. Będę dostawał współrzędne z urządzenia GPS. –

+1

Nie, zakłada idealnie gładką sferyczną ziemię. Brzmi jak to, czego naprawdę chcesz, to powierzchnia cyfrowego modelu elewacji. Można to obliczyć za pomocą funkcji r.surf.area w GRASS GIS, ale jeśli chcesz wiedzieć więcej, powinieneś zapytać na gis.stackexchange.com – Spacedman

+0

@Spacedman: Czy Grass GIS może być zintegrowany z Google Maps? –

9

Brada

google.maps.geometry.spherical.computeArea(yourPolygon.getPath()); 

jest poprawna, ale uwaga, dotyczy tylko wielokątów, które nie przecinają się z sobą. Kiedy wielobok zaczyna się krzyżować, rzeczy idą okropnie źle. Możesz wypróbować go za pomocą linku, który dał Brad http://geojason.info/demos/line-length-polygon-area-google-maps-v3/. Po prostu narysuj 4-5 przecinających się linii i zacznij grać z wierzchołkami. Obliczenie obszaru na pewno wydaje się błędne.

Jeśli nie jesteś przekonany, oto przykład:

var map; 

    google.maps.visualRefresh = true; 

    google.maps.event.addDomListener(window, 'load', initialize); 

    function initialize() { 
     var mapOptions = { 
      center : new google.maps.LatLng(55.874, -4.287), 
      zoom : 16, 
      mapTypeId : google.maps.MapTypeId.ROADMAP 
     }; 
     map = new google.maps.Map(document.getElementById("map-canvas"), mapOptions) 

     drawExample(); 
    } 

    function drawExample() { 
     var pathLeft = [new google.maps.LatLng(55.874, -4.292), 
      new google.maps.LatLng(55.875, -4.292), 
      new google.maps.LatLng(55.875, -4.290), 
      new google.maps.LatLng(55.876, -4.290), 
      new google.maps.LatLng(55.876, -4.291), 
      new google.maps.LatLng(55.874, -4.291)] 

     var polygonLeft = new google.maps.Polygon({ 
      path : pathLeft, 
      map: map 
     }); 

     var areaLeft = google.maps.geometry.spherical.computeArea(polygonLeft.getPath()); 

     var pathRight = [new google.maps.LatLng(55.874, -4.282), 
      new google.maps.LatLng(55.875, -4.282), 
      new google.maps.LatLng(55.875, -4.280), 
      new google.maps.LatLng(55.8753, -4.2807), 
      new google.maps.LatLng(55.876, -4.281), 
      new google.maps.LatLng(55.874, -4.281)] 

     var polygonRight = new google.maps.Polygon({ 
      path : pathRight, 
      map: map 
     }); 

     var areaRight = google.maps.geometry.spherical.computeArea(polygonRight.getPath()); 

     console.log("areaLeft: " + areaLeft + "\nareaRight: " + areaRight); 
    } 

Raport błędów http://code.google.com/p/gmaps-api-issues/issues/detail?id=5624&colspec=ID%20Type%20Status%20Introduced%20Fixed%20Summary%20Stars%20ApiType%20Internal&start=700#makechanges