Принадлежность точки полигону в MultiLineString в OpenLayers
-
- Участник
- Сообщения: 50
- Зарегистрирован: 20 июл 2012, 15:49
- Репутация: 4
Принадлежность точки полигону в MultiLineString в OpenLayers
Есть несколько векторных объектов с геометрией MultiLineString (получены от GeoServer как результат запроса к нему).
Как проверить принадлежность точки (векторного объекта с геометрией типа Point) этому векторному объекту, при условии что он не выводится на слой вообще ?
Пробовал через vectorFeatureMultiLineString[j].containsPoint(point), но ругается что такого метода нет...
Если это не возможно, то подскажите хотя бы как преобразовать MultiLineString в Polygon ?..
OpenLayers у меня 2.12
Как проверить принадлежность точки (векторного объекта с геометрией типа Point) этому векторному объекту, при условии что он не выводится на слой вообще ?
Пробовал через vectorFeatureMultiLineString[j].containsPoint(point), но ругается что такого метода нет...
Если это не возможно, то подскажите хотя бы как преобразовать MultiLineString в Polygon ?..
OpenLayers у меня 2.12
Последний раз редактировалось Tink 15 янв 2013, 11:17, всего редактировалось 3 раза.
- Denis Rykov
- Гуру
- Сообщения: 3376
- Зарегистрирован: 11 апр 2008, 21:09
- Репутация: 529
- Ваше звание: Author
- Контактная информация:
Re: Принадлежность точки MultiLineString в OpenLayers
Похоже, вам нужен метод intersects класса OpenLayers.Geometry.Point:
Вы это хотели?
Код: Выделить всё
>> p1 = new OpenLayers.Geometry.Point(1,1);
>> p2 = new OpenLayers.Geometry.Point(2,2);
>> p3 = new OpenLayers.Geometry.Point(3,3);
>> p4 = new OpenLayers.Geometry.Point(4,4);
>> ls1 = new OpenLayers.Geometry.LineString([p1,p2]);
>> ls2 = new OpenLayers.Geometry.LineString([p3, p4]);
>> mls = new OpenLayers.Geometry.MultiLineString([ls1,ls2]);
>> target = new OpenLayers.Geometry.Point(1.5,1.5);
>> target.intersects(mls);
true
Spatial is now, more than ever, just another column- The Geometry Column.
-
- Участник
- Сообщения: 50
- Зарегистрирован: 20 июл 2012, 15:49
- Репутация: 4
Re: Принадлежность точки MultiLineString в OpenLayers
Не совсем...
Вектора с типом геометрии MultiLineString от GeoServer содержат полигоны с дырками (как я понял, [0] - это контур полигона, а остальное - это полигоны дырок).
Вот мне и нужно проверить факт попадания точки в этот полигон (но не в его дырки).
Сейчас я делаю так:
То есть получаю вместо массива MultiLineString-ов (полученных из ответа GeoServer) массив Polygon-ов и уже к ним применяю
Но я не знаю верно ли я делаю, так как проверю на реальных данных и найти полигоны с дыркой для теста сложно...
Вообще задача, продолжающая получение от GeoServer полигоны пересекаемые линией...
Нужно получить фрагменты линии находящиеся внутри полученных полигонов.
Функции обрезки вектора (линии) векторным объектом (полигоном) не нашел.
Решил найти точки линии принадлежащие полигону (исключая дырки в нем). Вроде бы нашел нужную функцию, а она не работает с MultiLineString.
В идеале конечно нужны ещё точки пересечения линии и контуров полигона, но это я думаю чуть позже решить.
Вектора с типом геометрии MultiLineString от GeoServer содержат полигоны с дырками (как я понял, [0] - это контур полигона, а остальное - это полигоны дырок).
Вот мне и нужно проверить факт попадания точки в этот полигон (но не в его дырки).
Сейчас я делаю так:
Код: Выделить всё
var gmlFormat = new OpenLayers.Format.GML.v3();
var gmlLayer = gmlFormat.read(result.responseText);
var fields = [];
for (var i = 0; i < gmlLayer.length; i++) {
var lines = [];
for (var j = 0; j < list.length; j++) {
lines.push(new OpenLayers.Geometry.LinearRing(gmlLayer.geometry.components[j].components));
};
fields.push( new OpenLayers.Geometry.Polygon(lines) );
};
То есть получаю вместо массива MultiLineString-ов (полученных из ответа GeoServer) массив Polygon-ов и уже к ним применяю
Код: Выделить всё
fields.containsPoint(point)
Но я не знаю верно ли я делаю, так как проверю на реальных данных и найти полигоны с дыркой для теста сложно...
Вообще задача, продолжающая получение от GeoServer полигоны пересекаемые линией...
Нужно получить фрагменты линии находящиеся внутри полученных полигонов.
Функции обрезки вектора (линии) векторным объектом (полигоном) не нашел.
Решил найти точки линии принадлежащие полигону (исключая дырки в нем). Вроде бы нашел нужную функцию, а она не работает с MultiLineString.
В идеале конечно нужны ещё точки пересечения линии и контуров полигона, но это я думаю чуть позже решить.
- Denis Rykov
- Гуру
- Сообщения: 3376
- Зарегистрирован: 11 апр 2008, 21:09
- Репутация: 529
- Ваше звание: Author
- Контактная информация:
Re: Принадлежность точки полигону в MultiLineString в OpenLa
Для всяких операций над геометриями (построение буфера, объединение объектов, определение пространственных отношений) очень удобно использовать библиотеку JSTS Topology Suite. Вот пример определения того, находится точка внутри полигона или нет:
ДЕМО
Чтобы найти геометрию, представляющую собой пересечение двух других - используйте метод intersection. Полученная в результате такой операции геометрия может быть использована напрямую в OpenLayers, например:
Код: Выделить всё
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>JSTS Example</title>
<script src="http://openlayers.org/dev/OpenLayers.js"></script>
<script src="https://raw.github.com/bjornharrtell/jsts/master/lib/javascript.util.js"></script>
<script src="https://raw.github.com/bjornharrtell/jsts/master/lib/jsts.js"></script>
<script type="text/javascript">
function init(){
var map = new OpenLayers.Map('map', {
maxExtent: new OpenLayers.Bounds(0, 0, 10, 10),
maxResolution: 100,
units: 'm',
controls: [new OpenLayers.Control.MousePosition(), new OpenLayers.Control.Navigation()]
});
layer = new OpenLayers.Layer.Vector('test', {isBaseLayer: true});
map.addLayer(layer);
map.zoomToMaxExtent();
outer = new OpenLayers.Geometry.LinearRing([
new OpenLayers.Geometry.Point(1,1),
new OpenLayers.Geometry.Point(4,1),
new OpenLayers.Geometry.Point(4,4),
new OpenLayers.Geometry.Point(1,4)]);
inner = new OpenLayers.Geometry.LinearRing([
new OpenLayers.Geometry.Point(2,3),
new OpenLayers.Geometry.Point(3,3),
new OpenLayers.Geometry.Point(3,2),
new OpenLayers.Geometry.Point(2,2)]
);
polygon = new OpenLayers.Geometry.Polygon([outer, inner]);
point_in = new OpenLayers.Geometry.Point(2.5,2.5);
point_out = new OpenLayers.Geometry.Point(3.5,3.5);
layer.addFeatures([new OpenLayers.Feature.Vector(polygon), new OpenLayers.Feature.Vector(point_in), new OpenLayers.Feature.Vector(point_out)]);
reader = new jsts.io.WKTReader();
polygonJSTS = reader.read(polygon.toString());
pointJSTS_in = reader.read(point_in.toString());
pointJSTS_out = reader.read(point_out.toString());
console.log("Точка (2.5, 2.5) внутри полигона:"+{false: "нет", true: "да"}[pointJSTS_in.within(polygonJSTS)]);
console.log("Точка (3.5, 3.5) внутри полигона:"+{false: "нет", true: "да"}[pointJSTS_out.within(polygonJSTS)]);
}
</script>
</head>
<body onload="init()">
<div id="map" style="width:640px; height:480px;"></div>
</body>
</html>
Чтобы найти геометрию, представляющую собой пересечение двух других - используйте метод intersection. Полученная в результате такой операции геометрия может быть использована напрямую в OpenLayers, например:
Код: Выделить всё
feature = new OpenLayers.Feature.Vector(pointJSTS_out.intersection(polygonJSTS));
Spatial is now, more than ever, just another column- The Geometry Column.
-
- Участник
- Сообщения: 50
- Зарегистрирован: 20 июл 2012, 15:49
- Репутация: 4
Re: Принадлежность точки полигону в MultiLineString в OpenLa
Да, красиво получается, но это ещё почти 400 Кб...
А средствами OpenLayers получается что такого не сделать ?
А средствами OpenLayers получается что такого не сделать ?
-
- Участник
- Сообщения: 50
- Зарегистрирован: 20 июл 2012, 15:49
- Репутация: 4
Re: Принадлежность точки полигону в MultiLineString в OpenLa
Есть ли аналог containsPoint Polygon для MultiPolygon ?
- Denis Rykov
- Гуру
- Сообщения: 3376
- Зарегистрирован: 11 апр 2008, 21:09
- Репутация: 529
- Ваше звание: Author
- Контактная информация:
Re: Принадлежность точки полигону в MultiLineString в OpenLa
Можно же проверить вхождение точки в полигоны, входящие в состав мультиполигона. Полигоны доступны через свойство components.Tink писал(а):Есть ли аналог containsPoint Polygon для MultiPolygon ?
Spatial is now, more than ever, just another column- The Geometry Column.
-
- Участник
- Сообщения: 50
- Зарегистрирован: 20 июл 2012, 15:49
- Репутация: 4
Re: Принадлежность точки полигону в MultiLineString в OpenLa
Спасибо, но этот вариант, к сожалению не очень подходит 

Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 4 гостя