Go library for reading and writing ESRI Shapefiles. Pure Golang implementation based on the ESRI Shapefile technical description.
Find a file
2026-08-13 13:52:23 +00:00
test_files Fix invalid test_file/multipatch.shp 2016-08-12 17:45:33 +02:00
.gitignore Added support to load from memory 2019-03-07 19:50:27 -03:00
.hound.yml Add Hound CI support 2017-10-11 00:12:16 +02:00
.travis.yml Add codecov upload to travis 2017-11-21 09:18:32 +01:00
appveyor.yml Correct Appveyor clone folder 2017-10-11 01:33:39 +02:00
errors.go re-enforce zip 2020-10-25 17:09:04 +01:00
errreader.go Symptom: the shape last shape was not being read 2019-02-18 09:22:27 +01:00
go.mod Add write-error propagation, seekable streams, and data integrity 2026-08-12 20:08:17 +00:00
LICENSE License 2014-05-08 10:48:18 +02:00
reader.go Merge remote-tracking branch 'racerxdl/master' 2026-08-12 19:03:43 +00:00
reader_test.go Merge remote-tracking branch 'landru29/custom-reader' 2026-08-12 19:19:38 +00:00
README.md Add write-error propagation, seekable streams, and data integrity 2026-08-12 20:08:17 +00:00
sequentialreader.go Merge pull request #5 from peterstace/check_magic_number 2026-08-12 10:27:18 -07:00
sequentialreader_test.go Fixed golint warnings 2017-10-11 21:18:40 +02:00
shapefile.go Add write-error propagation, seekable streams, and data integrity 2026-08-12 20:08:17 +00:00
shapefile_test.go Call ExtendWithPoint with MaxX,MaxY 2015-04-18 18:30:02 -07:00
shapetype_string.go generate String method for ShapeType 2018-04-24 20:08:50 +02:00
writer.go Add write-error propagation, seekable streams, and data integrity 2026-08-12 20:08:17 +00:00
writer_test.go Add write-error propagation, seekable streams, and data integrity 2026-08-12 20:08:17 +00:00
zipreader.go Merge remote-tracking branch 'landru29/custom-reader' 2026-08-12 19:19:38 +00:00
zipreader_test.go re-enforce zip 2020-10-25 17:09:04 +01:00
zipwriter.go Add missing zipwriter source 2026-08-13 13:52:23 +00:00

go-shp

Build Status Build status Go Report Card Codecov

Go library for reading and writing ESRI Shapefiles. This is a pure Golang implementation based on the ESRI Shapefile technical description.

Usage

Installation

go get github.com/Gleipnir-Technology/go-shp

Importing

import "github.com/Gleipnir-Technology/go-shp"

Examples

Reading a shapefile

// open a shapefile (SHP) for reading
shp, err := os.Open(prefix + ".shp")
if err != nil {
	log.Fatal(err)
}
defer func() { _ = shp.Close() }()

// open a shapefile (DBF) for reading (needed to read attributes)
dbf, err := os.Open(prefix + ".dbf")
if err != nil {
	log.Fatal(err)
}
defer func() { _ = dbf.Close() }()

// Create the Reader
shape, err := New(shp, WithSeekableDBF(dbf))
if err != nil {
	log.Fatal(err)
}
	
// fields from the attribute table (DBF)
fields := shape.Fields()
	
// loop through all features in the shapefile
for shape.Next() {
	n, p := shape.Shape()
	
	// print feature
	fmt.Println(reflect.TypeOf(p).Elem(), p.BBox())
	
	// print attributes
	for k, f := range fields {
		val := shape.ReadAttribute(n, k)
		fmt.Printf("\t%v: %v\n", f, val)
	}
	fmt.Println()
}

Creating a shapefile

// points to write
points := []shp.Point{
	shp.Point{10.0, 10.0},
	shp.Point{10.0, 15.0},
	shp.Point{15.0, 15.0},
	shp.Point{15.0, 10.0},
}
	
// fields to write
nameField, err := shp.StringField("NAME", 25)
if err != nil {
	log.Fatal(err)
}
fields := []shp.Field{nameField}
	
// create and open a shapefile for writing points
shape, err := shp.Create("points.shp", shp.POINT)
if err != nil { log.Fatal(err) }
defer func() { _ = shape.Close() }()
	
// write projection and encoding sidecar files
shape.SetProjection(`GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563]]]`)
shape.SetEncoding("UTF-8")
	
// setup fields for attributes
if err := shape.SetFields(fields); err != nil { log.Fatal(err) }
	
// write points and attributes
for n, point := range points {
	if _, err := shape.Write(&point); err != nil { log.Fatal(err) }
	
	// write attribute for object n for field 0 (NAME)
	if err := shape.WriteAttribute(n, 0, "Point " + strconv.Itoa(n + 1)); err != nil { log.Fatal(err) }
}

Resources