diff --git a/src/common.jl b/src/common.jl index 9d5bdde..084e9e4 100644 --- a/src/common.jl +++ b/src/common.jl @@ -1,8 +1,7 @@ """ - Node + Node(id::Int, lat::Float64, lon::Float64) - A node is a point in the map. It has an id, a latitude and a longitude. - All nodes need to be stored in memory in this format. +A node is a point in the map. It has an id, a latitude and a longitude. """ struct Node id::Int @@ -11,7 +10,9 @@ struct Node end """ - Provides location of sample OSM file for tests + sample_osm_file() + +Provides location of sample OSM file for tests and examples. """ function sample_osm_file()::String joinpath(dirname(pathof(OSMToolset)),"..","test","data","boston.osm") diff --git a/src/poi.jl b/src/poi.jl index 41d4654..32b1e51 100644 --- a/src/poi.jl +++ b/src/poi.jl @@ -1,7 +1,7 @@ """ abstract type AbstractMetaPOI end -A base time for representing metadata related to a POI location. +A base type for representing metadata related to a POI location. """ abstract type AbstractMetaPOI end @@ -50,6 +50,7 @@ get_attractiveness_group(a::NoneMetaPOI) = :NoneMetaPOI """ get_attractiveness_range(a::AbstractMetaPOI) + You can create own subtypes of `AbstractMetaPOI` but than range needs to be provided. """ get_attractiveness_range(a::AbstractMetaPOI) = throw(ArgumentError("`get_attractiveness_range` not implemented for type $(typeof(a)). You can also just provide a custom function via the `get_range` parameter such as `get_range= a -> 100`")) @@ -68,17 +69,26 @@ The configuration is defined in a DataFrame with the following columns: `group`, `key`, `values`, `influence`, `range`. Instead of the DataFrame a paths to a CSV file can be provided. -* Constructors * +### Constructors - `ScrapePOIConfig()` - default inbuilt configuration for data scraping. Note that the default configuration can change with library updates. - This will use `AttractivenessMetaPOI` as meta data. -- `ScrapePOIConfig{T <: AbstractMetaPOI}(filename::AbstractString)` - use a CSV file with configuration + This will use a default configuration and `AttractivenessMetaPOI` as meta data. +- `ScrapePOIConfig(keys::Union{Tuple{String,String}, String}...)` - provide keys for scraping, `NoneMetaPOI` will be used as metadata +- `ScrapePOIConfig(pairs::Pair{<:Union{Tuple{String,String}, String}, T}...)` - provide keys and corresponding metadata - `ScrapePOIConfig{T <: AbstractMetaPOI}(df::DataFrame)` - use a `DataFrame` as configuration -- ScrapePOIConfig{T <: AbstractMetaPOI}(meta::Dict{<:Union{String, Tuple{String,String}}, T}) - `meta` dictionary explaining how a single `k="keyname"` value or tuple ofvalues (paired with `v="valuename"`) should be mapped for attractiveness metadata. +- ScrapePOIConfig{T <: AbstractMetaPOI}(meta::Dict{<:Union{String, Tuple{String,String}}, T}) - internal constructor. `meta` dictionary explaining how a single `k="keyname"` value or tuple ofvalues (paired with `v="valuename"`) should be mapped for attractiveness metadata. + +### Example +```julia +ScrapePOIConfig(("amenity", "parking"), ("parking")) + +ScrapePOIConfig(("*", "restaurant")) +ScrapePOIConfig("*") -When the `T` parameter is not provided `AttractivenessMetaPOI` will be used. -When you do not want to use metadata provide `NoneMetaPOI` as `T` +ScrapePOIConfig(("amenity", "parking") =>AttractivenessMetaPOI(:car, 1, 500), ("amenity", "restaurant") => (AttractivenessMetaPOI(:food, 1.0, 1000.0))) + +ScrapePOIConfig([("amenity", "pub"), ("amenity", "restaurant")] .=> Ref(AttractivenessMetaPOI(:food, 1.0, 100.0))) """ struct ScrapePOIConfig{T <: AbstractMetaPOI} meta::Dict{Union{String, Tuple{String,String}}, T} @@ -90,11 +100,20 @@ function ScrapePOIConfig(pairs::Pair{<:Union{Tuple{String,String}, String}, T}.. ScrapePOIConfig(Dict{Union{String, Tuple{String,String}}, T}(pairs)) end +function ScrapePOIConfig(pairs::AbstractVector{<:Pair{<:Union{Tuple{String,String}, String}, T}}) where T <: AbstractMetaPOI + ScrapePOIConfig(Dict{Union{String, Tuple{String,String}}, T}(pairs)) +end + function ScrapePOIConfig(keys::Union{Tuple{String,String}, String}...) ScrapePOIConfig(Dict{Union{String, Tuple{String,String}}, NoneMetaPOI}(keys .=> Ref(NoneMetaPOI()))) end +function ScrapePOIConfig(keys::AbstractVector{<:Union{Tuple{String,String}, String}}) + ScrapePOIConfig(Dict{Union{String, Tuple{String,String}}, NoneMetaPOI}(keys .=> Ref(NoneMetaPOI()))) +end + + function ScrapePOIConfig(meta::Union{Dict{Tuple{String,String}, T},Dict{String, T}}) where T <: AbstractMetaPOI ScrapePOIConfig(Dict{Union{String, Tuple{String,String}}, T}(meta)) @@ -159,15 +178,13 @@ end find_poi(filename::AbstractString, scrape_config::ScrapePOIConfig{T <: AbstractMetaPOI}=ScrapePOIConfig(); all_tags::Bool=false) Generates a `DataFrame` with points of interests and from a given XML `filename`. -The data frame will also contain the metadata from `T` for each POI. +The `scrape_config` parameter defines the configuration of the scraping process. +The data frame will also contain the metadata of type `T` for each POI. The `DataFrame` can be later used with `AttractivenessSpatIndex` to build an attractivenss spatial index. -The attractiveness values for the index will be used ones from the `scrape_config` file. -By default `__builtin_config_path` will be used but you can define your own index. - -Setting the `all_tags` parameter to `true` will cause that once the tag is matched, other tags within the same -`id` will be included in the resulting DataFrame. +Setting the `all_tags` parameter to `true` will cause that once the tag is matched, the adjacent tags within the same +element will be included in the resulting DataFrame. """ function find_poi(filename::AbstractString, scrape_config::ScrapePOIConfig{T}=ScrapePOIConfig(); all_tags::Bool=false) where T <: AbstractMetaPOI dkeys = scrape_config.dkeys