Skip to content

Instantly share code, notes, and snippets.

View rclark's full-sized avatar

Ryan Clark rclark

View GitHub Profile
@rclark
rclark / testNoder.js
Last active March 11, 2018 19:41
Example of "cleaning" a line network using JSTS to create a properly noded segment network (i.e. nodes at every intersection between segments).
var jsts = require("jsts"),
fs = require("fs"),
javascript = require("javascript.util"),
assert = require("assert"),
lines = [
"LINESTRING(-110.5 32.1,-110.45 32.2,-110.4 32.1)",
"LINESTRING(-110.5 32.25,-110.45 32.2,-110.45 32.15,-110.4 32.25)"
],
expected = [
"LINESTRING(-110.5 32.1,-110.45 32.2)",
@rclark
rclark / index.html
Created August 6, 2013 22:20
via:geojson.io
<!DOCTYPE html>
<html>
<head>
<meta name='viewport' content='width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no' />
<style>
body { margin:0; padding:0; }
#map { position:absolute; top:0; bottom:0; width:100%; }
.marker-properties {
border-collapse:collapse;
@rclark
rclark / lines2polysNoder.js
Created August 6, 2013 21:34
JSTS to create polygons from a network of arbitrary, or "spaghetti" lines. This uses jsts.noding to "clean" or "planarize" the line network, which is crazy fast compared to the "Union" alternative here: https://gist.github.com/rclark/6123614
var jsts = require("jsts"),
u = require("underscore"),
fs = require("fs");
fs.readFile("/Users/ryan/Desktop/hv-lines.geojson", function (err, data) {
var geojson = JSON.parse(data),
writer = new jsts.io.GeoJSONWriter(),
polygonizer = new jsts.operation.polygonize.Polygonizer(),
noder = new jsts.noding.MCIndexNoder(),
intersector = new jsts.algorithm.RobustLineIntersector(),
@rclark
rclark / parse-fema.js
Created August 1, 2013 00:32
Trying to mine data from FEMA National Flood Hazard Layer
var fs = require("fs"),
_ = require("underscore"),
request = require("request"),
baseUrl = "https://hazards.fema.gov/gis/nfhl/rest/services/public/NFHL/MapServer/28",
outEsri = JSON.stringify({"displayFieldName":"DFIRM_ID","fieldAliases":{"FLD_ZONE":"FLD_ZONE","ZONE_SUBTY":"ZONE_SUBTY"},"fields":[{"name":"FLD_ZONE","type":"esriFieldTypeString","alias":"FLD_ZONE","length":17},{"name":"ZONE_SUBTY","type":"esriFieldTypeString","alias":"ZONE_SUBTY","length":57}]}),
outFile = fs.createWriteStream("fema-get-all-esri.json");
outFile.write(outEsri + ",features:[");
request(baseUrl + "?f=json", function (err, response, information) {
@rclark
rclark / error.log
Created July 31, 2013 17:23
Error running TileMill 2 on OSX
WeeSofty:tm2 ryan$ brew upgrade mapnik
Error: mapnik-2.2.0 already installed
WeeSofty:tm2 ryan$ brew upgrade protobuf
Error: protobuf-2.5.0 already installed
WeeSofty:tm2 ryan$ brew upgrade node
Error: node-0.10.15 already installed
WeeSofty:tm2 ryan$ node index.js
module.js:356
Module._extensions[extension](this, filename);
@rclark
rclark / lines2polysUnion.js
Last active June 10, 2017 12:34
JSTS to create polygons from spaghetti lines. Union on lines is the "planarize" step, and is extremely time-consuming for larg-ish numbers of lines (~300 it takes about 2 seconds per each new line to union).
var jsts = require("jsts"),
_ = require("underscore"),
fs = require("fs");
fs.readFile("/Users/ryan/Desktop/hv-lines.geojson", function (err, data) {
var geojson = JSON.parse(data),
reader = new jsts.io.GeoJSONReader(),
writer = new jsts.io.GeoJSONWriter(),
polygonizer = new jsts.operation.polygonize.Polygonizer(),
@rclark
rclark / failed-polygonize.js
Created July 28, 2013 20:35
Example of jsts.operation.polygonize not working on arbitrary "spaghetti" lines
var jsts = require("jsts"),
spaghetti = [
"LINESTRING(-108.6328125 32.54681317351517,-117.7734375 44.33956524809713,-91.0546875 50.51342652633956,-92.46093749999999 30.751277776257812)",
"LINESTRING(-120.58593749999999 25.48295117535531,-106.5234375 42.032974332441405,-78.046875 40.713955826286046)"
],
reader = new jsts.io.WKTReader(),
polygonizer = new jsts.operation.polygonize.Polygonizer(),
polygons, dangles, cutEdges, invalidRingLines;
spaghetti.forEach(function (line) {
@rclark
rclark / test_some_actions.py
Created July 17, 2013 23:57
Little action testing example
from ckanext.ngds.tests.ngds_test_case import NgdsTestCase
class MyActionTestCase(NgdsTestCase):
def test_gobbledee_action(self):
# Generate your POST body
post_body = {
"turkeys": 12,
"gobbles": ["gobble", "gobble"]
}
@rclark
rclark / action.py
Created July 16, 2013 20:45
Layer generation action
def publish(context, data_dict):
# Gather inputs
resource_id = data_dict.get("resource_id", None)
layer_name = data_dict.get("layer_name", resource_id)
username = context.get("user", None)
package_id = data_dict.get("package_id", None)
lat_field = data_dict.get("col_latitude", None)
lng_field = data_dict.get("col_longitude", None)
# Check that you have everything you need
@rclark
rclark / L.TileLayer.EsriImageExports.js
Last active March 12, 2018 04:18
Access dynamic ESRI service layers via "export"
/* When creating a layer pass the ESRI Service's Export URL. e.g.:
* https://eia-ms.esri.com/arcgis/rest/services/20130301StateEnergyProfilesMap/MapServer/export
*/
L.TileLayer.EsriImageExports = L.TileLayer.WMS.extend({
getTileUrl: function (tilePoint) {
// Get the URL if this was just a WMS
var wmsUrl = L.TileLayer.WMS.prototype.call(this, tilePoint),
base = wmsUrl.split("?")[0],
params = wmsUrl.split("?")[1].split("&");