1 package net.systemeD.potlatch2.utils {
3 import org.vanrijkom.shp.*;
4 import org.vanrijkom.dbf.*;
5 import com.gradoservice.proj4as.*;
6 import net.systemeD.halcyon.Map;
7 import net.systemeD.halcyon.connection.Connection;
8 import net.systemeD.halcyon.connection.Node;
9 import net.systemeD.halcyon.connection.Way;
10 import net.systemeD.potlatch2.tools.Simplify;
12 public class ShpImporter extends Importer {
14 private var projection:String;
16 public function ShpImporter(connection:Connection, map:Map, filenames:Array, callback:Function=null, simplify:Boolean=false, projection:String="") {
17 if (projection!='') this.projection=projection;
18 super(connection,map,filenames,callback,simplify);
21 override protected function doImport(push:Function): void {
22 // we load .shp as files[0], .shx as files[1], .dbf as files[2]
23 var shp:ShpHeader=new ShpHeader(files[0]);
24 var dbf:DbfHeader=new DbfHeader(files[2]);
27 var proj:Proj4as=new Proj4as();
28 var toProj:ProjProjection=new ProjProjection('EPSG:4326');
29 var fromProj:ProjProjection=new ProjProjection('EPSG:27700');
32 var nodemap:Object={};
33 var key:String, v:String;
35 if (shp.shapeType==ShpType.SHAPE_POLYGON || shp.shapeType==ShpType.SHAPE_POLYLINE) {
37 // Loop through all polylines in the shape
38 var polyArray:Array = ShpTools.readRecords(files[0]);
39 for (var i:uint=0; i<polyArray.length; i++) {
41 // Get attributes and create a tags hash
42 // (note that dr.values is a Dictionary)
43 var dr:DbfRecord = DbfTools.getRecord(files[2], dbf, i);
45 for (key in dr.values) {
47 while (v.substr(v.length-1,1)==" ") v=v.substr(0,v.length-1);
48 if (v!='') tags[key.toLowerCase()]=v;
51 // Do each ring in turn, then each point in the ring
54 var x:Number, y:Number;
55 for (var j:int=0; j < polyArray[i].shape.rings.length; j++) {
56 var nodestring:Array=[];
57 var points:Array = polyArray[i].shape.rings[j];
59 for (var k:int=0; k < points.length; k++) {
60 var p:ShpPoint = ShpPoint(points[k]);
63 var r:ProjPoint = new ProjPoint(p.x,p.y,0);
64 r=proj.transform(fromProj,toProj,r);
71 if (nodemap[key]) { node=nodemap[key]; }
72 else { node=connection.createNode({}, y, x, push); nodemap[key]=node; }
73 nodestring.push(node);
76 if (nodestring.length>0) {
77 way=connection.createWay(tags, nodestring, push);
78 if (simplify) { Simplify.simplify(way, map, false); }