Skip to content

Instantly share code, notes, and snippets.

@JerrySievert
Created May 31, 2013 16:08
Show Gist options
  • Save JerrySievert/5686043 to your computer and use it in GitHub Desktop.
Save JerrySievert/5686043 to your computer and use it in GitHub Desktop.
geojson to esri json
work=# select geoJSONToEsri('{ "type": "Polygon",
"coordinates": [
[ [100.0, 0.0], [101.0, 0.0], [101.0, 1.0], [100.0, 1.0], [100.0, 0.0] ]
]
}', '{ "wkid": 4326 }');
geojsontoesri
--------------------------------------------------------------------------------
--------
{"rings":[[[100,0],[101,0],[101,1],[100,1],[100,0]]],"spatialReference":{"wkid"
:4326}}
@JerrySievert
Copy link
Author

CREATE OR REPLACE FUNCTION geoJSONToEsri(input varchar, sr varchar) RETURNS
VARCHAR AS $$

    var geojson;

    try {
      geojson = JSON.parse(input);
    } catch (err) {
      throw new Error("Unable to parse GeoJSON: " + err.toString());
      return null;
    }


    // This function flattens holes in multipolygons to one array of polygons
    function flattenHoles(array){
      var output = [], polygon;
      for (var i = 0; i < array.length; i++) {
        polygon = array[i];
        if(polygon.length > 1){
          for (var ii = 0; ii < polygon.length; ii++) {
            output.push(polygon[ii]);
          }
        } else {
          output.push(polygon[0]);
        }

      }
      return output;
    }


    // us
    var convert = plv8.find_function("geoJSONToEsri");
    var spatialReference = (sr) ? JSON.parse(sr) : { wkid: 4326 };
    var result = {}, i;

    switch(geojson.type){
    case "Point":
      result.x = geojson.coordinates[0];
      result.y = geojson.coordinates[1];
      result.spatialReference = spatialReference;
      break;
    case "MultiPoint":
      result.points = geojson.coordinates;
      result.spatialReference = spatialReference;
      break;
    case "LineString":
      result.paths = [geojson.coordinates];
      result.spatialReference = spatialReference;
      break;
    case "MultiLineString":
      result.paths = geojson.coordinates;
      result.spatialReference = spatialReference;
      break;
    case "Polygon":
      result.rings = geojson.coordinates;
      result.spatialReference = spatialReference;
      break;
    case "MultiPolygon":
      result.rings = flattenHoles(geojson.coordinates);
      result.spatialReference = spatialReference;
      break;
    case "Feature":
      result.geometry = convert(geojson.geometry, "{ wkid: 4326 }");
      result.attributes = geojson.properties;
      break;
    case "FeatureCollection":
      result = [];
      for (i = 0; i < geojson.features.length; i++){
        result.push(convert(geojson.features[i], "{ wkid: 4326 }"));
      }
      break;
    case "GeometryCollection":
      result = [];
      for (i = 0; i < geojson.geometries.length; i++){
        result.push(convert(geojson.geometries[i], "{ wkid: 4326 }"));
      }
      break;
    }

    return JSON.stringify(result);
$$ LANGUAGE plv8 IMMUTABLE STRICT;

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment