Giter Club home page Giter Club logo

fwatlasbc's Introduction

fwatlasbc

Lifecycle: experimental R-CMD-check codecov License: MIT

fwatlasbc is an R package for querying data from the Freshwater Atlas (FWA) of British Columbia. Spatial data are returned as simple features.

fwatlasbc wraps fwapgr an R package that uses the fwapg API.

Installation

You can install the latest version of fwatlasbc from GitHub with:

# install.packages("devtools")
devtools::install_github("poissonconsulting/fwatlasbc")

Demonstration

Find stream names using regular expression. There may be more than one stream name that matches the regular expression.

library(fwatlasbc)
streams <- fwa_find_stream_names("steep c")
streams
#> # A tibble: 2 × 1
#>   stream_name       
#>   <chr>             
#> 1 Steep Canyon Creek
#> 2 Steep Creek

Add blue line keys (blk) to stream names. There may be multiple streams with the same name.

blks <- fwa_add_blks_to_stream_name(streams)
blks
#> # A tibble: 4 × 2
#>   stream_name              blk
#>   <chr>                  <int>
#> 1 Steep Canyon Creek 360883036
#> 2 Steep Creek        356362258
#> 3 Steep Creek        356534225
#> 4 Steep Creek        356570155
blks <- blks[blks$blk == 356534225,]

Alternatively get the nearest blue line key and river meter (rm) from the longitude and latitude. The river meter is the distance in meters as the fish swims from the mouth of the river. The distance_to_lon_lat is the how far the original point was from the stream in meters.

fwa_add_blk_to_lon_lat(data.frame(lon = -132.26, lat = 53.36))
#> Simple feature collection with 1 feature and 5 fields
#> Geometry type: POINT
#> Dimension:     XY
#> Bounding box:  xmin: 585153.6 ymin: 946162.9 xmax: 585153.6 ymax: 946162.9
#> Projected CRS: NAD83 / BC Albers
#> # A tibble: 1 × 6
#>     lon   lat       blk    rm distance_to_lon_lat            geometry
#>   <dbl> <dbl>     <dbl> <dbl>               <dbl>         <POINT [m]>
#> 1 -132.  53.4 360824839 1118.                508. (585153.6 946162.9)

Get watershed (by aggregating fundamental watersheds) for a blue line key and river meter (by default 0). If it errors try increasing the river meter.

wshed <- fwa_add_watershed_to_blk(blks)
wshed
#> Simple feature collection with 1 feature and 3 fields
#> Geometry type: POLYGON
#> Dimension:     XY
#> Bounding box:  xmin: 1656218 ymin: 725423.1 xmax: 1661726 ymax: 732146.2
#> Projected CRS: NAD83 / BC Albers
#> # A tibble: 1 × 4
#>   stream_name       blk    rm                                           geometry
#>   <chr>           <int> <dbl>                                      <POLYGON [m]>
#> 1 Steep Creek 356534225     0 ((1658107 728964.9, 1658107 728964.9, 1658179 728…

Get stream network for the watershed polygon. Note that rm is from the original watershed while downstream/upstream_route_measure are the equivalents for the stream segment in the network.

