How to inverse the orientation of the holes coordinates of a polygon in geopandas Planned maintenance scheduled April 23, 2019 at 00:00UTC (8:00pm US/Eastern) Announcing the arrival of Valued Associate #679: Cesar Manara Unicorn Meta Zoo #1: Why another podcast?using shapely: translating between Polygons and MultiPolygonsDoes shapely within function identify inner holes?How can I get all the latitude, longitude coordinates/points inside a rectangular polygon drawn in google maps?Order of polygon vertices in general GIS: clockwise or counterclockwiseArcGIS lines to polygons without holes“Hole” argument ignored in call to Polygon functionDraw polygons from self-intersecting lines: Looking for a workaround for inner boundaries / holesLine between outside and inside polygon - geotoolsSpatial join in Geopandas is only finding itselfOGR multipolygon with holes model

Why doesn't SQL Optimizer use my constraint?

Is CEO the "profession" with the most psychopaths?

What does it mean that physics no longer uses mechanical models to describe phenomena?

How to compare two different files line by line in unix?

How to write this math term? with cases it isn't working

Is grep documentation about ignoring case wrong, since it doesn't ignore case in filenames?

What was the first language to use conditional keywords?

Maximum summed subsequences with non-adjacent items

How can I reduce the gap between left and right of cdot with a macro?

Are all finite dimensional hilbert spaces isomorphic to spaces with Euclidean norms?

I want to run a python3 script on startup and in an endless loop on my raspberry pi

How fail-safe is nr as stop bytes?

Amount of permutations on an NxNxN Rubik's Cube

What is the appropriate index architecture when forced to implement IsDeleted (soft deletes)?

What would you call this weird metallic apparatus that allows you to lift people?

SF book about people trapped in a series of worlds they imagine

When a candle burns, why does the top of wick glow if bottom of flame is hottest?

Significance of Cersei's obsession with elephants?

How were pictures turned from film to a big picture in a picture frame before digital scanning?

Most bit efficient text communication method?

What do you call the main part of a joke?

Should I use a zero-interest credit card for a large one-time purchase?

Hangman Game with C++

The code below, is it ill-formed NDR or is it well formed?



How to inverse the orientation of the holes coordinates of a polygon in geopandas



Planned maintenance scheduled April 23, 2019 at 00:00UTC (8:00pm US/Eastern)
Announcing the arrival of Valued Associate #679: Cesar Manara
Unicorn Meta Zoo #1: Why another podcast?using shapely: translating between Polygons and MultiPolygonsDoes shapely within function identify inner holes?How can I get all the latitude, longitude coordinates/points inside a rectangular polygon drawn in google maps?Order of polygon vertices in general GIS: clockwise or counterclockwiseArcGIS lines to polygons without holes“Hole” argument ignored in call to Polygon functionDraw polygons from self-intersecting lines: Looking for a workaround for inner boundaries / holesLine between outside and inside polygon - geotoolsSpatial join in Geopandas is only finding itselfOGR multipolygon with holes model



.everyoneloves__top-leaderboard:empty,.everyoneloves__mid-leaderboard:empty,.everyoneloves__bot-mid-leaderboard:empty margin-bottom:0;








0















I have a polygon shapefile which I am reading with geopandas. The polygon contains holes. My purpose is to add a random point inside each hole.
In order to create the points inside the holes (interior polygon rings), the definition of their coordinates needs to be reversed (from counterclockwise to clockwise) otherwise the point falls outside of the polygon.


I get the coordinates of the interior rings using GeoSeries.interiors and what I get is




LINEARRING (85002.811 446988.023, 85010.79399999999 446992.869, 85005.61900000001 447001.417, 84982.78599999999 446987.513, 84987.933 446978.99, 85001.89999999999 446987.47, 85002.811 446988.023)




How can I reverse the definition of the coordinates? Alternatively, I could get the x,y coordinates in a list and reverse it, but even in this case I cannot find a way to convert the geometry to list.










