Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

readshapefile fails on certain filenames #151

Open
aaschwanden opened this issue Apr 28, 2014 · 7 comments
Open

readshapefile fails on certain filenames #151

aaschwanden opened this issue Apr 28, 2014 · 7 comments

Comments

@aaschwanden
Copy link

Hi,

(Tested with basemap 1.0.6)

This works:

m.readshapefile('foo.shp', 'my_shape')

while this fails:

m.readshapefile('bar_0.1.shp', 'my_shape')

raise IOError('error reading shapefile %s.shp' % shapefile)
  fields = shf.fields
  coords = []; attributes = []

IOError: error reading shapefile bar_0.1.shp

Note that foo.shp and bar_0.1.shp are exactly the same file except for the filename. So it seems that the additional . causes the problem. Minimal example to reproduce behavior:

Rename huralll020.{shp,dfb,shx} to huralll020_0.1.{shp,dbf,shx} and change filename in examples/hurrtracks.py accordingly. Run hurrtracks.py.

Of course the obvious workaround is not to use . in filenames. But this is somewhat impracticable as I have a large number or files and would like keeping the filenames consistent accross filetypes (netCDF, shapfiles, pngs, etc).

Is there an easy fix?

Thanks very much,

Andy

@guziy
Copy link
Contributor

guziy commented Apr 28, 2014

Hmm:

I look at the code and do not understand how it worked for you .... What
happens if you don't specify the .shp extension?

Thanks

2014-04-28 18:10 GMT-04:00 Andy Aschwanden notifications@github.com:

Hi,

(Tested with basemap 1.0.6)

This works:

m.readshapefile('foo.shp', 'my_shape')

while this fails:

m.readshapefile('bar_0.1.shp', 'my_shape')

raise IOError('error reading shapefile %s.shp' % shapefile)
fields = shf.fields
coords = []; attributes = []

IOError: error reading shapefile bar_0.1.shp

Note that foo.shp and bar_0.1.shp are exactly the same file except for the
filename. So it seems that the additional . causes the problem. Minimal
example to reproduce behavior:

Rename huralll020.{shp,dfb,shx} to huralll020_0.1.{shp,dbf,shx} and
change filename in examples/hurrtracks.py accordingly. Run hurrtracks.py.

Of course the obvious workaround is not to use . in filenames. But this
is somewhat impracticable as I have a large number or files and would like
keeping the filenames consistent accross filetypes (netCDF, shapfiles,
pngs, etc).

Is there an easy fix?

Thanks very much,

Andy


Reply to this email directly or view it on GitHubhttps://github.com//issues/151
.

Sasha

@aaschwanden
Copy link
Author

Sorry, I was not clear enough, the above code was a snippet from my scripts. I don't specify the the .shp extension, so the above should read:

This works:

m.readshapefile('foo, 'my_shape')

while this fails:

m.readshapefile('bar_0.1', 'my_shape')

Andy

@guziy
Copy link
Contributor

guziy commented Apr 28, 2014

I think you are not passing the extension to readshapefile, it is just a
typo in your example, right?

If this is so then the culprit is this line:

https://github.com/matplotlib/basemap/blob/master/lib/mpl_toolkits/basemap/shapefile.py#L249

It is not to hard to fix, so If you want the glory, go ahead) If Jeff won't
mind.

Cheers

2014-04-28 18:31 GMT-04:00 Oleksandr Huziy guziy.sasha@gmail.com:

Hmm:

I look at the code and do not understand how it worked for you .... What
happens if you don't specify the .shp extension?

Thanks

2014-04-28 18:10 GMT-04:00 Andy Aschwanden notifications@github.com:

Hi,

(Tested with basemap 1.0.6)

This works:

m.readshapefile('foo.shp', 'my_shape')

while this fails:

m.readshapefile('bar_0.1.shp', 'my_shape')