network <- fwa_add_collection_to_polygon(wshed, "stream_network")
network
#> Simple feature collection with 76 features and 31 fields
#> Geometry type: LINESTRING
#> Dimension:     XY
#> Bounding box:  xmin: 1656200 ymin: 725423.1 xmax: 1661368 ymax: 731602.7
#> Projected CRS: NAD83 / BC Albers
#> # A tibble: 76 × 32
#>    stream…¹    blk    rm blue_…² blue_…³ downs…⁴ edge_…⁵ featu…⁶ featu…⁷ fwa_w…⁸
#>    <chr>     <dbl> <dbl>   <dbl>   <dbl>   <dbl>   <dbl> <chr>   <chr>   <chr>  
#>  1 Steep C… 3.57e8     0  3.57e8    1130  2931.     1250 WA2411… areal … 300-90…
#>  2 Steep C… 3.56e8     0  3.56e8      NA  1110.     1000 GA2485… linear… 300-90…
#>  3 Steep C… 3.57e8     0  3.57e8      NA     0      1000 GA2485… linear… 300-90…
#>  4 Steep C… 3.57e8     0  3.57e8    1142  2594.     1000 GA2485… linear… 300-90…
#>  5 Steep C… 3.57e8     0  3.57e8    1142  2251.     1000 GA2485… linear… 300-90…
#>  6 Steep C… 3.56e8     0  3.56e8      NA     0      1000 GA2485… linear… 300-90…
#>  7 Steep C… 3.56e8     0  3.56e8      NA     0      1000 GA2485… linear… 300-90…
#>  8 Steep C… 3.57e8     0  3.57e8    1131    51.8    1000 GA2485… linear… 300-90…
#>  9 Steep C… 3.57e8     0  3.57e8    1130   751.     1250 WA2411… areal … 300-90…
#> 10 Steep C… 3.56e8     0  3.56e8      NA   346.     1000 GA2485… linear… 300-90…
#> # … with 66 more rows, 22 more variables: gnis_id <dbl>, gnis_name <chr>,
#> #   gradient <dbl>, left_right_tributary <chr>, length_metre <dbl>,
#> #   linear_feature_id <dbl>, local_watershed_code <chr>, localcode_ltree <chr>,
#> #   stream_magnitude <dbl>, stream_order <dbl>, stream_order_max <dbl>,
#> #   stream_order_parent <dbl>, upstream_route_measure <dbl>,
#> #   waterbody_key <dbl>, watershed_code_50k <chr>, watershed_group_code <chr>,
#> #   watershed_group_code_50k <chr>, watershed_group_id <dbl>, …

Convert the stream network into a table of blue line keys with regularly spaced river meters starting at 0.

#rms <- fwa_convert_stream_network_to_rms(network, interval = 100)
#rms

Plot the watershed, network and river meters.

ggplot2::ggplot() +
  ggplot2::geom_sf(data = wshed) +
  ggplot2::geom_sf(data = network, color = "blue") +
#  ggplot2::geom_sf(data = rms) +
  NULL

Inspiration

fwatlasbc supersedes the archived fwabc which retrieved data via WFS using bcdata.

Creditation

fwatlasbc relies on fwapg API which is created, maintained and hosted by Simon Norris at Hillcrest Geographics.

Contribution

Please report any issues.

Pull requests are always welcome.

Code of Conduct

Please note that fwatlasbc is released with a Contributor Code of Conduct. By contributing to this project, you agree to abide by its terms.

fwatlasbc's People

Contributors

joethorley avatar nadinehussein avatar sebdalgarno avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar

fwatlasbc's Issues

add fwa_add_area_to_stream_network() and fwa_add_area_to_rms()

basically take polygon typically watershed area and use to split stream network and flat tibble rms

actually much simpler in case of latter as point based - a little more challenging for stream network as may intersect some segments requiring them to be broken in two.

related to

check valid schema and table

this would require creating internal data - not sure if a great approach as wont update itself
perhaps better just to give a status code error (i.e. API failure) and let user troubleshoot, rather than risk internal lookups being out of date with API and db

define stream_network class

some type of list or dm or flat tibble structure that allows quick navigation through a network and calculation of distances etc

add fwa_switch_blks()

only works on flat rms with parents but where labelling of a split is wrong with the blk of the mainstem say being labelled as going up a trib then they can be switched in a flat rms tibble just by specifying the two blks.