share|improve this question
























  • Can you post the entire geometry, with the interior rings inside?

    – wfgeo
    Apr 10 at 20:52











  • You can use shapely for that. Geopandas uses fiona, a gdal/ogr wrapper for python for reading and writing from various geodata file formats. As far as i know geopandas does not support any geometric operations, but Shapely does.

    – Andreas Müller
    Apr 10 at 21:08

















0















I have a polygon shapefile which I am reading with geopandas. The polygon contains holes. My purpose is to add a random point inside each hole.
In order to create the points inside the holes (interior polygon rings), the definition of their coordinates needs to be reversed (from counterclockwise to clockwise) otherwise the point falls outside of the polygon.


I get the coordinates of the interior rings using GeoSeries.interiors and what I get is




LINEARRING (85002.811 446988.023, 85010.79399999999 446992.869, 85005.61900000001 447001.417, 84982.78599999999 446987.513, 84987.933 446978.99, 85001.89999999999 446987.47, 85002.811 446988.023)




How can I reverse the definition of the coordinates? Alternatively, I could get the x,y coordinates in a list and reverse it, but even in this case I cannot find a way to convert the geometry to list.










share|improve this question
























  • Can you post the entire geometry, with the interior rings inside?

    – wfgeo
    Apr 10 at 20:52











  • You can use shapely for that. Geopandas uses fiona, a gdal/ogr wrapper for python for reading and writing from various geodata file formats. As far as i know geopandas does not support any geometric operations, but Shapely does.

    – Andreas Müller
    Apr 10 at 21:08













0












0








0








I have a polygon shapefile which I am reading with geopandas. The polygon contains holes. My purpose is to add a random point inside each hole.
In order to create the points inside the holes (interior polygon rings), the definition of their coordinates needs to be reversed (from counterclockwise to clockwise) otherwise the point falls outside of the polygon.


I get the coordinates of the interior rings using GeoSeries.interiors and what I get is




LINEARRING (85002.811 446988.023, 85010.79399999999 446992.869, 85005.61900000001 447001.417, 84982.78599999999 446987.513, 84987.933 446978.99, 85001.89999999999 446987.47, 85002.811 446988.023)




How can I reverse the definition of the coordinates? Alternatively, I could get the x,y coordinates in a list and reverse it, but even in this case I cannot find a way to convert the geometry to list.










share|improve this question
















I have a polygon shapefile which I am reading with geopandas. The polygon contains holes. My purpose is to add a random point inside each hole.
In order to create the points inside the holes (interior polygon rings), the definition of their coordinates needs to be reversed (from counterclockwise to clockwise) otherwise the point falls outside of the polygon.


I get the coordinates of the interior rings using GeoSeries.interiors and what I get is




LINEARRING (85002.811 446988.023, 85010.79399999999 446992.869, 85005.61900000001 447001.417, 84982.78599999999 446987.513, 84987.933 446978.99, 85001.89999999999 446987.47, 85002.811 446988.023)




How can I reverse the definition of the coordinates? Alternatively, I could get the x,y coordinates in a list and reverse it, but even in this case I cannot find a way to convert the geometry to list.







python polygon geopandas holes interior-ring






share|improve this question















share|improve this question













share|improve this question




share|improve this question








edited Apr 12 at 3:18









Paul H

421312




421312










asked Apr 10 at 19:29









ioanna tsakioanna tsak

1




1












  • Can you post the entire geometry, with the interior rings inside?

    – wfgeo
    Apr 10 at 20:52











  • You can use shapely for that. Geopandas uses fiona, a gdal/ogr wrapper for python for reading and writing from various geodata file formats. As far as i know geopandas does not support any geometric operations, but Shapely does.

    – Andreas Müller
    Apr 10 at 21:08

















  • Can you post the entire geometry, with the interior rings inside?

    – wfgeo
    Apr 10 at 20:52











  • You can use shapely for that. Geopandas uses fiona, a gdal/ogr wrapper for python for reading and writing from various geodata file formats. As far as i know geopandas does not support any geometric operations, but Shapely does.

    – Andreas Müller
    Apr 10 at 21:08
