raise IOError('error reading shapefile %s.shp' % shapefile)
fields = shf.fields
coords = []; attributes = []

IOError: error reading shapefile bar_0.1.shp

Note that foo.shp and bar_0.1.shp are exactly the same file except for
the filename. So it seems that the additional . causes the problem.
Minimal example to reproduce behavior:

Rename huralll020.{shp,dfb,shx} to huralll020_0.1.{shp,dbf,shx} and
change filename in examples/hurrtracks.py accordingly. Run hurrtracks.py.

Of course the obvious workaround is not to use . in filenames. But this
is somewhat impracticable as I have a large number or files and would like
keeping the filenames consistent accross filetypes (netCDF, shapfiles,
pngs, etc).

Is there an easy fix?

Thanks very much,

Andy


Reply to this email directly or view it on GitHubhttps://github.com//issues/151
.

Sasha

Sasha

@guziy
Copy link
Contributor

guziy commented Apr 28, 2014

I would do smth like this:

if os.path.isfile(shapefile):
(shapeName, ext) = os.path.splitext(shapefile)
else:
shapeName = shapefile

self.shapeName = shapeName

Cheers

2014-04-28 18:44 GMT-04:00 Oleksandr Huziy guziy.sasha@gmail.com:

I think you are not passing the extension to readshapefile, it is just a
typo in your example, right?

If this is so then the culprit is this line:

https://github.com/matplotlib/basemap/blob/master/lib/mpl_toolkits/basemap/shapefile.py#L249

It is not to hard to fix, so If you want the glory, go ahead) If Jeff
won't mind.

Cheers

2014-04-28 18:31 GMT-04:00 Oleksandr Huziy guziy.sasha@gmail.com:

Hmm:

I look at the code and do not understand how it worked for you .... What
happens if you don't specify the .shp extension?

Thanks

2014-04-28 18:10 GMT-04:00 Andy Aschwanden notifications@github.com:

Hi,

(Tested with basemap 1.0.6)

This works:

m.readshapefile('foo.shp', 'my_shape')

while this fails:

m.readshapefile('bar_0.1.shp', 'my_shape')

raise IOError('error reading shapefile %s.shp' % shapefile)
fields = shf.fields
coords = []; attributes = []

IOError: error reading shapefile bar_0.1.shp

Note that foo.shp and bar_0.1.shp are exactly the same file except for
the filename. So it seems that the additional . causes the problem.
Minimal example to reproduce behavior:

Rename huralll020.{shp,dfb,shx} to huralll020_0.1.{shp,dbf,shx} and
change filename in examples/hurrtracks.py accordingly. Run
hurrtracks.py.

Of course the obvious workaround is not to use . in filenames. But this
is somewhat impracticable as I have a large number or files and would like
keeping the filenames consistent accross filetypes (netCDF, shapfiles,
pngs, etc).

Is there an easy fix?

Thanks very much,

Andy


Reply to this email directly or view it on GitHubhttps://github.com//issues/151
.

Sasha

Sasha

Sasha

@aaschwanden
Copy link
Author

Correct, I realized that basemap does not accept the extension, so my script removes it first, before passing the name to m.readshapfile. The script looks something like this

    shape_filename = ['foo.shp', 'bar_0.1.shp']
    for index, shpfile in enumerate(shape_filename):
        # remove .shp extension
        shpfile = shpfile.split('.shp')[0]
        m.readshapefile(shpfile,
                            'my_shapefile', linewidth=.75)

I'm not an expert python programmer, so this is sort of a hack as it can fail when the filename contains the pattern .shp besides the extension.

@aaschwanden
Copy link
Author

@guziy 👍 Yes that should work. I can go ahead and make the code change, if that's ok.

@guziy
Copy link
Contributor

guziy commented Aug 31, 2022

This issue can be closed here, if the issue is still there, then it should be reported to the pyshp project (I am guessing here: https://github.com/GeospatialPython/pyshp).

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants