Геопространственные запросы в javascript
Я ищу библиотеку в javascript, которая позволила бы мне делать геопространственные запросы. Я знаю об OpenLayers и GoogleMaps, но эти два не поддерживают такие вещи, как объединение соединений и т.д.
+----+
| |
| +-+--+
+--+-+ |
| |
+----+
to
+----+
| |
| +--+
+--+ |
| |
+----+
Ответы
Ответ 1
Обновление 2014-04-29: посмотрите Turf, выглядит действительно многообещающим
JSTS может создавать объединения геометрических объектов в браузере. JSTS интегрируется с библиотекой openlayers и расширяет геометрические классы openlayers (например, OpenLayers.Geometry.Polygon), поэтому они способны выполнять геометрические операции. Пример:
>> 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 хорош, если вы хотите выполнять геоинформационные операции с серверами в JS.
Ответ 2
Я написал Spatial Query https://github.com/netshade/spatial_query, чтобы сделать это.
В качестве альтернативы вы можете проверить http://geoscript.org/index.html, который, вероятно, лучше поддерживается, чем Пространственный запрос. Если вы решите проверить SQ, но я бы польщен, если бы это сработало для вас.
Ответ 3
Вы можете расширить OpenLayers для поддержки этой операции. Я делаю это с использованием собственных функций OpenLayers. Попробуйте это, возможно, вы должны исправить и настроить этот код.
// 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
Ответ 4
Вы можете получить результаты запроса радиуса или прямоугольника, который включает ваш полигон, а затем отфильтровать результаты, используя описанную здесь методику: http://msdn.microsoft.com/en-us/library/cc451895.aspx, В этом примере используются бинговые карты, но вы можете легко использовать одни и те же принципы, используя любую услугу сопоставления, которую вы предпочитаете.
Ответ 5
Вы посмотрели geoUtils?
Я не уверен, поддерживает ли он команду union, но может попробовать попробовать.
Ответ 6
Если у вас есть сервер, вы можете запустить ESRI ArcGIS Server 10 и запустить службу геометрии. Эта функция доступна через интерфейс API (включая REST). Посмотрите их справочную документацию: SOAP SDK
Ответ 7
Вы используете базу данных PostGIS, которая поддерживает JDBC.
Проверьте здесь пример:
http://postgis.refractions.net/docs/ch05.html#id2644717
:)
ЦОС
Ответ 8
Вам действительно нужно сделать это на стороне клиента? Союз - довольно тяжелая операция и может быть лучше сделана на стороне сервера.
Другим API, который может быть полезен, является API-интерфейс ArcGIS Javascript, хотя из того, что я вижу, я не думаю, что он сделает объединение без ArcGIS Server: http://help.arcgis.com/en/webapi/javascript/arcgis/