Can you post the entire geometry, with the interior rings inside?

– wfgeo
Apr 10 at 20:52





Can you post the entire geometry, with the interior rings inside?

– wfgeo
Apr 10 at 20:52













You can use shapely for that. Geopandas uses fiona, a gdal/ogr wrapper for python for reading and writing from various geodata file formats. As far as i know geopandas does not support any geometric operations, but Shapely does.

– Andreas Müller
Apr 10 at 21:08





You can use shapely for that. Geopandas uses fiona, a gdal/ogr wrapper for python for reading and writing from various geodata file formats. As far as i know geopandas does not support any geometric operations, but Shapely does.

– Andreas Müller
Apr 10 at 21:08










2 Answers
2






active

oldest

votes


















0














This should do what you want, and works in cases where a polygon has multiple holes. It involves using shapely, which is a geopandas dependency.



Explanations and further reading are in the comments.



import geopandas as gpd
from shapely.geometry import Polygon

# Initializing a polygon with two holes
# See: https://stackoverflow.com/questions/48770822/how-to-make-holes-in-a-polygon-in-shapely-python-having-polygons
outer = Polygon(((0,0),(20,0),(20,20),(0,20),(0,0)))
inners = (Polygon(((4,4),(4,6),(6,6),(6,4),(4,4))), Polygon(((7,7),(7,8),(8,8),(8,7),(7,7))))
p = Polygon(outer.exterior.coords, [inner.exterior.coords for inner in inners])

# Make a geoseries with this polygon
gs = gpd.GeoSeries(0: p)

print("Before:")
print(gs[0])

# Get the interiors and initialize a list for new interior polygons
interiors = gs.interiors
reversed_interior_polys = []

# Iterate through the interiors, and through their subsequent rings
for interior in interiors:
for ring in interior:
# Unpack the ring's coordinates and convert it to a polygon
# See: https://shapely.readthedocs.io/en/stable/manual.html#object.is_ccw
interior_poly_reversed = Polygon(list(ring.coords)[::-1])
reversed_interior_polys.append(interior_poly_reversed)
reversed_interior_polys = tuple(reversed_interior_polys)

# Reconstruct the original polygon from the list reversed polygons we just made
# See (again): https://stackoverflow.com/questions/48770822/how-to-make-holes-in-a-polygon-in-shapely-python-having-polygons
fixed_polygon = Polygon(outer.exterior.coords, [inner.exterior.coords for inner in reversed_interior_polys])

# Map this value back to the GeoSeries
gs[0] = fixed_polygon

print("nAfter:")
print(gs[0])


Output:



Before:
POLYGON ((0 0, 20 0, 20 20, 0 20, 0 0), (4 4, 4 6, 6 6, 6 4, 4 4), (7 7, 7 8, 8 8, 8 7, 7 7))

After:
POLYGON ((0 0, 20 0, 20 20, 0 20, 0 0), (4 4, 6 4, 6 6, 4 6, 4 4), (7 7, 8 7, 8 8, 7 8, 7 7))





