Страница 1 из 1
Принадлежность точки полигону в MultiLineString в OpenLayers
Добавлено: 15 янв 2013, 08:45
Tink
Есть несколько векторных объектов с геометрией
MultiLineString (
получены от GeoServer как результат запроса к нему).
Как проверить принадлежность точки (векторного объекта с геометрией типа
Point) этому векторному объекту, при условии что он не выводится на слой вообще ?
Пробовал через
vectorFeatureMultiLineString[j].containsPoint(point), но ругается что такого метода нет...
Если это не возможно, то подскажите хотя бы как преобразовать
MultiLineString в
Polygon ?..
OpenLayers у меня
2.12
Re: Принадлежность точки MultiLineString в OpenLayers
Добавлено: 15 янв 2013, 09:58
Denis Rykov
Похоже, вам нужен метод
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
Вы это хотели?
Re: Принадлежность точки MultiLineString в OpenLayers
Добавлено: 15 янв 2013, 10:54
Tink
Не совсем...
Вектора с типом геометрии
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-ов и уже к ним применяю
Но я не знаю верно ли я делаю, так как проверю на реальных данных и найти полигоны с дыркой для теста сложно...
Вообще задача, продолжающая
получение от GeoServer полигоны пересекаемые линией...
Нужно получить фрагменты линии находящиеся внутри полученных полигонов.
Функции обрезки вектора (линии) векторным объектом (полигоном) не нашел.
Решил найти точки линии принадлежащие полигону (исключая дырки в нем). Вроде бы нашел нужную функцию, а она не работает с
MultiLineString.
В идеале конечно нужны ещё точки пересечения линии и контуров полигона, но это я думаю чуть позже решить.
Re: Принадлежность точки полигону в MultiLineString в OpenLa
Добавлено: 15 янв 2013, 12:52
Denis Rykov
Для всяких операций над геометриями (построение буфера,
объединение объектов, определение пространственных отношений) очень удобно использовать библиотеку
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));
Re: Принадлежность точки полигону в MultiLineString в OpenLa
Добавлено: 15 янв 2013, 15:32
Tink
Да, красиво получается, но это ещё почти 400 Кб...
А средствами OpenLayers получается что такого не сделать ?
Re: Принадлежность точки полигону в MultiLineString в OpenLa
Добавлено: 17 янв 2013, 14:53
Tink
Есть ли аналог containsPoint Polygon для MultiPolygon ?
Re: Принадлежность точки полигону в MultiLineString в OpenLa
Добавлено: 19 янв 2013, 09:12
Denis Rykov
Tink писал(а):Есть ли аналог containsPoint Polygon для MultiPolygon ?
Можно же проверить вхождение точки в полигоны, входящие в состав мультиполигона. Полигоны доступны через свойство
components.
Re: Принадлежность точки полигону в MultiLineString в OpenLa
Добавлено: 29 янв 2013, 14:35
Tink
Спасибо, но этот вариант, к сожалению не очень подходит
