Принадлежность точки полигону в MultiLineString в OpenLayers

Не знаете, где задать вопрос? Задавайте здесь.
Ответить
Tink
Участник
Сообщения: 50
Зарегистрирован: 20 июл 2012, 15:49
Репутация: 4

Принадлежность точки полигону в MultiLineString в OpenLayers

Сообщение Tink » 15 янв 2013, 08:45

Есть несколько векторных объектов с геометрией MultiLineString (получены от GeoServer как результат запроса к нему).

Как проверить принадлежность точки (векторного объекта с геометрией типа 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

Сообщение Denis Rykov » 15 янв 2013, 09:58

Похоже, вам нужен метод 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.

Tink
Участник
Сообщения: 50
Зарегистрирован: 20 июл 2012, 15:49
Репутация: 4

Re: Принадлежность точки MultiLineString в OpenLayers

Сообщение Tink » 15 янв 2013, 10:54

Не совсем...
Вектора с типом геометрии 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

Сообщение Denis Rykov » 15 янв 2013, 12:52

Для всяких операций над геометриями (построение буфера, объединение объектов, определение пространственных отношений) очень удобно использовать библиотеку JSTS Topology Suite. Вот пример определения того, находится точка внутри полигона или нет:

Код: Выделить всё

<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.

Tink
Участник
Сообщения: 50
Зарегистрирован: 20 июл 2012, 15:49
Репутация: 4

Re: Принадлежность точки полигону в MultiLineString в OpenLa

Сообщение Tink » 15 янв 2013, 15:32

Да, красиво получается, но это ещё почти 400 Кб...

А средствами OpenLayers получается что такого не сделать ?

Tink
Участник
Сообщения: 50
Зарегистрирован: 20 июл 2012, 15:49
Репутация: 4

Re: Принадлежность точки полигону в MultiLineString в OpenLa

Сообщение Tink » 17 янв 2013, 14:53

Есть ли аналог containsPoint Polygon для MultiPolygon ?

Аватара пользователя
Denis Rykov
Гуру
Сообщения: 3376
Зарегистрирован: 11 апр 2008, 21:09
Репутация: 529
Ваше звание: Author
Контактная информация:

Re: Принадлежность точки полигону в MultiLineString в OpenLa

Сообщение Denis Rykov » 19 янв 2013, 09:12

Tink писал(а):Есть ли аналог containsPoint Polygon для MultiPolygon ?
Можно же проверить вхождение точки в полигоны, входящие в состав мультиполигона. Полигоны доступны через свойство components.
Spatial is now, more than ever, just another column- The Geometry Column.

Tink
Участник
Сообщения: 50
Зарегистрирован: 20 июл 2012, 15:49
Репутация: 4

Re: Принадлежность точки полигону в MultiLineString в OpenLa

Сообщение Tink » 29 янв 2013, 14:35

Спасибо, но этот вариант, к сожалению не очень подходит :(

Ответить

Вернуться в «Я новичок!»

Кто сейчас на конференции

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