Deleting features in PyQGIS?












4















I am comparing geometries of input layer and output layer features. I want to delete features in output layers which has equal geometry to input feature. I am using following code to do that.



for feat in drain.getFeatures():
for f in outLayer.getFeatures():
if feat.geometry().equals(f.geometry()):
outLayer.dataProvider().deleteFeatures([f.id()])
outLayer.updateFeature(f)


This code deletes features in output layer but while removing output layer from the Qgis desktop, input layer geometries disappears but features are there in attribute table.



What changes can I make in the code to make it work properly?
Here I am adding an image to make my doubt more clearer.



enter image description here



Here, "drain"is an input layer which is open in Qgis screen, it has attributes but features are not displayed(or visible) on the screen. It was coming correctly before executing the code given above.










share|improve this question





























    4















    I am comparing geometries of input layer and output layer features. I want to delete features in output layers which has equal geometry to input feature. I am using following code to do that.



    for feat in drain.getFeatures():
    for f in outLayer.getFeatures():
    if feat.geometry().equals(f.geometry()):
    outLayer.dataProvider().deleteFeatures([f.id()])
    outLayer.updateFeature(f)


    This code deletes features in output layer but while removing output layer from the Qgis desktop, input layer geometries disappears but features are there in attribute table.



    What changes can I make in the code to make it work properly?
    Here I am adding an image to make my doubt more clearer.



    enter image description here



    Here, "drain"is an input layer which is open in Qgis screen, it has attributes but features are not displayed(or visible) on the screen. It was coming correctly before executing the code given above.










    share|improve this question



























      4












      4








      4








      I am comparing geometries of input layer and output layer features. I want to delete features in output layers which has equal geometry to input feature. I am using following code to do that.



      for feat in drain.getFeatures():
      for f in outLayer.getFeatures():
      if feat.geometry().equals(f.geometry()):
      outLayer.dataProvider().deleteFeatures([f.id()])
      outLayer.updateFeature(f)


      This code deletes features in output layer but while removing output layer from the Qgis desktop, input layer geometries disappears but features are there in attribute table.



      What changes can I make in the code to make it work properly?
      Here I am adding an image to make my doubt more clearer.



      enter image description here



      Here, "drain"is an input layer which is open in Qgis screen, it has attributes but features are not displayed(or visible) on the screen. It was coming correctly before executing the code given above.










      share|improve this question
















      I am comparing geometries of input layer and output layer features. I want to delete features in output layers which has equal geometry to input feature. I am using following code to do that.



      for feat in drain.getFeatures():
      for f in outLayer.getFeatures():
      if feat.geometry().equals(f.geometry()):
      outLayer.dataProvider().deleteFeatures([f.id()])
      outLayer.updateFeature(f)


      This code deletes features in output layer but while removing output layer from the Qgis desktop, input layer geometries disappears but features are there in attribute table.



      What changes can I make in the code to make it work properly?
      Here I am adding an image to make my doubt more clearer.



      enter image description here



      Here, "drain"is an input layer which is open in Qgis screen, it has attributes but features are not displayed(or visible) on the screen. It was coming correctly before executing the code given above.







      pyqgis qgis-3 features






      share|improve this question















      share|improve this question













      share|improve this question




      share|improve this question








      edited Mar 20 at 10:04







      VaP

















      asked Mar 20 at 6:45









      VaPVaP

      464




      464






















          1 Answer
          1






          active

          oldest

          votes


















          3














          Decide either to work with the data provider or the layer, not both



          Working directly on the layer has the advantage, that all internals of QGIS are notified about changes/deletions, whereas changes on the data provider just happen, but QGIS will have no information about that internally (just as if those changes would be done completely outside of QGIS). So any cached information inside QGIS (like in the attribute table) will still be there until loaded next time.



          To delete the feature on the layer do



          outLayer.deleteFeature(f.id())


          Don't update a deleted feature



          layer.updateFeature() will apply any geometry or attribute changes you have done to you your feature to the data source. Since you have just deleted your feature there is nothing there to update any more.



          If working on the layer, put it into edit mode



          It's not required if you work on the data source, but if you work on the layer, it needs to be editable.



          with edit(outLayer):
          for drainFeature in drain.getFeatures():
          for outFeature in outLayer.getFeatures():
          if drainFeature.geometry().equals(outFeature.geometry()):
          outLayer.deleteFeature(outFeature.id())





          share|improve this answer
























          • with edit() is giving name error. what can i do about it? I had tried outLayer.startEditing() does it work the same way?

            – VaP
            Mar 20 at 7:33











          • from qgis.core import edit should do the trick. startEditing() also works but you need to be careful to commit the changes in the end and handle exceptions.

            – Matthias Kuhn
            Mar 20 at 7:51











          • this solution didn't work. Input layer is not displaying just like before. Looking forward to get more suggestions.

            – VaP
            Mar 20 at 8:56











          • What exactly do you mean with "input layer is not displaying just like before"?

            – Matthias Kuhn
            Mar 20 at 9:31











          • I have edited the question to make it clear. Please check and give suggestions.

            – VaP
            Mar 20 at 10:06












          Your Answer








          StackExchange.ready(function() {
          var channelOptions = {
          tags: "".split(" "),
          id: "79"
          };
          initTagRenderer("".split(" "), "".split(" "), channelOptions);

          StackExchange.using("externalEditor", function() {
          // Have to fire editor after snippets, if snippets enabled
          if (StackExchange.settings.snippets.snippetsEnabled) {
          StackExchange.using("snippets", function() {
          createEditor();
          });
          }
          else {
          createEditor();
          }
          });

          function createEditor() {
          StackExchange.prepareEditor({
          heartbeatType: 'answer',
          autoActivateHeartbeat: false,
          convertImagesToLinks: false,
          noModals: true,
          showLowRepImageUploadWarning: true,
          reputationToPostImages: null,
          bindNavPrevention: true,
          postfix: "",
          imageUploader: {
          brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
          contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
          allowUrls: true
          },
          onDemand: true,
          discardSelector: ".discard-answer"
          ,immediatelyShowMarkdownHelp:true
          });


          }
          });














          draft saved

          draft discarded


















          StackExchange.ready(
          function () {
          StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fgis.stackexchange.com%2fquestions%2f316057%2fdeleting-features-in-pyqgis%23new-answer', 'question_page');
          }
          );

          Post as a guest















          Required, but never shown

























          1 Answer
          1






          active

          oldest

          votes








          1 Answer
          1






          active

          oldest

          votes









          active

          oldest

          votes






          active

          oldest

          votes









          3














          Decide either to work with the data provider or the layer, not both



          Working directly on the layer has the advantage, that all internals of QGIS are notified about changes/deletions, whereas changes on the data provider just happen, but QGIS will have no information about that internally (just as if those changes would be done completely outside of QGIS). So any cached information inside QGIS (like in the attribute table) will still be there until loaded next time.



          To delete the feature on the layer do



          outLayer.deleteFeature(f.id())


          Don't update a deleted feature



          layer.updateFeature() will apply any geometry or attribute changes you have done to you your feature to the data source. Since you have just deleted your feature there is nothing there to update any more.



          If working on the layer, put it into edit mode



          It's not required if you work on the data source, but if you work on the layer, it needs to be editable.



          with edit(outLayer):
          for drainFeature in drain.getFeatures():
          for outFeature in outLayer.getFeatures():
          if drainFeature.geometry().equals(outFeature.geometry()):
          outLayer.deleteFeature(outFeature.id())





          share|improve this answer
























          • with edit() is giving name error. what can i do about it? I had tried outLayer.startEditing() does it work the same way?

            – VaP
            Mar 20 at 7:33











          • from qgis.core import edit should do the trick. startEditing() also works but you need to be careful to commit the changes in the end and handle exceptions.

            – Matthias Kuhn
            Mar 20 at 7:51











          • this solution didn't work. Input layer is not displaying just like before. Looking forward to get more suggestions.

            – VaP
            Mar 20 at 8:56











          • What exactly do you mean with "input layer is not displaying just like before"?

            – Matthias Kuhn
            Mar 20 at 9:31











          • I have edited the question to make it clear. Please check and give suggestions.

            – VaP
            Mar 20 at 10:06
















          3














          Decide either to work with the data provider or the layer, not both



          Working directly on the layer has the advantage, that all internals of QGIS are notified about changes/deletions, whereas changes on the data provider just happen, but QGIS will have no information about that internally (just as if those changes would be done completely outside of QGIS). So any cached information inside QGIS (like in the attribute table) will still be there until loaded next time.



          To delete the feature on the layer do



          outLayer.deleteFeature(f.id())


          Don't update a deleted feature



          layer.updateFeature() will apply any geometry or attribute changes you have done to you your feature to the data source. Since you have just deleted your feature there is nothing there to update any more.



          If working on the layer, put it into edit mode



          It's not required if you work on the data source, but if you work on the layer, it needs to be editable.



          with edit(outLayer):
          for drainFeature in drain.getFeatures():
          for outFeature in outLayer.getFeatures():
          if drainFeature.geometry().equals(outFeature.geometry()):
          outLayer.deleteFeature(outFeature.id())





          share|improve this answer
























          • with edit() is giving name error. what can i do about it? I had tried outLayer.startEditing() does it work the same way?

            – VaP
            Mar 20 at 7:33











          • from qgis.core import edit should do the trick. startEditing() also works but you need to be careful to commit the changes in the end and handle exceptions.

            – Matthias Kuhn
            Mar 20 at 7:51











          • this solution didn't work. Input layer is not displaying just like before. Looking forward to get more suggestions.

            – VaP
            Mar 20 at 8:56











          • What exactly do you mean with "input layer is not displaying just like before"?

            – Matthias Kuhn
            Mar 20 at 9:31











          • I have edited the question to make it clear. Please check and give suggestions.

            – VaP
            Mar 20 at 10:06














          3












          3








          3







          Decide either to work with the data provider or the layer, not both



          Working directly on the layer has the advantage, that all internals of QGIS are notified about changes/deletions, whereas changes on the data provider just happen, but QGIS will have no information about that internally (just as if those changes would be done completely outside of QGIS). So any cached information inside QGIS (like in the attribute table) will still be there until loaded next time.



          To delete the feature on the layer do



          outLayer.deleteFeature(f.id())


          Don't update a deleted feature



          layer.updateFeature() will apply any geometry or attribute changes you have done to you your feature to the data source. Since you have just deleted your feature there is nothing there to update any more.



          If working on the layer, put it into edit mode



          It's not required if you work on the data source, but if you work on the layer, it needs to be editable.



          with edit(outLayer):
          for drainFeature in drain.getFeatures():
          for outFeature in outLayer.getFeatures():
          if drainFeature.geometry().equals(outFeature.geometry()):
          outLayer.deleteFeature(outFeature.id())





          share|improve this answer













          Decide either to work with the data provider or the layer, not both



          Working directly on the layer has the advantage, that all internals of QGIS are notified about changes/deletions, whereas changes on the data provider just happen, but QGIS will have no information about that internally (just as if those changes would be done completely outside of QGIS). So any cached information inside QGIS (like in the attribute table) will still be there until loaded next time.



          To delete the feature on the layer do



          outLayer.deleteFeature(f.id())


          Don't update a deleted feature



          layer.updateFeature() will apply any geometry or attribute changes you have done to you your feature to the data source. Since you have just deleted your feature there is nothing there to update any more.



          If working on the layer, put it into edit mode



          It's not required if you work on the data source, but if you work on the layer, it needs to be editable.



          with edit(outLayer):
          for drainFeature in drain.getFeatures():
          for outFeature in outLayer.getFeatures():
          if drainFeature.geometry().equals(outFeature.geometry()):
          outLayer.deleteFeature(outFeature.id())






          share|improve this answer












          share|improve this answer



          share|improve this answer










          answered Mar 20 at 6:56









          Matthias KuhnMatthias Kuhn

          19.2k14993




          19.2k14993













          • with edit() is giving name error. what can i do about it? I had tried outLayer.startEditing() does it work the same way?

            – VaP
            Mar 20 at 7:33











          • from qgis.core import edit should do the trick. startEditing() also works but you need to be careful to commit the changes in the end and handle exceptions.

            – Matthias Kuhn
            Mar 20 at 7:51











          • this solution didn't work. Input layer is not displaying just like before. Looking forward to get more suggestions.

            – VaP
            Mar 20 at 8:56











          • What exactly do you mean with "input layer is not displaying just like before"?

            – Matthias Kuhn
            Mar 20 at 9:31











          • I have edited the question to make it clear. Please check and give suggestions.

            – VaP
            Mar 20 at 10:06



















          • with edit() is giving name error. what can i do about it? I had tried outLayer.startEditing() does it work the same way?

            – VaP
            Mar 20 at 7:33











          • from qgis.core import edit should do the trick. startEditing() also works but you need to be careful to commit the changes in the end and handle exceptions.

            – Matthias Kuhn
            Mar 20 at 7:51











          • this solution didn't work. Input layer is not displaying just like before. Looking forward to get more suggestions.

            – VaP
            Mar 20 at 8:56











          • What exactly do you mean with "input layer is not displaying just like before"?

            – Matthias Kuhn
            Mar 20 at 9:31











          • I have edited the question to make it clear. Please check and give suggestions.

            – VaP
            Mar 20 at 10:06

















          with edit() is giving name error. what can i do about it? I had tried outLayer.startEditing() does it work the same way?

          – VaP
          Mar 20 at 7:33





          with edit() is giving name error. what can i do about it? I had tried outLayer.startEditing() does it work the same way?

          – VaP
          Mar 20 at 7:33













          from qgis.core import edit should do the trick. startEditing() also works but you need to be careful to commit the changes in the end and handle exceptions.

          – Matthias Kuhn
          Mar 20 at 7:51





          from qgis.core import edit should do the trick. startEditing() also works but you need to be careful to commit the changes in the end and handle exceptions.

          – Matthias Kuhn
          Mar 20 at 7:51













          this solution didn't work. Input layer is not displaying just like before. Looking forward to get more suggestions.

          – VaP
          Mar 20 at 8:56





          this solution didn't work. Input layer is not displaying just like before. Looking forward to get more suggestions.

          – VaP
          Mar 20 at 8:56













          What exactly do you mean with "input layer is not displaying just like before"?

          – Matthias Kuhn
          Mar 20 at 9:31





          What exactly do you mean with "input layer is not displaying just like before"?

          – Matthias Kuhn
          Mar 20 at 9:31













          I have edited the question to make it clear. Please check and give suggestions.

          – VaP
          Mar 20 at 10:06





          I have edited the question to make it clear. Please check and give suggestions.

          – VaP
          Mar 20 at 10:06


















          draft saved

          draft discarded




















































          Thanks for contributing an answer to Geographic Information Systems Stack Exchange!


          • Please be sure to answer the question. Provide details and share your research!

          But avoid



          • Asking for help, clarification, or responding to other answers.

          • Making statements based on opinion; back them up with references or personal experience.


          To learn more, see our tips on writing great answers.




          draft saved


          draft discarded














          StackExchange.ready(
          function () {
          StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fgis.stackexchange.com%2fquestions%2f316057%2fdeleting-features-in-pyqgis%23new-answer', 'question_page');
          }
          );

          Post as a guest















          Required, but never shown





















































          Required, but never shown














          Required, but never shown












          Required, but never shown







          Required, but never shown

































          Required, but never shown














          Required, but never shown












          Required, but never shown







          Required, but never shown







          Popular posts from this blog

          How to send String Array data to Server using php in android

          Title Spacing in Bjornstrup Chapter, Removing Chapter Number From Contents

          Is anime1.com a legal site for watching anime?