2011-01-17 17 views
23

Poszukuję biblioteki w javascript, która pozwoli mi tworzyć zapytania geoprzestrzenne. Wiem o OpenLayers i GoogleMaps, ale ta dwójka nie obsługuje rzeczy takich jak skrzyżowanie unii i tak dalej.Zapytania geoprzestrzenne w javascript

+----+ 
| | 
| +-+--+ 
+--+-+ | 
    | | 
    +----+ 

do

+----+ 
    | | 
    | +--+ 
    +--+ | 
     | | 
     +----+ 
+9

+1 dla ładnych rysunków.:) – limc

+0

Związek musi być stroną klienta "w" javascript – wolktm

Odpowiedz

6

Aktualizacja 2014-04-29: Sprawdź z Turf, wygląda bardzo obiecujące

JSTS może zrobić związków obiektów geometrycznych w przeglądarce. JSTS integruje się z biblioteką openlayers i rozszerza klasy geometryczne openlayers (na przykład OpenLayers.Geometry.Polygon), dzięki czemu są one zdolne do operacji geometrycznych. Przykład:

>> var poly1 = OpenLayers.Geometry.Polygon.createRegularPolygon(
            new OpenLayers.Geometry.Point(0.0,0.0), 2, 5); 
>> var poly2 = OpenLayers.Geometry.Polygon.createRegularPolygon(
            new OpenLayers.Geometry.Point(1.0,1.0), 2, 4); 
>> var poly_u = poly1.union(poly2); 
>> var poly_d = poly1.difference(poly2); 
>> print(poly_u); 
POLYGON((1.5667154718422638 -0.4142135623730949,1.1755705045849463 -1.618033988749895, 
    -1.1755705045849465 -1.6180339887498947,-1.902113032590307 0.618033988749895, 
    -0.41421356237309503 1.6990562312593451,-0.4142135623730949 2.414213562373095, 
    2.414213562373095 2.414213562373095,2.414213562373095 -0.4142135623730949, 
    1.5667154718422638 -0.4142135623730949)) 

Geoscript JS jest miłe, jeśli chcesz zrobić ServerSide operacji geometrycznych w JS.

+0

Geoscript został już tutaj zaproponowany, ale myślę, że jest to tylko serwer. JSTS wygląda jak rozwiązanie, którego szukałem! – wolktm

+0

Ah, myślałem, że geoscript-js -> to javascript -> musi być biblioteką przeglądarki. Ale nie mogę znaleźć sposobu uruchomienia go w przeglądarce, więc musisz mieć rację. jsts to jest :) – ivy

0

Można uzyskać wyniki kwerendy dla promienia lub prostokąta, która obejmuje swoją wielokąta, a następnie filtrować wyniki stosując technikę opisaną tutaj: http://msdn.microsoft.com/en-us/library/cc451895.aspx. W przykładzie wykorzystano mapy bing, ale można łatwo zastosować te same zasady przy użyciu dowolnej preferowanej usługi mapowania.

+0

Skrzyżowania są również adresowane do OpenLayers, ale Unia nie jest poruszana w artykule. – wolktm

0

Czy obejrzysz geoUtils?

Nie jestem pewien, czy obsługuje op Union, ale może warto je spróbować.

+0

Nie widzę związku. – wolktm

1

Możesz rozszerzyć usługi OpenLayers, aby obsługiwać tę operację. Robię to za pomocą natywnych funkcji OpenLayers. Spróbuj tego, może musisz naprawić i dostosować ten kod.

// The first object is instanced using data given from gmaps 
var objBound1 = new OpenLayers.Bounds(); 
objBound1.extend(new OpenLayers.LonLat(2,2)); 
objBound1.extend(new OpenLayers.LonLat(8,8)); 

// The second object is instanced using data given from gmaps 
var objBound2 = new OpenLayers.Bounds(); 
objBound2.extend(new OpenLayers.LonLat(5,5)); 
objBound2.extend(new OpenLayers.LonLat(10,10)); 

