 
 		public function SpatialJoinTransform()
 		{
-			_source = new StandardLib.ol.source.Vector()
+			_source = new StandardLib.ol.source.Vector();
 			_parser = new StandardLib.ol.format.GeoJSON();
 		}
 
 		override protected function initialize(forceRefresh:Boolean = false):void
 		{
 			super.initialize(true);
+		}
+
+		override public function getHierarchyRoot():IWeaveTreeNode
+		{
+			if (!_rootNode)
+			{
+				_rootNode = new ColumnTreeNode({
+					dataSource: this,
+					data: this,
+					label: getLabel,
+					hasChildBranches: false,
+					children: [
+						generateHierarchyNode({})
+					]
+				});
+			}
+			return _rootNode;
+		}
+
+		override protected function generateHierarchyNode(metadata:Object):IWeaveTreeNode
+		{
+			metadata[ColumnMetadata.TITLE] = ColumnUtils.getTitle(this.geometryColumn)
+			metadata[ColumnMetadata.KEY_TYPE] = this.xColumn.getMetadata(ColumnMetadata.KEY_TYPE);
+			metadata[ColumnMetadata.DATA_TYPE] = this.geometryColumn.getMetadata(ColumnMetadata.KEY_TYPE);
+			return new ColumnTreeNode({
+				dataSource: this,
+				idFields: [],
+				data: metadata
+			});
 		}
 
 		override protected function requestColumnFromSource(proxyColumn:ProxyColumn):void

				}
			}

			var column:StringColumn = new StringColumn();
			column.setRecords(keys, data);
			proxyColumn.setInternalColumn(column);
		}

	import weavejs.api.data.IDataSource;
	import weavejs.api.data.IQualifiedKey;
	import weavejs.api.data.ISelectableAttributes;
	import weavejs.api.data.IWeaveTreeNode;
	import weavejs.core.LinkableString;
	import weavejs.data.ColumnUtils;
	import weavejs.data.column.DynamicColumn;
	import weavejs.data.column.ProxyColumn;
	import weavejs.data.column.StringColumn;
	import weavejs.data.hierarchy.ColumnTreeNode;
	import weavejs.util.ArrayUtils;
	import weavejs.util.JS;
	import weavejs.util.StandardLib;
