Vector Layers
- Configure the library
- Supported formats
- Open datasources
- Inspecting layers
- Get layers features
- Get layers fields
- Get features geometries
- Layer Spatial Referece Systems
- Visualize the non geometric data in a deedle frame
- Getting and Querying Open Street Map Data
The OGR part of GDAL/OGR Library provides a single vector abstract data model to the calling application for a variety of different supported formats including among others the well known ESRI Shapefile, but also RDBMSes, directories full of files, or even remote web services depending on the driver being used.
Configure the library
Initially it is necessary to configure the library and register all the format drivers that are desired.
The FSharp.Gdal library accomplishes this calling the function Configuration.Init()
:
1:
|
|
Supported formats
The list of the supported formats is very big: to check that the library is correctly configured and all OGR drivers are properly registered we call:
1:
|
|
|
Open datasources
Next we need to open the input OGR datasource. Despite the varietry of formats the datasource name is always a single string.
In this case we will open a shapefile provided by the Italian National Institute of Statistics (Istat) containing the administrative limits of italian regions.
1: 2: 3: 4: 5: |
|
|
An OGR.DataSource
contains a set of OGR.Layer
s each of which in turn contains a
set of OGR.Feature
s and an OGR.FeatureDefn
.
Globally we can though of the datasource as a database, a layer as a table in the database and the layer's features as its records while the feature definition provides its columns.
From the output above this structure is not visbile. The aim of FSharp.Gdal
is to improve
the use of the standard OGR/GDAL library within the fsharp interactive shell and to
provide utility functions to make it easier (and more idiomatic) writing F# scripts
to process geospatial data.
To this aim the first thing that we want is to get immediately from the output an overview
of the objects we're dealing with and an hint to successive inspections. The first of this functions
is datasourceInfo
implemented in the FSharp.Gdal.Vector
module (below we will use more of
these functions the implementation of which can be viewed directly in the source code of the
Vector module ).
1:
|
|
|
Not only we can call directly the datasourceInfo
function but we can also use it to define a
custom printer for the OGR.DataSource
:
1:
|
|
In the sequel we will inspect the layer's structure and define a custom printer also for the OGR.Layer
after that
whenever we will open again a new datasource we will get all the infos describing its structure.
Inspecting layers
As pointed out above an OGR.DataSource
can potentially have many layers associated with it. The number
of available layers can be queried with GetLayerCount()
and individual layers fetched by index using GetLayerByIndex
.
1: 2: 3: |
|
|
1:
|
|
instead of using these low level GDAL/OGR methods however the Vector
module provides the
function layers
which returns the layers in a Vector DataSource as an F# list.
1:
|
|
|
As we can see the output is still not very informative so we call the function
layerInfo
to immediately inspect the layer's content:
1: 2: 3: |
|
1:
|
|
|
This is better: now we can see that the layer has 20 features (records) in it, is a layer of geometry type polygon and all features in it provide three non geometric informations (attributes or fields): COD_REG, REGIONE and POP2001.
To complete the configuration of the F# interactive shell we use the function
to define the custom printer for the OGR.Layer
type:
1:
|
|
Get layers features
A layer contains a set of features that can be viewed as records of a database table.
To get them just call features
to obtain an F# list:
1: 2: |
|
Get layers fields
The feature definition is globally associated to the containing layer. Here the function to use
is fields
which returns a tuple of all the index, name and type of the fields
in the layer's definition.
1: 2: 3: 4: |
|
|
In this case the attribute "Regione" is the region's name so we can iterate over all features to get all the italian regions' names quering the field with index 1:
1: 2: 3: |
|
|
Get features geometries
In addition to attributes a feature contains a geometry field. In this example each feature
corresponds to an italian region. To graphically plot them we can collect all features' geometries
in a geometry collection and call the Plot
utility (see Plot Geometry) to get
a map of Italy divided by regions:
1: 2: 3: 4: 5: 6: |
|
Spatial reference system
A geometry is always defined in a coordinate system but in the case of geospatial data we talk more properly of Spatial Referece Systems:
1:
|
|
1:
|
|
|
Visualize the non geometric data in a deedle frame
Deedle is an F# library for data
exploration and manipulation. FSharp.Gdal wants to be deedle friendly and while
it does not reference directly this library it provides the function toValues
to immediately convert vector geospatial data in a deedle frame:
1: 2: 3: 4: 5: 6: |
|
COD_REG |
REGIONE |
POP2001 |
Geometry |
|
---|---|---|---|---|
0 |
1 |
PIEMONTE |
4214677 |
OSGeo.OGR.Geometry |
1 |
2 |
VALLE D'AOSTA |
119548 |
OSGeo.OGR.Geometry |
2 |
3 |
LOMBARDIA |
9032554 |
OSGeo.OGR.Geometry |
3 |
4 |
TRENTINO-ALTO ADIGE |
940016 |
OSGeo.OGR.Geometry |
4 |
5 |
VENETO |
4527694 |
OSGeo.OGR.Geometry |
5 |
6 |
FRIULI VENEZIA GIULIA |
1183764 |
OSGeo.OGR.Geometry |
6 |
7 |
LIGURIA |
1571783 |
OSGeo.OGR.Geometry |
7 |
8 |
EMILIA-ROMAGNA |
3983346 |
OSGeo.OGR.Geometry |
... |
... |
... |
... |
... |
16 |
17 |
BASILICATA |
597768 |
OSGeo.OGR.Geometry |
17 |
18 |
CALABRIA |
2011466 |
OSGeo.OGR.Geometry |
18 |
19 |
SICILIA |
4968991 |
OSGeo.OGR.Geometry |
19 |
20 |
SARDEGNA |
1631880 |
OSGeo.OGR.Geometry |
As we can see the data converted in a deedle frame are more readable and we can take advantage of the library capabilities to make aggregations, pivoting and scientific and statistical calculations on the data.
Getting and Querying Open Street Map Data
As pointed in the beginning GDAL/OGR library has the capabilites of access not only file datasources as shapefiles, but also RDBMSes, web services, etc. In this section we can see how to use it to get data from the OpenStreetMap.
OpenStreetMap is one of largest (probably the largest accessible one) source of geospatial data. It provides not only a free map accessible from the website Openstreetmap.org but also an Editing API for fetching and saving raw geodata from/to the OpenStreetMap database and an Overpass API which provides read-only API access.
In this section we will see how to
- fetch data from the Overpass API using the methods in the
FSharp.Data
library - save the data to a file (standard .NET methods)
- querying the saved data mixing the GDAL/OGR library's methods with F# and in particular with the Deedle library
The first thing is to download the data. In this case we want all the streets in Malesco (one of the "biggest" city centre at the border of the Val Grande National Park).
I won't go much into the deatils of the query syntax here which can be found on the wiki site
Overpass API but just to be clear
we are querying for all the ways (streets, waterway, etc.): way[name=*]
;in the bounding
box containing Malesco city: [bbox=8.4872,46.1220,8.5140,46.1331]
1: 2: 3: 4: 5: 6: 7: 8: |
|
Then we save the downloaded data to a new file:
1: 2: 3: 4: 5: 6: 7: |
|
Now we can inspect the data using the GDAL/OGR library.
First we open the datasource and get the layers inside it:
1:
|
|
|
We have five layers respectively of wkbPoint, wkbLineString, wkbMultiLineString, wkbMultiPolygon, wkbGeometryCollection geometry type and as we can see the third and fifth layers are empty.
We are interested in the streets so let's convert the second wkbLineString layer in a deedle frame to see its content:
1: 2: 3: 4: 5: 6: 7: 8: 9: |
|
OSM_ID |
NAME |
HIGHWAY |
... |
MAN_MADE |
OTHER_TAGS |
Geometry |
|
---|---|---|---|---|---|---|---|
0 |
8027642 |
Strada statale della Val Vigezzo |
secondary |
... |
"loc_name"=>"Via per Re","maxspeed"=>"70","ref"=>"SS337" |
OSGeo.OGR.Geometry |
|
1 |
8027643 |
Strada statale della Val Vigezzo |
secondary |
... |
"ref"=>"SS337" |
OSGeo.OGR.Geometry |
|
2 |
8027644 |
Via Conte Mellerio |
tertiary |
... |
"ref"=>"SP75" |
OSGeo.OGR.Geometry |
|
3 |
26818816 |
Strada statale della Val Vigezzo |
secondary |
... |
"loc_name"=>"Via al piano","ref"=>"SS337" |
OSGeo.OGR.Geometry |
|
4 |
88517822 |
Via Laurasca |
unclassified |
... |
OSGeo.OGR.Geometry |
||
5 |
88519680 |
Via dei Monti |
residential |
... |
OSGeo.OGR.Geometry |
||
6 |
88810050 |
Torrente Loana |
... |
"boat"=>"no" |
OSGeo.OGR.Geometry |
||
7 |
102418428 |
Melezzo orientale |
... |
"boat"=>"no" |
OSGeo.OGR.Geometry |
||
... |
... |
... |
... |
... |
... |
... |
... |
51 |
248999155 |
Via Ortetto |
footway |
... |
OSGeo.OGR.Geometry |
||
52 |
265240441 |
Strada statale della Val Vigezzo |
secondary |
... |
"bridge"=>"yes","layer"=>"1","ref"=>"SS337" |
OSGeo.OGR.Geometry |
|
53 |
265240444 |
Strada statale della Val Vigezzo |
secondary |
... |
"ref"=>"SS337" |
OSGeo.OGR.Geometry |
|
54 |
366465605 |
Via Giuseppe Verdi |
service |
... |
OSGeo.OGR.Geometry |
We can see also that this layer contains ways of different kind: only the records with the a value in the column HIGHWAY are streets so let's see the list of its distinct values:
1: 2: 3: 4: |
|
|
We can now filter just the streets of residential type:
1: 2: 3: 4: 5: 6: |
|
OSM_ID |
NAME |
HIGHWAY |
... |
MAN_MADE |
OTHER_TAGS |
Geometry |
|
---|---|---|---|---|---|---|---|
5 |
88519680 |
Via dei Monti |
residential |
... |
OSGeo.OGR.Geometry |
||
8 |
107843286 |
Via Stazione |
residential |
... |
"oneway"=>"yes" |
OSGeo.OGR.Geometry |
|
9 |
107843287 |
Via tre acque |
residential |
... |
OSGeo.OGR.Geometry |
||
12 |
107843292 |
Piazza XV Martiri |
residential |
... |
"oneway"=>"yes" |
OSGeo.OGR.Geometry |
|
13 |
108279883 |
Via pittori Sotta |
residential |
... |
"noexit"=>"yes" |
OSGeo.OGR.Geometry |
|
17 |
108279887 |
Via alla Cascata |
residential |
... |
"noexit"=>"yes" |
OSGeo.OGR.Geometry |
|
21 |
108279895 |
Via per Re |
residential |
... |
OSGeo.OGR.Geometry |
||
23 |
114567044 |
Via Roma |
residential |
... |
OSGeo.OGR.Geometry |
||
... |
... |
... |
... |
... |
... |
... |
... |
42 |
246795646 |
Piazza XV Martiri |
residential |
... |
OSGeo.OGR.Geometry |
||
46 |
247420064 |
Via Stazione |
residential |
... |
OSGeo.OGR.Geometry |
||
49 |
248015289 |
Via dei Monti |
residential |
... |
"bridge"=>"yes","layer"=>"1" |
OSGeo.OGR.Geometry |
|
50 |
248015290 |
Via dei Monti |
residential |
... |
OSGeo.OGR.Geometry |
References
- Deedle
- Italian National Institute of Statistics (Istat)
- OGR API Tutorial
- Openstreetmap.org
- Overpass API
- Python GDAL/OGR Cookbook
namespace FSharp
--------------------
namespace Microsoft.FSharp
from FSharp.Gdal
Full name: FSharp.Gdal.Configuration.Init
Full name: FSharp.Gdal.Configuration.printOgrDrivers
Full name: Vector-layers.italyShp
Full name: Vector-layers.driver
type Ogr =
new : unit -> Ogr
static val wkb25DBit : int
static val ogrZMarker : int
static val OGRNullFID : int
static val OGRUnsetMarker : int
static val OLCRandomRead : string
static val OLCSequentialWrite : string
static val OLCRandomWrite : string
static val OLCFastSpatialFilter : string
static val OLCFastFeatureCount : string
...
nested type GDALErrorHandlerDelegate
nested type GDALProgressFuncDelegate
Full name: OSGeo.OGR.Ogr
--------------------
OGR.Ogr() : unit
Full name: Vector-layers.ds
Full name: Vector-layers.dsInfo
from FSharp.Gdal
Full name: FSharp.Gdal.Vector.datasourceInfo
Full name: Microsoft.FSharp.Compiler.Interactive.Settings.fsi
type DataSource =
new : cPtr:nativeint * cMemoryOwn:bool * parent:obj -> DataSource
member CopyLayer : src_layer:Layer * new_name:string * options:string[] -> Layer
member CreateLayer : name:string * srs:SpatialReference * geom_type:wkbGeometryType * options:string[] -> Layer
member DeleteLayer : index:int -> int
member Dispose : unit -> unit
member ExecuteSQL : statement:string * spatialFilter:Geometry * dialect:string -> Layer
member GetDriver : unit -> Driver
member GetLayerByIndex : index:int -> Layer
member GetLayerByName : layer_name:string -> Layer
member GetLayerCount : unit -> int
...
Full name: OSGeo.OGR.DataSource
--------------------
OGR.DataSource(cPtr: nativeint, cMemoryOwn: bool, parent: obj) : unit
Full name: Microsoft.FSharp.Core.Operators.box
Full name: Vector-layers.layersCount
Full name: Microsoft.FSharp.Core.ExtraTopLevelOperators.printfn
Full name: Vector-layers.layer0
Full name: Vector-layers.layers
Full name: FSharp.Gdal.Vector.layers
Full name: Vector-layers.layerInfo
module List
from Microsoft.FSharp.Collections
--------------------
type List<'T> =
| ( [] )
| ( :: ) of Head: 'T * Tail: 'T list
interface IEnumerable
interface IEnumerable<'T>
member GetSlice : startIndex:int option * endIndex:int option -> 'T list
member Head : 'T
member IsEmpty : bool
member Item : index:int -> 'T with get
member Length : int
member Tail : 'T list
static member Cons : head:'T * tail:'T list -> 'T list
static member Empty : 'T list
Full name: Microsoft.FSharp.Collections.List<_>
Full name: Microsoft.FSharp.Collections.List.map
Full name: FSharp.Gdal.Vector.layerInfo
type Layer =
new : cPtr:nativeint * cMemoryOwn:bool * parent:obj -> Layer
member AlterFieldDefn : iField:int * field_def:FieldDefn * nFlags:int -> int
member Clip : method_layer:Layer * result_layer:Layer * options:string[] * callback:GDALProgressFuncDelegate * callback_data:string -> int
member CommitTransaction : unit -> int
member CreateFeature : feature:Feature -> int
member CreateField : field_def:FieldDefn * approx_ok:int -> int
member CreateGeomField : field_def:GeomFieldDefn * approx_ok:int -> int
member DeleteFeature : fid:int -> int
member DeleteField : iField:int -> int
member Dispose : unit -> unit
...
Full name: OSGeo.OGR.Layer
--------------------
OGR.Layer(cPtr: nativeint, cMemoryOwn: bool, parent: obj) : unit
Full name: Vector-layers.layer
Full name: Microsoft.FSharp.Collections.List.head
Full name: Vector-layers.features
Full name: FSharp.Gdal.Vector.features
Full name: Vector-layers.attributes
Full name: FSharp.Gdal.Vector.fields
OGR.Feature.GetFieldAsString(id: int) : string
Full name: Vector-layers.geomcol
type Geometry =
new : type:wkbGeometryType -> Geometry + 2 overloads
member AddGeometry : other:Geometry -> int
member AddGeometryDirectly : other_disown:Geometry -> int
member AddPoint : x:float * y:float * z:float -> unit
member AddPoint_2D : x:float * y:float -> unit
member Area : unit -> float
member AssignSpatialReference : reference:SpatialReference -> unit
member Boundary : unit -> Geometry
member Buffer : distance:float * quadsecs:int -> Geometry
member Centroid : unit -> Geometry
...
Full name: OSGeo.OGR.Geometry
--------------------
OGR.Geometry(type: OGR.wkbGeometryType) : unit
OGR.Geometry(cPtr: nativeint, cMemoryOwn: bool, parent: obj) : unit
OGR.Geometry(type: OGR.wkbGeometryType, wkt: string, wkb: int, wkb_buf: nativeint, gml: string) : unit
| wkbUnknown = 0
| wkbPoint = 1
| wkbLineString = 2
| wkbPolygon = 3
| wkbMultiPoint = 4
| wkbMultiLineString = 5
| wkbMultiPolygon = 6
| wkbGeometryCollection = 7
| wkbNone = 100
| wkbLinearRing = 101
...
Full name: OSGeo.OGR.wkbGeometryType
Full name: Microsoft.FSharp.Core.Operators.ignore
Full name: Vector-layers.italyRegionsPlot
type Plot =
new : geom:Geometry -> Plot
member SaveAsBitmap : fileName:string -> unit
Full name: Plot-geometry.Plot
Plots an OGR.Geometry on a Xaml Window
--------------------
new : geom:OGR.Geometry -> Plot
Full name: Vector-layers.sr
Full name: Vector-layers.fmItalyRegion
module Vector
from FSharp.Gdal
--------------------
type Vector =
static member ofOptionalValues : data:seq<OptionalValue<'T>> -> IVector<'T>
static member ofOptionalValues : data:seq<'T option> -> IVector<'T>
static member ofValues : data:seq<'T> -> IVector<'T>
static member ofValues : data:'T [] -> IVector<'T>
Full name: Deedle.F# Vector extensions.Vector
Full name: FSharp.Gdal.Vector.toValues
module Frame
from Deedle
--------------------
type Frame =
static member ReadReader : reader:IDataReader -> Frame<int,string>
static member CustomExpanders : Dictionary<Type,Func<obj,seq<string * Type * obj>>>
static member NonExpandableInterfaces : List<Type>
static member NonExpandableTypes : HashSet<Type>
Full name: Deedle.Frame
--------------------
type Frame<'TRowKey,'TColumnKey (requires equality and equality)> =
interface IDynamicMetaObjectProvider
interface INotifyCollectionChanged
interface IFsiFormattable
interface IFrame
new : names:seq<'TColumnKey> * columns:seq<ISeries<'TRowKey>> -> Frame<'TRowKey,'TColumnKey>
new : rowIndex:IIndex<'TRowKey> * columnIndex:IIndex<'TColumnKey> * data:IVector<IVector> * indexBuilder:IIndexBuilder * vectorBuilder:IVectorBuilder -> Frame<'TRowKey,'TColumnKey>
member AddColumn : column:'TColumnKey * series:ISeries<'TRowKey> -> unit
member AddColumn : column:'TColumnKey * series:seq<'V> -> unit
member AddColumn : column:'TColumnKey * series:ISeries<'TRowKey> * lookup:Lookup -> unit
member AddColumn : column:'TColumnKey * series:seq<'V> * lookup:Lookup -> unit
...
Full name: Deedle.Frame<_,_>
--------------------
new : names:seq<'TColumnKey> * columns:seq<ISeries<'TRowKey>> -> Frame<'TRowKey,'TColumnKey>
new : rowIndex:Indices.IIndex<'TRowKey> * columnIndex:Indices.IIndex<'TColumnKey> * data:IVector<IVector> * indexBuilder:Indices.IIndexBuilder * vectorBuilder:Vectors.IVectorBuilder -> Frame<'TRowKey,'TColumnKey>
namespace FSharp.Data
--------------------
namespace Microsoft.FSharp.Data
Full name: Vector-layers.baseUrl
Full name: Vector-layers.osm
private new : unit -> Http
static member private AppendQueryToUrl : url:string * query:(string * string) list -> string
static member AsyncRequest : url:string * ?query:(string * string) list * ?headers:seq<string * string> * ?httpMethod:string * ?body:HttpRequestBody * ?cookies:seq<string * string> * ?cookieContainer:CookieContainer * ?silentHttpErrors:bool * ?responseEncodingOverride:string * ?customizeHttpRequest:(HttpWebRequest -> HttpWebRequest) -> Async<HttpResponse>
static member AsyncRequestStream : url:string * ?query:(string * string) list * ?headers:seq<string * string> * ?httpMethod:string * ?body:HttpRequestBody * ?cookies:seq<string * string> * ?cookieContainer:CookieContainer * ?silentHttpErrors:bool * ?customizeHttpRequest:(HttpWebRequest -> HttpWebRequest) -> Async<HttpResponseWithStream>
static member AsyncRequestString : url:string * ?query:(string * string) list * ?headers:seq<string * string> * ?httpMethod:string * ?body:HttpRequestBody * ?cookies:seq<string * string> * ?cookieContainer:CookieContainer * ?silentHttpErrors:bool * ?responseEncodingOverride:string * ?customizeHttpRequest:(HttpWebRequest -> HttpWebRequest) -> Async<string>
static member private InnerRequest : url:string * toHttpResponse:(string -> int -> string -> string -> string -> 'a0 option -> Map<string,string> -> Map<string,string> -> Stream -> Async<'a1>) * ?query:(string * string) list * ?headers:seq<string * string> * ?httpMethod:string * ?body:HttpRequestBody * ?cookies:seq<string * string> * ?cookieContainer:CookieContainer * ?silentHttpErrors:bool * ?responseEncodingOverride:'a0 * ?customizeHttpRequest:(HttpWebRequest -> HttpWebRequest) -> Async<'a1>
static member Request : url:string * ?query:(string * string) list * ?headers:seq<string * string> * ?httpMethod:string * ?body:HttpRequestBody * ?cookies:seq<string * string> * ?cookieContainer:CookieContainer * ?silentHttpErrors:bool * ?responseEncodingOverride:string * ?customizeHttpRequest:(HttpWebRequest -> HttpWebRequest) -> HttpResponse
static member RequestStream : url:string * ?query:(string * string) list * ?headers:seq<string * string> * ?httpMethod:string * ?body:HttpRequestBody * ?cookies:seq<string * string> * ?cookieContainer:CookieContainer * ?silentHttpErrors:bool * ?customizeHttpRequest:(HttpWebRequest -> HttpWebRequest) -> HttpResponseWithStream
static member RequestString : url:string * ?query:(string * string) list * ?headers:seq<string * string> * ?httpMethod:string * ?body:HttpRequestBody * ?cookies:seq<string * string> * ?cookieContainer:CookieContainer * ?silentHttpErrors:bool * ?responseEncodingOverride:string * ?customizeHttpRequest:(HttpWebRequest -> HttpWebRequest) -> string
Full name: FSharp.Data.Http
Full name: Vector-layers.fileName
Full name: Vector-layers.save
val string : value:'T -> string
Full name: Microsoft.FSharp.Core.Operators.string
--------------------
type string = System.String
Full name: Microsoft.FSharp.Core.string
type StreamWriter =
inherit TextWriter
new : stream:Stream -> StreamWriter + 6 overloads
member AutoFlush : bool with get, set
member BaseStream : Stream
member Close : unit -> unit
member Encoding : Encoding
member Flush : unit -> unit
member Write : value:char -> unit + 3 overloads
static val Null : StreamWriter
Full name: System.IO.StreamWriter
--------------------
System.IO.StreamWriter(stream: System.IO.Stream) : unit
System.IO.StreamWriter(path: string) : unit
System.IO.StreamWriter(stream: System.IO.Stream, encoding: System.Text.Encoding) : unit
System.IO.StreamWriter(path: string, append: bool) : unit
System.IO.StreamWriter(stream: System.IO.Stream, encoding: System.Text.Encoding, bufferSize: int) : unit
System.IO.StreamWriter(path: string, append: bool, encoding: System.Text.Encoding) : unit
System.IO.StreamWriter(path: string, append: bool, encoding: System.Text.Encoding, bufferSize: int) : unit
(+0 other overloads)
System.IO.TextWriter.Write(value: decimal) : unit
(+0 other overloads)
System.IO.TextWriter.Write(value: float) : unit
(+0 other overloads)
System.IO.TextWriter.Write(value: float32) : unit
(+0 other overloads)
System.IO.TextWriter.Write(value: uint64) : unit
(+0 other overloads)
System.IO.TextWriter.Write(value: int64) : unit
(+0 other overloads)
System.IO.TextWriter.Write(value: uint32) : unit
(+0 other overloads)
System.IO.TextWriter.Write(value: int) : unit
(+0 other overloads)
System.IO.TextWriter.Write(value: bool) : unit
(+0 other overloads)
System.IO.StreamWriter.Write(value: string) : unit
(+0 other overloads)
Full name: Vector-layers.osmDataSource
Full name: Vector-layers.osmDataSourceContents
Full name: Vector-layers.printOsmDataSourceContents
Full name: Microsoft.FSharp.Core.ExtraTopLevelOperators.sprintf
Full name: Vector-layers.osmLayers
Full name: Vector-layers.fmMalescoWays
from Microsoft.FSharp.Collections
Full name: Microsoft.FSharp.Collections.Seq.item
Full name: Vector-layers.highways
member Frame.GetColumn : column:'TColumnKey * lookup:Lookup -> Series<'TRowKey,'R>
Full name: Microsoft.FSharp.Collections.Seq.distinct
Full name: Microsoft.FSharp.Collections.List.ofSeq
Full name: Vector-layers.fmMalescoStreets
Full name: Deedle.Frame.filterRowValues
member ObjectSeries.GetAs : column:'K * fallback:'R -> 'R