Thicket data repository for the EEG
1{
2 "id": "https://www.tunbury.org/2015/01/19/shape-files",
3 "title": "Shape Files",
4 "link": "https://www.tunbury.org/2015/01/19/shape-files/",
5 "updated": "2015-01-19T12:41:29",
6 "published": "2015-01-19T12:41:29",
7 "summary": "Below is a perl script to create a PNG from a Shape file.",
8 "content": "<p>Below is a perl script to create a PNG from a Shape file.</p>\n\n<p><a href=\"https://www.tunbury.org/downloads/shapefile.pdf\">Shape file specification</a></p>\n\n<p><a href=\"https://www.tunbury.org/downloads/ROADNODE.zip\">UK Road network as a shape file </a></p>\n\n<div><div><pre><code>use strict;\nuse warnings;\n\nuse GD;\nGD::Image->trueColor(1);\n\nmy $width = 8 * 1024;\nmy $height = 8 * 1024;\n\nmy $shpfile = $ARGV[0];\nopen(FH, \"<$shpfile\") or die(\"No input file\\n\");\nbinmode(FH); \n\nmy $csvfile = $shpfile;\n$csvfile =~ s/.shp$/.csv/g;\nopen(POLYOUT, \">$csvfile\");\n\nmy $buffer;\nmy $num_bytes = read(FH, $buffer, 100);\nmy ($code, $u1, $u2, $u3, $u4, $u5, $filelength, $version, $type, $BBminX, $BBminY, $BBmaxX, $BBmaxY, $BBminZ, $BBmaxZ, $BBminM, $BBmaxM) = unpack(\"N N N N N N N V V F F F F F F F F\", $buffer);\nprint \"code = $code\\n\";\nprint \"filelength = $filelength\\n\";\nprint \"version = $version\\n\";\nprint \"minX = $BBminX\\n\";\nprint \"minY = $BBminY\\n\";\nprint \"maxX = $BBmaxX\\n\";\nprint \"maxY = $BBmaxY\\n\";\nprint \"minZ = $BBminZ\\n\";\nprint \"maxZ = $BBmaxZ\\n\";\nprint \"minM = $BBminM\\n\";\nprint \"maxM = $BBmaxM\\n\";\n\nsub mapx {\n my $x = shift;\n return ($x - $BBminX) / ($BBmaxX - $BBminX) * $width;\n}\n\nsub mapy {\n my $y = shift;\n return $height - ($y - $BBminY) / ($BBmaxY - $BBminY) * $height;\n}\n\nmy $polyCount = 0;\n\nmy $img = new GD::Image($width, $height);\n\nwhile (read(FH, $buffer, 12)) {\n my ($recordnumber, $recordlength, $shapetype) = unpack(\"N N V\", $buffer);\n if ($shapetype == 5) {\n # Polygon\n read(FH, $buffer, 4 * 8 + 2 * 4);\n my ($minX, $minY, $maxX, $maxY, $NumParts, $NumPoints) = unpack(\"F F F F V V\", $buffer);\n my @parts;\n foreach my $part (1 .. $NumParts) {\n read(FH, $buffer, 4);\n my ($part) = unpack(\"V\", $buffer);\n push @parts, $part;\n #syswrite(SHPOUT, pack(\"V\", $part), 4);\n }\n push @parts, $NumPoints;\n @parts = reverse @parts;\n while (@parts) {\n my $firstpoint = pop @parts;\n my $lastpoint = pop @parts;\n my $poly = new GD::Polygon;\n $polyCount++;\n foreach ($firstpoint .. $lastpoint - 1) {\n read(FH, $buffer, 16);\n my ($x, $y) = unpack(\"F F\", $buffer);\n print POLYOUT \"$x,$y,$polyCount\\n\";\n $poly->addPt(mapx($x), mapy($y));\n }\n $img->openPolygon($poly, 0xff0000);\n push @parts, $lastpoint if (@parts);\n }\n } elsif ($shapetype == 3) {\n # PolyLine\n read(FH, $buffer, 4 * 8 + 2 * 4);\n my ($minX, $minY, $maxX, $maxY, $NumParts, $NumPoints) = unpack(\"F F F F V V\", $buffer);\n my @parts;\n foreach my $part (1 .. $NumParts) {\n read(FH, $buffer, 4);\n my ($part) = unpack(\"V\", $buffer);\n push @parts, $part;\n }\n push @parts, $NumPoints;\n @parts = reverse @parts;\n while (@parts) {\n my $firstpoint = pop @parts;\n my $lastpoint = pop @parts;\n read(FH, $buffer, 16);\n my ($x1, $y1) = unpack(\"F F\", $buffer);\n print POLYOUT \"$x1,$y1\\n\";\n foreach ($firstpoint .. $lastpoint - 2) {\n read(FH, $buffer, 16);\n my ($x2, $y2) = unpack(\"F F\", $buffer);\n print POLYOUT \"$x2,$y2\\n\";\n $img->line(mapx($x1), mapy($y1), mapx($x2), mapy($y2), 0xff0000);\n $x1 = $x2;\n $y1 = $y2;\n }\n push @parts, $lastpoint if (@parts);\n }\n\n } elsif ($shapetype == 1) {\n read(FH, $buffer, 2 * 8);\n my ($x, $y) = unpack(\"F F\", $buffer);\n $img->setPixel(mapx($x), mapy($y), 0xff0000);\n print POLYOUT \"$x,$y\\n\";\n } else {\n print \"unhandled type shapetype = $shapetype\\n\";\n read(FH, $buffer, $recordlength * 2 - 4);\n }\n}\n\nclose(POLYOUT);\n\nmy $pngfile = $shpfile;\n$pngfile =~ s/.shp$/.png/g;\nopen(PNGOUT, \">$pngfile\");\nbinmode(PNGOUT);\nprint PNGOUT $img->png;\nclose(PNGOUT);\n</code></pre></div></div>",
9 "content_type": "html",
10 "author": {
11 "name": "Mark Elvers",
12 "email": "mark.elvers@tunbury.org",
13 "uri": null
14 },
15 "categories": [
16 "perl"
17 ],
18 "source": "https://www.tunbury.org/atom.xml"
19}