share|improve this answer






























    0














    Since the orientation of the exterior ring doesn't matter, you could use the shapely.geometry.polygon.orient function, which will orient the interiors colckwise or counterclockwise.



    Simple example:



    from shapely.geometry import Polygon 
    from shapely.geometry import polygon
    pol = Polygon([(0,0),(1,0),(1,1),(0,1)],[[(0.1,0.1),(0.1,0.2),(0.2,0.2)]])

    [[*p.coords] for p in polygon.orient(pol,-1).interiors]
    #Out[]: [[(0.1, 0.1), (0.2, 0.2), (0.1, 0.2), (0.1, 0.1)]]
    [[*p.coords] for p in polygon.orient(pol,1).interiors]
    #Out[]: [[(0.1, 0.1), (0.1, 0.2), (0.2, 0.2), (0.1, 0.1)]]


    In geopandas you will map the function over the gemetry column with:



    new_geometry_series = dataframe.geometry.apply(polygon.orient,args=(1)) #or -1





    share|improve this answer

























      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%2f318423%2fhow-to-inverse-the-orientation-of-the-holes-coordinates-of-a-polygon-in-geopanda%23new-answer', 'question_page');

      );

      Post as a guest















      Required, but never shown

























      2 Answers
      2






      active

      oldest

      votes








      2 Answers
      2






      active

      oldest

      votes









      active

      oldest

      votes






      active

      oldest

      votes









      0














      This should do what you want, and works in cases where a polygon has multiple holes. It involves using shapely, which is a geopandas dependency.



      Explanations and further reading are in the comments.



      import geopandas as gpd
      from shapely.geometry import Polygon

      # Initializing a polygon with two holes
      # See: https://stackoverflow.com/questions/48770822/how-to-make-holes-in-a-polygon-in-shapely-python-having-polygons
      outer = Polygon(((0,0),(20,0),(20,20),(0,20),(0,0)))
      inners = (Polygon(((4,4),(4,6),(6,6),(6,4),(4,4))), Polygon(((7,7),(7,8),(8,8),(8,7),(7,7))))
      p = Polygon(outer.exterior.coords, [inner.exterior.coords for inner in inners])

      # Make a geoseries with this polygon
      gs = gpd.GeoSeries(0: p)

      print("Before:")
      print(gs[0])

      # Get the interiors and initialize a list for new interior polygons
      interiors = gs.interiors
      reversed_interior_polys = []

      # Iterate through the interiors, and through their subsequent rings
      for interior in interiors:
      for ring in interior:
      # Unpack the ring's coordinates and convert it to a polygon
      # See: https://shapely.readthedocs.io/en/stable/manual.html#object.is_ccw
      interior_poly_reversed = Polygon(list(ring.coords)[::-1])
      reversed_interior_polys.append(interior_poly_reversed)
      reversed_interior_polys = tuple(reversed_interior_polys)

      # Reconstruct the original polygon from the list reversed polygons we just made
      # See (again): https://stackoverflow.com/questions/48770822/how-to-make-holes-in-a-polygon-in-shapely-python-having-polygons
      fixed_polygon = Polygon(outer.exterior.coords, [inner.exterior.coords for inner in reversed_interior_polys])

      # Map this value back to the GeoSeries
      gs[0] = fixed_polygon

      print("nAfter:")
      print(gs[0])


      Output:



      Before:
      POLYGON ((0 0, 20 0, 20 20, 0 20, 0 0), (4 4, 4 6, 6 6, 6 4, 4 4), (7 7, 7 8, 8 8, 8 7, 7 7))

      After:
      POLYGON ((0 0, 20 0, 20 20, 0 20, 0 0), (4 4, 6 4, 6 6, 4 6, 4 4), (7 7, 8 7, 8 8, 7 8, 7 7))





      share|improve this answer



























        0














        This should do what you want, and works in cases where a polygon has multiple holes. It involves using shapely, which is a geopandas dependency.



        Explanations and further reading are in the comments.



        import geopandas as gpd
        from shapely.geometry import Polygon

        # Initializing a polygon with two holes
        # See: https://stackoverflow.com/questions/48770822/how-to-make-holes-in-a-polygon-in-shapely-python-having-polygons
        outer = Polygon(((0,0),(20,0),(20,20),(0,20),(0,0)))
        inners = (Polygon(((4,4),(4,6),(6,6),(6,4),(4,4))), Polygon(((7,7),(7,8),(8,8),(8,7),(7,7))))
        p = Polygon(outer.exterior.coords, [inner.exterior.coords for inner in inners])

        # Make a geoseries with this polygon
        gs = gpd.GeoSeries(0: p)

        print("Before:")
        print(gs[0])

        # Get the interiors and initialize a list for new interior polygons
        interiors = gs.interiors
        reversed_interior_polys = []

        # Iterate through the interiors, and through their subsequent rings
        for interior in interiors:
        for ring in interior:
        # Unpack the ring's coordinates and convert it to a polygon
        # See: https://shapely.readthedocs.io/en/stable/manual.html#object.is_ccw
        interior_poly_reversed = Polygon(list(ring.coords)[::-1])
        reversed_interior_polys.append(interior_poly_reversed)
        reversed_interior_polys = tuple(reversed_interior_polys)

        # Reconstruct the original polygon from the list reversed polygons we just made
        # See (again): https://stackoverflow.com/questions/48770822/how-to-make-holes-in-a-polygon-in-shapely-python-having-polygons
        fixed_polygon = Polygon(outer.exterior.coords, [inner.exterior.coords for inner in reversed_interior_polys])

        # Map this value back to the GeoSeries
        gs[0] = fixed_polygon

        print("nAfter:")
        print(gs[0])


        Output:



        Before:
        POLYGON ((0 0, 20 0, 20 20, 0 20, 0 0), (4 4, 4 6, 6 6, 6 4, 4 4), (7 7, 7 8, 8 8, 8 7, 7 7))

        After:
        POLYGON ((0 0, 20 0, 20 20, 0 20, 0 0), (4 4, 6 4, 6 6, 4 6, 4 4), (7 7, 8 7, 8 8, 7 8, 7 7))





        share|improve this answer

























          0












          0








          0







          This should do what you want, and works in cases where a polygon has multiple holes. It involves using shapely, which is a geopandas dependency.



          Explanations and further reading are in the comments.



          import geopandas as gpd
          from shapely.geometry import Polygon

          # Initializing a polygon with two holes
          # See: https://stackoverflow.com/questions/48770822/how-to-make-holes-in-a-polygon-in-shapely-python-having-polygons
          outer = Polygon(((0,0),(20,0),(20,20),(0,20),(0,0)))
          inners = (Polygon(((4,4),(4,6),(6,6),(6,4),(4,4))), Polygon(((7,7),(7,8),(8,8),(8,7),(7,7))))
          p = Polygon(outer.exterior.coords, [inner.exterior.coords for inner in inners])

          # Make a geoseries with this polygon
          gs = gpd.GeoSeries(0: p)

          print("Before:")
          print(gs[0])

          # Get the interiors and initialize a list for new interior polygons
          interiors = gs.interiors
          reversed_interior_polys = []

          # Iterate through the interiors, and through their subsequent rings
          for interior in interiors:
          for ring in interior:
          # Unpack the ring's coordinates and convert it to a polygon
          # See: https://shapely.readthedocs.io/en/stable/manual.html#object.is_ccw
          interior_poly_reversed = Polygon(list(ring.coords)[::-1])
          reversed_interior_polys.append(interior_poly_reversed)
          reversed_interior_polys = tuple(reversed_interior_polys)

          # Reconstruct the original polygon from the list reversed polygons we just made
          # See (again): https://stackoverflow.com/questions/48770822/how-to-make-holes-in-a-polygon-in-shapely-python-having-polygons
          fixed_polygon = Polygon(outer.exterior.coords, [inner.exterior.coords for inner in reversed_interior_polys])

          # Map this value back to the GeoSeries
          gs[0] = fixed_polygon

          print("nAfter:")
          print(gs[0])


          Output:



          Before:
          POLYGON ((0 0, 20 0, 20 20, 0 20, 0 0), (4 4, 4 6, 6 6, 6 4, 4 4), (7 7, 7 8, 8 8, 8 7, 7 7))

          After:
          POLYGON ((0 0, 20 0, 20 20, 0 20, 0 0), (4 4, 6 4, 6 6, 4 6, 4 4), (7 7, 8 7, 8 8, 7 8, 7 7))





          share|improve this answer













          This should do what you want, and works in cases where a polygon has multiple holes. It involves using shapely, which is a geopandas dependency.



          Explanations and further reading are in the comments.



          import geopandas as gpd
          from shapely.geometry import Polygon

          # Initializing a polygon with two holes
          # See: https://stackoverflow.com/questions/48770822/how-to-make-holes-in-a-polygon-in-shapely-python-having-polygons
          outer = Polygon(((0,0),(20,0),(20,20),(0,20),(0,0)))
          inners = (Polygon(((4,4),(4,6),(6,6),(6,4),(4,4))), Polygon(((7,7),(7,8),(8,8),(8,7),(7,7))))
          p = Polygon(outer.exterior.coords, [inner.exterior.coords for inner in inners])

          # Make a geoseries with this polygon
          gs = gpd.GeoSeries(0: p)

          print("Before:")
          print(gs[0])

          # Get the interiors and initialize a list for new interior polygons
          interiors = gs.interiors
          reversed_interior_polys = []

          # Iterate through the interiors, and through their subsequent rings
          for interior in interiors:
          for ring in interior:
          # Unpack the ring's coordinates and convert it to a polygon
          # See: https://shapely.readthedocs.io/en/stable/manual.html#object.is_ccw
          interior_poly_reversed = Polygon(list(ring.coords)[::-1])
          reversed_interior_polys.append(interior_poly_reversed)
          reversed_interior_polys = tuple(reversed_interior_polys)

          # Reconstruct the original polygon from the list reversed polygons we just made
          # See (again): https://stackoverflow.com/questions/48770822/how-to-make-holes-in-a-polygon-in-shapely-python-having-polygons
          fixed_polygon = Polygon(outer.exterior.coords, [inner.exterior.coords for inner in reversed_interior_polys])

          # Map this value back to the GeoSeries
          gs[0] = fixed_polygon

          print("nAfter:")
          print(gs[0])


          Output:



          Before:
          POLYGON ((0 0, 20 0, 20 20, 0 20, 0 0), (4 4, 4 6, 6 6, 6 4, 4 4), (7 7, 7 8, 8 8, 8 7, 7 7))

          After:
          POLYGON ((0 0, 20 0, 20 20, 0 20, 0 0), (4 4, 6 4, 6 6, 4 6, 4 4), (7 7, 8 7, 8 8, 7 8, 7 7))






          share|improve this answer












          share|improve this answer



          share|improve this answer










          answered Apr 10 at 21:27









          wfgeowfgeo

          1,573519




          1,573519























              0














              Since the orientation of the exterior ring doesn't matter, you could use the shapely.geometry.polygon.orient function, which will orient the interiors colckwise or counterclockwise.



              Simple example:



              from shapely.geometry import Polygon 
              from shapely.geometry import polygon
              pol = Polygon([(0,0),(1,0),(1,1),(0,1)],[[(0.1,0.1),(0.1,0.2),(0.2,0.2)]])

              [[*p.coords] for p in polygon.orient(pol,-1).interiors]
              #Out[]: [[(0.1, 0.1), (0.2, 0.2), (0.1, 0.2), (0.1, 0.1)]]
              [[*p.coords] for p in polygon.orient(pol,1).interiors]
              #Out[]: [[(0.1, 0.1), (0.1, 0.2), (0.2, 0.2), (0.1, 0.1)]]


              In geopandas you will map the function over the gemetry column with:



              new_geometry_series = dataframe.geometry.apply(polygon.orient,args=(1)) #or -1





              share|improve this answer





























                0














                Since the orientation of the exterior ring doesn't matter, you could use the shapely.geometry.polygon.orient function, which will orient the interiors colckwise or counterclockwise.



                Simple example:



                from shapely.geometry import Polygon 
                from shapely.geometry import polygon
                pol = Polygon([(0,0),(1,0),(1,1),(0,1)],[[(0.1,0.1),(0.1,0.2),(0.2,0.2)]])

                [[*p.coords] for p in polygon.orient(pol,-1).interiors]
                #Out[]: [[(0.1, 0.1), (0.2, 0.2), (0.1, 0.2), (0.1, 0.1)]]
                [[*p.coords] for p in polygon.orient(pol,1).interiors]
                #Out[]: [[(0.1, 0.1), (0.1, 0.2), (0.2, 0.2), (0.1, 0.1)]]


                In geopandas you will map the function over the gemetry column with:



                new_geometry_series = dataframe.geometry.apply(polygon.orient,args=(1)) #or -1





                share|improve this answer



























                  0












                  0








                  0







                  Since the orientation of the exterior ring doesn't matter, you could use the shapely.geometry.polygon.orient function, which will orient the interiors colckwise or counterclockwise.



                  Simple example:



                  from shapely.geometry import Polygon 
                  from shapely.geometry import polygon
                  pol = Polygon([(0,0),(1,0),(1,1),(0,1)],[[(0.1,0.1),(0.1,0.2),(0.2,0.2)]])

                  [[*p.coords] for p in polygon.orient(pol,-1).interiors]
                  #Out[]: [[(0.1, 0.1), (0.2, 0.2), (0.1, 0.2), (0.1, 0.1)]]
                  [[*p.coords] for p in polygon.orient(pol,1).interiors]
                  #Out[]: [[(0.1, 0.1), (0.1, 0.2), (0.2, 0.2), (0.1, 0.1)]]


                  In geopandas you will map the function over the gemetry column with:



                  new_geometry_series = dataframe.geometry.apply(polygon.orient,args=(1)) #or -1





                  share|improve this answer















                  Since the orientation of the exterior ring doesn't matter, you could use the shapely.geometry.polygon.orient function, which will orient the interiors colckwise or counterclockwise.



                  Simple example:



                  from shapely.geometry import Polygon 
                  from shapely.geometry import polygon
                  pol = Polygon([(0,0),(1,0),(1,1),(0,1)],[[(0.1,0.1),(0.1,0.2),(0.2,0.2)]])

                  [[*p.coords] for p in polygon.orient(pol,-1).interiors]
                  #Out[]: [[(0.1, 0.1), (0.2, 0.2), (0.1, 0.2), (0.1, 0.1)]]
                  [[*p.coords] for p in polygon.orient(pol,1).interiors]
                  #Out[]: [[(0.1, 0.1), (0.1, 0.2), (0.2, 0.2), (0.1, 0.1)]]


                  In geopandas you will map the function over the gemetry column with:



                  new_geometry_series = dataframe.geometry.apply(polygon.orient,args=(1)) #or -1






                  share|improve this answer














                  share|improve this answer



                  share|improve this answer








                  edited Apr 11 at 0:33

























                  answered Apr 10 at 21:44









                  Javier JCJavier JC

                  663




                  663



























                      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%2f318423%2fhow-to-inverse-the-orientation-of-the-holes-coordinates-of-a-polygon-in-geopanda%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

                      Romeo and Juliet ContentsCharactersSynopsisSourcesDate and textThemes and motifsCriticism and interpretationLegacyScene by sceneSee alsoNotes and referencesSourcesExternal linksNavigation menu"Consumer Price Index (estimate) 1800–"10.2307/28710160037-3222287101610.1093/res/II.5.31910.2307/45967845967810.2307/2869925286992510.1525/jams.1982.35.3.03a00050"Dada Masilo: South African dancer who breaks the rules"10.1093/res/os-XV.57.1610.2307/28680942868094"Sweet Sorrow: Mann-Korman's Romeo and Juliet Closes Sept. 5 at MN's Ordway"the original10.2307/45957745957710.1017/CCOL0521570476.009"Ram Leela box office collections hit massive Rs 100 crore, pulverises prediction"Archived"Broadway Revival of Romeo and Juliet, Starring Orlando Bloom and Condola Rashad, Will Close Dec. 8"Archived10.1075/jhp.7.1.04hon"Wherefore art thou, Romeo? To make us laugh at Navy Pier"the original10.1093/gmo/9781561592630.article.O006772"Ram-leela Review Roundup: Critics Hail Film as Best Adaptation of Romeo and Juliet"Archived10.2307/31946310047-77293194631"Romeo and Juliet get Twitter treatment""Juliet's Nurse by Lois Leveen""Romeo and Juliet: Orlando Bloom's Broadway Debut Released in Theaters for Valentine's Day"Archived"Romeo and Juliet Has No Balcony"10.1093/gmo/9781561592630.article.O00778110.2307/2867423286742310.1076/enst.82.2.115.959510.1080/00138380601042675"A plague o' both your houses: error in GCSE exam paper forces apology""Juliet of the Five O'Clock Shadow, and Other Wonders"10.2307/33912430027-4321339124310.2307/28487440038-7134284874410.2307/29123140149-661129123144728341M"Weekender Guide: Shakespeare on The Drive""balcony"UK public library membership"romeo"UK public library membership10.1017/CCOL9780521844291"Post-Zionist Critique on Israel and the Palestinians Part III: Popular Culture"10.2307/25379071533-86140377-919X2537907"Capulets and Montagues: UK exam board admit mixing names up in Romeo and Juliet paper"Istoria Novellamente Ritrovata di Due Nobili Amanti2027/mdp.390150822329610820-750X"GCSE exam error: Board accidentally rewrites Shakespeare"10.2307/29176390149-66112917639"Exam board apologises after error in English GCSE paper which confused characters in Shakespeare's Romeo and Juliet""From Mariotto and Ganozza to Romeo and Guilietta: Metamorphoses of a Renaissance Tale"10.2307/37323537323510.2307/2867455286745510.2307/28678912867891"10 Questions for Taylor Swift"10.2307/28680922868092"Haymarket Theatre""The Zeffirelli Way: Revealing Talk by Florentine Director""Michael Smuin: 1938-2007 / Prolific dance director had showy career"The Life and Art of Edwin BoothRomeo and JulietRomeo and JulietRomeo and JulietRomeo and JulietEasy Read Romeo and JulietRomeo and Julieteeecb12003684p(data)4099369-3n8211610759dbe00d-a9e2-41a3-b2c1-977dd692899302814385X313670221313670221

                      Creating closest line along the point''s azimuth using PostgreSQL Planned maintenance scheduled April 17/18, 2019 at 00:00UTC (8:00pm US/Eastern) Announcing the arrival of Valued Associate #679: Cesar Manara Unicorn Meta Zoo #1: Why another podcast?Drawing line between points at specific distance in PostGIS?How to efficiently find the closest point over the dateline?How to find the nearest point by using PostGIS function?PostGIS nearest point with LATERAL JOIN in PostgreSQL 9.3+Creating a table and inserting selected streets using plpgsql functionsCreating a table that stores Distances and other columnSaving select query results (year wise) from PostgreSQL/PostGIS to text filesWhat is the information behind this geometry?How to give start and end vertex ids dynamically in pgr_dijkstra?Point to Polygon nearest distance DS_distance is not using geography index & knn <-> or <#> does not give result in orderLine to point conversion with start point and end point detection?

                      Crop image to path created in TikZ? Announcing the arrival of Valued Associate #679: Cesar Manara Planned maintenance scheduled April 17/18, 2019 at 00:00UTC (8:00pm US/Eastern)Crop an inserted image?TikZ pictures does not appear in posterImage behind and beyond crop marks?Tikz picture as large as possible on A4 PageTransparency vs image compression dilemmaHow to crop background from image automatically?Image does not cropTikzexternal capturing crop marks when externalizing pgfplots?How to include image path that contains a dollar signCrop image with left size given