Basically algorithm checks that one is the parent of the other (order doesn't matter) and then it has to switch values and parents and rms of tribs for each.

Not exactly sure how to do but seems doable perhaps with a recursive function.

add fwa_add_split_to_stream_network() and fwa_add_split_to_rms()

basically takes stream network as lines with fwa_watershed_codes and splits in two based on blk, rm and wshed_name

wshed_name is used to create a column with that name that has TRUE or FALSE to indicate if the segments are in the watershed or not

stream segments are split as necessary.

Can then be used to filter after

advance on

enhance fwa_rkm function

include columns:
gnis_name, blue_line_key, rkm, order , magnitude, watershed_area, geom

some of these will have to be pulled from stream_network layer
blue_line_key and rkm easiest as just pulling from fwapgr::fwa_locate_along_interval

fwa_add_watershed_to_blk() failing

just FYI - fwa_add_watershed_to_blk() currently failing after fresh install

streams <- fwa_find_stream_names("steep c") %>%
  fwa_add_blks_to_stream_name() %>%
  slice(1) %>%
  fwa_add_watershed_to_blk()
Error in if (!x$..fwa_exclude && wshed$refine_method == "KEEP") { : 
  missing value where TRUE/FALSE needed
In addition: Warning message:
Unknown or uninitialised column: `refine_method`. 
Backtrace:
    █
 1. ├─[ `%>%`(...) ]
 2. └─fwatlasbc::fwa_add_watershed_to_blk(.)
 3.   ├─[ dplyr::select(...) ]
 4.   ├─[ dplyr::arrange(...) ]
 5.   ├─[ dplyr::bind_rows(...) ] with 1 more call
 7.   └─base::lapply(...)
 8.     └─fwatlasbc:::FUN(X[[i]], ...)
 9.       └─fwatlasbc:::adjust_watershed(wshed, x, epsg)

add vignettes

  1. getting started
  2. getting collections
  3. using rkm function

Why do stream rkms go further than the stream network.

Consider the following two images of the stream network for a couple of watershed vs the stream rkms.
The rkms seem to go to the mountain top. This suggests to me that both are based on the DEM but the stream network cutoffs when it reaches a minimum watershed size.

Stream Network

Screen Shot 2020-11-10 at 18 15 47

Rkms

Screen Shot 2020-11-10 at 18 15 40

Columbia rkm

can't generate rkm with Columbia River blue_line_key

rkm <- fwatlasbc::fwa_rkm(blue_line_key = 356570372L)

error message

Error: API request failed [404]: Unable to read data from: fwa_locatealonginterval

blue_line_key_to_watershed() can error when too close to mouth

> fwatlasbc:::fwa_blue_line_key_to_watershed(356528119)
Error: API request failed [404]: Unable to read data from: fwa_watershedatmeasure
.
Backtrace:
    █
 1. └─fwatlasbc:::fwa_blue_line_key_to_watershed(356528119)
 2.   └─fwapgr::fwa_watershed_at_measure(...) /Users/joe/Code/fwatlasbc/R/watershed.R:29:2
 3.     └─fwapgr:::fwa_function(...) /Users/joe/Code/fwapgr/R/functions.R:117:2
 4.       └─fwapgr:::fwa_api(path, query) /Users/joe/Code/fwapgr/R/functions.R:38:2
 5.         └─fwapgr:::chk_response_status(resp) /Users/joe/Code/fwapgr/R/utils.R:20:2
 6.           └─chk::abort_chk(glue("API request failed [{status_code(x)}]: {msg}")) /Users/joe/Code/fwapgr/R/chk.R:6:2
 7.             └─chk::err(..., n = n, tidy = tidy, .subclass = "chk_error")
 8.               └─rlang::exec(abort, msg, .subclass = .subclass, !!!args[named])
> fwatlasbc:::fwa_blue_line_key_to_watershed(356528119, distance_from_mouth = 50)
Simple feature collection with 1 feature and 2 fields
geometry type:  POLYGON
dimension:      XY
bbox:           xmin: 1797649 ymin: 590132.3 xmax: 1808033 ymax: 604684.9
projected CRS:  NAD83 / BC Albers
  blue_line_key distance_from_mouth                       geometry
1     356528119                  50 POLYGON ((1797738 599112.5,...

Presumably because too flat to work out watershed. Could deal with with more informative error message ie suggestion to increase distance from mouth.

stream network mismatched geometry types

watershed <- fwatlasbc:::fwa_blue_line_key_to_watershed(356568903)
stream_network <- fwatlasbc::fwa_get_stream_network(watershed)
stream_network
#> Simple feature collection with 649 features and 28 fields
#> geometry type:  LINESTRING
#> dimension:      XYZ
#> bbox:           xmin: 1786454 ymin: 603481.4 xmax: 1809884 ymax: 652061
#> z_range:        zmin: 1250 zmax: 2780
#> projected CRS:  NAD83 / BC Albers
#> First 10 features:
#>           id blue_line_key blue_line_key_50k downstream_route_measure edge_type
#> 2  706812843     356430613                NA                        0      1400
#> 3  706826339     356502186               377                        0      1450
#> 4  706824801     356567778               384                        0      1450
#> 9  706814459     356401901                NA                        0      1400
#> 10 706814757     356380482                NA                        0      1400
#> 12 706814222     356390536                NA                        0      1400
#> 16 706821674     356372248                NA                        0      1400
#> 17 706828164     356525752                NA                        0      1400
#> 18 706813775     356447421                NA                        0      1400
#> 19 706813921     356504034                NA                        0      1400
#>    feature_code feature_source
#> 2    WA24111170             OP
#> 3    WA24111190             OP
#> 4    WA24111190             OP
#> 9    WA24111170             OP
#> 10   WA24111170             OP
#> 12   WA24111170             OP
#> 16   WA24111170             OP
#> 17   WA24111170             OP
#> 18   WA24111170             OP
#> 19   WA24111170             OP
#>                                                                                                                                 fwa_watershed_code
#> 2  999-999999-999999-999999-999999-999999-999999-999999-999999-999999-999999-999999-999999-999999-999999-999999-999999-999999-999999-999999-999999
#> 3  300-625474-584724-501797-103126-000000-000000-000000-000000-000000-000000-000000-000000-000000-000000-000000-000000-000000-000000-000000-000000
#> 4  300-625474-584724-501797-159431-000000-000000-000000-000000-000000-000000-000000-000000-000000-000000-000000-000000-000000-000000-000000-000000
#> 9  999-999999-999999-999999-999999-999999-999999-999999-999999-999999-999999-999999-999999-999999-999999-999999-999999-999999-999999-999999-999999
#> 10 999-999999-999999-999999-999999-999999-999999-999999-999999-999999-999999-999999-999999-999999-999999-999999-999999-999999-999999-999999-999999
#> 12 999-999999-999999-999999-999999-999999-999999-999999-999999-999999-999999-999999-999999-999999-999999-999999-999999-999999-999999-999999-999999
#> 16 999-999999-999999-999999-999999-999999-999999-999999-999999-999999-999999-999999-999999-999999-999999-999999-999999-999999-999999-999999-999999
#> 17 999-999999-999999-999999-999999-999999-999999-999999-999999-999999-999999-999999-999999-999999-999999-999999-999999-999999-999999-999999-999999
#> 18 999-999999-999999-999999-999999-999999-999999-999999-999999-999999-999999-999999-999999-999999-999999-999999-999999-999999-999999-999999-999999
#> 19 999-999999-999999-999999-999999-999999-999999-999999-999999-999999-999999-999999-999999-999999-999999-999999-999999-999999-999999-999999-999999
#>    gnis_id gnis_name gradient left_right_tributary length_metre
#> 2       NA      <NA>        0                 LEFT     39.59308
#> 3       NA      <NA>        0                 LEFT      9.72234
#> 4       NA      <NA>        0                 LEFT     13.54958
#> 9       NA      <NA>        0                 LEFT     33.28648
#> 10      NA      <NA>        0                RIGHT    191.76783
#> 12      NA      <NA>        0                 LEFT     30.66061
#> 16      NA      <NA>        0                 LEFT     42.21362
#> 17      NA      <NA>        0                 LEFT    144.34506
#> 18      NA      <NA>        0                RIGHT     33.60232
#> 19      NA      <NA>        0                RIGHT    147.43675
#>    linear_feature_id
#> 2          706812843
#> 3          706826339
#> 4          706824801
#> 9          706814459
#> 10         706814757
#> 12         706814222
#> 16         706821674
#> 17         706828164
#> 18         706813775
#> 19         706813921
#>                                                                                                                               local_watershed_code
#> 2                                                                                                                                             <NA>
#> 3  300-625474-584724-501797-103126-000000-000000-000000-000000-000000-000000-000000-000000-000000-000000-000000-000000-000000-000000-000000-000000
#> 4  300-625474-584724-501797-159431-000000-000000-000000-000000-000000-000000-000000-000000-000000-000000-000000-000000-000000-000000-000000-000000
#> 9                                                                                                                                             <NA>
#> 10                                                                                                                                            <NA>
#> 12                                                                                                                                            <NA>
#> 16                                                                                                                                            <NA>
#> 17                                                                                                                                            <NA>
#> 18                                                                                                                                            <NA>
#> 19                                                                                                                                            <NA>
#>                    localcode_ltree stream_magnitude stream_order
#> 2                             <NA>                1            1
#> 3  300.625474.584724.501797.103126                4            2
#> 4  300.625474.584724.501797.159431                3            2
#> 9                             <NA>                1            1
#> 10                            <NA>                1            1
#> 12                            <NA>                1            1
#> 16                            <NA>                1            1
#> 17                            <NA>                1            1
#> 18                            <NA>                1            1
#> 19                            <NA>                1            1
#>    upstream_area_ha upstream_route_measure waterbody_key
#> 2                NA              39.592674     329124441
#> 3           36.6556               9.721789     329708895
#> 4           65.9064              13.548991     329708895
#> 9                NA              33.285792     329124477
#> 10               NA             191.767465     329124109
#> 12               NA              30.661558     329124398
#> 16               NA              42.213337     329124466
#> 17               NA             144.345181     329123792
#> 18               NA              33.601726     329124443
#> 19               NA             147.437113     329123968
#>                               watershed_code_50k watershed_group_code
#> 2                                           <NA>                 ELKR
#> 3  349248100483001040000000000000000000000000000                 ELKR
#> 4  349248100483001600000000000000000000000000000                 ELKR
#> 9                                           <NA>                 ELKR
#> 10                                          <NA>                 ELKR
#> 12                                          <NA>                 ELKR
#> 16                                          <NA>                 ELKR
#> 17                                          <NA>                 ELKR
#> 18                                          <NA>                 ELKR
#> 19                                          <NA>                 ELKR
#>    watershed_group_code_50k watershed_group_id watershed_key watershed_key_50k
#> 2                      <NA>                 46     356430613                NA
#> 3                      ELKR                 46     356502186               377
#> 4                      ELKR                 46     356567778               384
#> 9                      <NA>                 46     356401901                NA
#> 10                     <NA>                 46     356380482                NA
#> 12                     <NA>                 46     356390536                NA
#> 16                     <NA>                 46     356372248                NA
#> 17                     <NA>                 46     356525752                NA
#> 18                     <NA>                 46     356447421                NA
#> 19                     <NA>                 46     356504034                NA
#>                                                                                                                                       wscode_ltree
#> 2  999.999999.999999.999999.999999.999999.999999.999999.999999.999999.999999.999999.999999.999999.999999.999999.999999.999999.999999.999999.999999
#> 3                                                                                                                  300.625474.584724.501797.103126
#> 4                                                                                                                  300.625474.584724.501797.159431
#> 9  999.999999.999999.999999.999999.999999.999999.999999.999999.999999.999999.999999.999999.999999.999999.999999.999999.999999.999999.999999.999999
#> 10 999.999999.999999.999999.999999.999999.999999.999999.999999.999999.999999.999999.999999.999999.999999.999999.999999.999999.999999.999999.999999
#> 12 999.999999.999999.999999.999999.999999.999999.999999.999999.999999.999999.999999.999999.999999.999999.999999.999999.999999.999999.999999.999999
#> 16 999.999999.999999.999999.999999.999999.999999.999999.999999.999999.999999.999999.999999.999999.999999.999999.999999.999999.999999.999999.999999
#> 17 999.999999.999999.999999.999999.999999.999999.999999.999999.999999.999999.999999.999999.999999.999999.999999.999999.999999.999999.999999.999999
#> 18 999.999999.999999.999999.999999.999999.999999.999999.999999.999999.999999.999999.999999.999999.999999.999999.999999.999999.999999.999999.999999
#> 19 999.999999.999999.999999.999999.999999.999999.999999.999999.999999.999999.999999.999999.999999.999999.999999.999999.999999.999999.999999.999999
#>                          geometry
#> 2  LINESTRING Z (1789928 63898...
#> 3  LINESTRING Z (1797264 60929...
#> 4  LINESTRING Z (1796509 61289...
#> 9  LINESTRING Z (1791419 63500...
#> 10 LINESTRING Z (1790421 63447...
#> 12 LINESTRING Z (1790620 63563...
#> 16 LINESTRING Z (1796772 61938...
#> 17 LINESTRING Z (1809812 60490...
#> 18 LINESTRING Z (1788626 63649...
#> 19 LINESTRING Z (1799559 63627...
mapview::mapview(stream_network)
#> Warning in CPL_write_ogr(obj, dsn, layer, driver,
#> as.character(dataset_options), : GDAL Error 1: ICreateFeature: Mismatched
#> geometry type
#> Failed to create feature 0 in file45e965cde81a
#> Warning in CPL_write_ogr(obj, dsn, layer, driver,
#> as.character(dataset_options), : GDAL Error 6: DeleteLayer() not supported by
#> this dataset.
#> Deleting layer not supported by driver `FlatGeobuf'
#> Error in CPL_write_ogr(obj, dsn, layer, driver, as.character(dataset_options), : Feature creation failed.

Created on 2020-11-05 by the reprex package (v0.3.0)

add wrappers for all collection_ids

or only most useful collection_ids?
include transform arguments? simplify? bbox? centroid?
gnis_name and blue_line_key options + filter argument for filters on other columns (e.g. stream_order)

Need to check for creeks which are each others parent

this can happen when both creeks stop at the confluence.

an example is below.

Screenshot 2023-03-02 at 18 36 21

The solution is make sure neither creek has a parent.

In principle a creek could be its own parent or there circle might have three or more creeks.

Again the solution is to make no one have a parent.

output of funs returning watershed

this is output from API (fwa_watershed_at_measure)
Screen Shot 2020-11-03 at 4 18 43 PM

Which columns should we keep or add?

For point_to and xy_to we could add: distance_to_stream (i.e. how far was point to nearest), blue_line_key, downstream_route_measure (or rename to distance_upstream)

for blue_line_key_to we could add: blue_line_key and downstream_route_measure (or rename to distance_upstream)

fwa_indexpoint method

see issue #11 discussion

does fwa_indexpoint find the nearest stream as the crow flies (i.e. regardless of whether it is in that stream's watershed) or does it find the nearest stream within the same watershed?

@smnorris can you comment?

fwa_rkm error

Error in fwa_locate_along_interval(blue_line_key, interval_length = interval,  : 
  unused arguments (start_measure = start, end_measure = end)

Return rkm as units km?

Since sf has units as a dependency and also returns the distance between features in units m I'm thinking we should set the units on rkm from the fwa_rkm() function to be km.

Thoughts?

fwa_add_watershed_to_blk throwing API error

fwatlasbc::fwa_add_watershed_to_blk(data.frame(blk = 356568903))
#> Error in `err()`:
#> ! API request failed [500]: Unable to read data from: postgisftw.fwa_watershedatmeasure
#> .
fwapgr::fwa_watershed_at_measure(356568903, downstream_route_measure = 19845)
#> Simple feature collection with 1 feature and 4 fields
#> Geometry type: POLYGON
#> Dimension:     XY
#> Bounding box:  xmin: 1785979 ymin: 613165.7 xmax: 1809305 ymax: 652385.3
#> Geodetic CRS:  WGS 84
#> Warning in st_is_longlat(x): bounding box has potentially an invalid value range
#> for longlat data
#> # A data frame: 1 × 5
#>   area_ha localcode_ltree   refine_method wscode_ltree                  geometry
#> *   <dbl> <chr>             <chr>         <chr>                    <POLYGON [°]>
#> 1  42258. 300.625474.58472… DEM           300.625474.… ((1787504 635608.9, 1787…

Same error thrown for fwa_watershed_at_measure, with and without downstream_route_measure argument

fwapgr::fwa_watershed_at_measure(356568903, downstream_route_measure = 19840)
#> Error in `err()`:
#> ! API request failed [500]: Unable to read data from: postgisftw.fwa_watershedatmeasure
#> .

Created on 2022-06-06 by the reprex package (v2.0.1)

fwa_get_stream accepting gnis_name

i.e. fwa_get_stream("Sangan River") to bypass our watershed-based workflow
I think easiest to just apply to streams (using gnis_name column in fwa_named_streams layer) for now.

Main question is do we differentiate function family by name (e.g. fwa_gnis_stream) or do we add methods to fwa_get_named_stream (i.e. a character string method and a sf/sfc method)

add fwa_prune_stream_network() based on blk and rm

Work on local stream network or rm data (but only if watershed codes for latter)

Could either keep or drop the pruned part (or perhaps both?)

In the case of rm data (with watershed codes) could drop, keep or code in the same way that section.

Add gnis lookups

currently just uses named_streams layer to get valid gnis_name for stream_networks

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.