// Extract limits from our objects 
var arrBound1 = objBound1.toArray(); 
var arrBound2 = objBound2.toArray(); 

// Determine an virtual bound. It must contain our two bounds 
var intMinLeft = arrBound1.left < arrBound2.left ? arrBound1.left : arrBound2.left; 
var intMinTop = arrBound1.top < arrBound2.top ? arrBound1.top : arrBound2.top; 
var intMaxRight = arrBound1.right > arrBound2.right ? arrBound1.right : arrBound2.right; 
var intMaxBottom = arrBound1.bottom > arrBound2.bottom ? arrBound1.bottom : arrBound2.bottom; 

// Search all points of virtual bound, storing the points contained in bound1 or bound2 
var objBoundResult = new OpenLayers.Bounds(); 
for(var intI = intMinLeft; intI < intMaxRight; intI++) { 
    for(var intJ = intMinTop; intJ < intMaxBottom; intJ++) { 
     if(objBound1.containsLonLat(new OpenLayers.LonLat(intI, intJ)) || objBound2.containsLonLat(new OpenLayers.LonLat(intI, intJ))) { 
      objBoundResult.add(intI, intJ); 
     } 
    } 
} 

// objBoundResult is what you want 
+0

Nadal muszę to wypróbować, przepraszam za opóźnienie – wolktm

3

Napisałem Zapytanie przestrzenne https://github.com/netshade/spatial_query, aby to zrobić.

Alternatywnie, możesz sprawdzić http://geoscript.org/index.html, która jest prawdopodobnie lepiej obsługiwana niż Zapytanie przestrzenne. Jeśli jednak zdecydujesz się wypróbować SQ, będę pochlebiony, gdy dowiem się, czy to zadziałało.

+0

Właściwie używam spatial_query w tej chwili lubię, ale ma kilka błędów w zjednoczeniu :(Mówiąc o geoscriptach, wygląda to na jakiś kod serwery, czy to jest czy można uruchomić w przeglądarce? – wolktm

+0

Jeśli możesz zamieścić przykład danych wejściowych, które się skręcają (tutaj lub w kwestiach GH dla Spatial Query), zobaczę, co mogę zrobić, aby naprawić implementację –

+0

Geoscript AFA, masz rację , przepraszam - nie patrzyłem dalej w wymagania dotyczące paczek - może być możliwe przeniesienie, ale nie mogę być pewny tego bankructwa - przepraszam za nieścisłość –

-1

Jeśli masz serwer dostępny, możesz uruchomić ESRI ArcGIS Server 10 i uruchomić usługę Geometria. Ta funkcja jest dostępna za pośrednictwem interfejsu API (w tym REST). Spójrz na ich dokumentacji pomocy: SOAP SDK

+0

Po stronie klienta javascript – wolktm

-1

Czy naprawdę trzeba to zrobić po stronie klienta? Unia jest dość ciężką operacją i może być lepiej wykonana po stronie serwera.

Innym API, które mogą być użyteczne jest ArcGIS API JavaScript, chociaż z tego co widzę, nie sądzę, będzie to robić bez unii ArcGIS Server: http://help.arcgis.com/en/webapi/javascript/arcgis/

+1

ArcGIS - Serverside i paid - no thx;) Servside jest powolny() i muszę zrobić związek jus t 2 wielokąty, więc wydajność javascript nie jest problemem (przynajmniej w webkicie) – wolktm

+0

Jakiej usługi szukasz? Jeśli usługa ogranicza Cię, akceptując pojedynczy wielobok, to zjednoczenie po stronie klienta, tak jak mówisz, jest prawdopodobnie jedyną dostępną opcją. W przeciwnym razie, jeśli robisz zapytania do własnego serwera, dlaczego nie zrobić tego po stronie serwera? Jeśli są to tylko dwa wielokąty, możesz również wykonać zapytanie dwukrotnie i zebrać wyniki. – Gnat