मुझे मुख्य/प्रतिबंध वेक्टर परत के आधार पर वेक्टर परत को क्लिप करना है। ड्राइंग पर, यदि खींची गई परत का कुछ हिस्सा प्रतिबंध परत के बाहर है, तो क्लिप क्षेत्र जो प्रतिबंध परत के बाहर है।

उदाहरण 1. जैसा कि हम देख सकते हैं, निचली सीमा का हिस्सा बाहरी प्रतिबंध (बैंगनी परत) है

enter image description here

मैं सोच रहा था कि क्या यह क्लिप क्षेत्र में फीचर जोड़ने पर संभव है जो कि प्रतिबंध परत के बाहर है

उदाहरण 2. प्रतिबंध परत के बाहर के क्षेत्र को हटाना (हरा रंग)

enter image description here

मैंने (Turf.js) लाइब्रेरी से bboxPolygon फ़ंक्शन का उपयोग करके ज्यामिति की गणना करने का प्रयास किया। यहां तक ​​​​कि बूलियनविथिन के साथ यह पता लगाने की कोशिश की गई कि क्या खींचा गया बहुभुज प्रतिबंध परत के बाहर है, लेकिन कोई फायदा नहीं हुआ।

अब, मैं सोच रहा हूं कि क्या क्षेत्र को क्लिप करना संभव है तो addfeature पर प्रतिबंध परत के भीतर क्लिप किए गए क्षेत्र को प्रस्तुत करें (जैसा कि उदाहरण 2 में दिखाया गया है)

यहां कोड स्निपेट है जिसका उपयोग मैं किसी तरह यह पता लगाने के लिए करता था कि क्या क्षेत्र काटा गया है या यदि यह प्रतिबंध परत के भीतर है।

// detect if drawn layers is outside restriction layer
vectorDrawLayer.getSource().on('addfeature', (evt) => {
  let feature = evt.feature;
  //let coordinatess = feature.getGeometry().clone().transform('EPSG:3857', 'EPSG:4326').getCoordinates();

  let geojsonFormat = new GeoJSON();

  let firstGeometryObject = {};
  let secondGeometryObject = {};

  if (vectorDrawLayer.getSource().getState() === 'ready') {
    let firstGeometry = vectorDrawLayer.getSource().getFeatures()[0];
    let secondGeometry = restrictionLayer.getSource().getFeatures()[0];

    firstGeometryObject = geojsonFormat.writeFeatureObject(firstGeometry, { dataProjection: 'EPSG:4326', featureProjection: 'EPSG:3857' });

    secondGeometryObject = geojsonFormat.writeFeatureObject(secondGeometry, { dataProjection: 'EPSG:4326', featureProjection: 'EPSG:3857' });
  }

  let isWithin = booleanWithin(firstGeometryObject, secondGeometryObject)
  let clipped = bBoxclip(firstGeometryObject, transformedExtent);

  //console.log(JSON.stringify(firstGeometryObject))
  console.log(clipped.geometry.coordinates);
  console.log(isWithin);
})

अद्यतन करें:

मैं http://turfjs.org/docs/#intersect का उपयोग करके प्रतिबंध परत के भीतर केवल बहुभुज निकालने में सक्षम था लेकिन अब मुझे केवल प्रतिच्छेदित परत को प्रस्तुत करने में समस्या हो रही है।

प्रारंभ में, मैं परत स्रोत को हटाना चाहता था, फिर बहुभुज निर्देशांक प्राप्त करने पर मैं नई प्रतिच्छेदित बहुभुज ज्यामिति (बाहरी क्षेत्र के बिना) जोड़ना चाहता हूं, लेकिन मैं कुछ भी प्रस्तुत नहीं कर सकता (लगता है कि मुझे कुछ याद आ रहा है)

यहाँ कोड का टुकड़ा है:

  let geojsonFormat = new GeoJSON();
  let firstGeometryObject = {};
  let secondGeometryObject = {};
  let feature;
  if (vectorDrawLayer.getSource().getState() === 'ready') {

    let firstGeometry = vectorDrawLayer.getSource().getFeatures()[0];
    let secondGeometry = restrictionLayer.getSource().getFeatures()[0];


    firstGeometryObject = geojsonFormat.writeFeatureObject(firstGeometry, { dataProjection: 'EPSG:4326', featureProjection: 'EPSG:3857' });

    secondGeometryObject = geojsonFormat.writeFeatureObject(secondGeometry, { dataProjection: 'EPSG:4326', featureProjection: 'EPSG:3857' });

    let intersectTest = intersect(firstGeometryObject, secondGeometryObject);

    let polygon = new Polygon(intersectTest.geometry.coordinates)

    feature = new Feature({
      geometry: polygon,
      name: 'test BlaBla'
    });
    console.log(feature)
    vectorDrawSource.removeFeature(firstGeometry);
    vectorDrawSource.addFeatures(feature);
  }

यहां परीक्षण ऐप (अपडेट) का लिंक दिया गया है: https://stackblitz.com/edit/js-vpdnbf

2
Svinjica 12 अगस्त 2019, 16:31

2 जवाब

सबसे बढ़िया उत्तर

ठीक है, मैंने इसका पता लगा लिया है। intersect फंक्शन का उपयोग करते हुए मुझे ट्रांसफॉर्म किए गए GeoJSON ऑब्जेक्ट्स को फंक्शन्स में पास करके इंटरसेक्टेड फीचर ऑब्जेक्ट मिला।

उदाहरण:

let secondGeometryObject = secondGeometryObject = geojsonFormat.writeFeatureObject(secondGeometry, { dataProjection: 'EPSG:4326', featureProjection: 'EPSG:3857' });

फिर इंटरसेक्टेड फीचर ऑब्जेक्ट से निर्देशांक का उपयोग करके नया बहुभुज बनाना।

let intersectPolygon = intersect(firstGeometryObject, secondGeometryObject);

let polygon = new Polygon(intersectPolygon.geometry.coordinates)

फिर, मैंने बहुभुज को रूपांतरित किया और रूपांतरित निर्देशांक प्राप्त किए ('EPSG: 4326')

let transformedPoly = polygon.clone().transform('EPSG:4326', 'EPSG:3857').getCoordinates();

और अंत में नए प्राप्त निर्देशांक को ईवेंट फीचर में सेट करें

evt.feature.getGeometry().setCoordinates(transformedPoly);

या, हम इस तरह कुछ उपयोग कर सकते हैं:

// transforming polygon to epsg:3857
let transformedPoly = polygon.clone().transform('EPSG:4326', 'EPSG:3857');
// set newly transformed polygon to feature
evt.feature.setGeometry(transformedPoly);

यहाँ निश्चित समाधान है:

enter image description here

अगर किसी को बेहतर विचार हो रहा है कि निर्देशांक कैसे क्लिप और लाने के लिए उत्तर पोस्ट करने के लिए स्वतंत्र महसूस करें, तो मैं निश्चित रूप से ऊपर उठूंगा :) आशा है कि यह किसी की मदद करता है :)

ऐप का अपडेट किया गया लिंक यहां है: https://stackblitz.com/edit/js-vpdnbf

0
Svinjica 13 अगस्त 2019, 22:53

यदि आपका लक्ष्य बहुभुज के अंदर सुविधाओं को प्रस्तुत करना है तो आप परत पर फसल फ़िल्टर का उपयोग कर सकते हैं। यह उदाहरण देखें https://viglino.github.io /ol-ext/examples/filter/map.filter.crop.html

1
Viglino Jean-Marc 12 अगस्त 2019, 22:09