Rasterio is a GDAL and NumPy-based Python library for raster data, written with the Python developer in mind instead of C, using Python language types, protocols, and idioms. html Navigation Here are the examples of the python api json. We want to know what the solution is over the whole bounding box, so we will average the stats together here to give us just one output for each site. classification_to_cmap (x) Generate a colormap (cmap) object for a given 02/05/2019 Geocomputation with R. In general, these should divide the dimensions of each dataset. Following the description in mapbox/rasterio's documentation, a window is a view onto a rectangular subset of a raster dataset. so I used sudo apt--get install rasterio. transform(). I have never done this before but I think it would be fun. shape (int or tuple, optional) – The shape of the chunk. A ReadDriver returns a DataSource implementation, which is chosen based on: Dataset URI protocol, eg. chunks and then process those in parallel rather than operating with multiple files. The NetCDF on OSGeo, GDAL and other GIS fun. Queries a single, zoom layer from a GeoTrellis catalog given spatial and/or time parameters. Robert Sare has posted on the benefits of using rasterio in earth sciences research. Lock, optional. And if you want to make sense of what you’re reading, you need to read – to recognize and understand – the chunks. [x] Run npm test at the sub modules where changes have occurred. With my proposal you can mix normal blocking RasterIO calls with AsyncRasterIO calls. Is there a straightforward way to calculate these values given extent information? Rasterio employs GDAL under the hood for file I/O and raster formatting. Info; Deps; Files; Scripts; ChangeLog; Location; Others versions; Analyse gcc-5 (5. readthedocs. > My ultimate goal is to read into RAM only a clipped portion of a large raster (well, actually a raster stack, but taking baby steps here). 编程字典(CodingDict. Storage requirements are on the order of n*k locations. opftoc. Rasterio is pronounced raw-STEER-ee-oh. /***** * * Project: JPEG-2000 * Purpose: Implementation of the ISO/IEC 15444-1 standard based on Kakadu. 0-12) unstable; urgency=medium * Don't install i586 symlinks anymore for i386 builds in sid. chunks (shape=256, pad=False) ¶ This method returns GeoRaster chunks out of the original raster. – Yihui Xie Mar 20 '13 at 19:23 I have a raster time series stored in multiple GeoTIFF files (*. Beginning in rasterio 0. Hi, Below is the link to my proposal on "Implement write support for the GDAL PostGIS Raster driver" This page provides a keyword index to questions and answers. If int, chunk each dimension by chunks. There are a number of ways to chunk the calculations and output of the results. copy(deep=True) f. read_csv, the data all needs to be on the local filesystem (or on one of the limited remote specification formats supported by Pandas, such as S3). 0-1and xarray is 0. Rasterio is designed to make working with geospatial raster data more productive and more fun. readbuffer(1) Read input from devices which don't like constant stopping and starting. nc') Problem description. 1) from the gcc-5-branch. Let me give you a simple example; look at this sentence: How to efficiently access files with GDAL from an S3 bucket using VSIS3? examples of actually reading chunks. Ensure we fallback to native geotransform if no pam override. That function mimics Python’s built-in open() and the dataset objects it returns mimic Python file objects. The following are 35 code examples for showing how to use shapely. opf application/oebps-package+xml content. 6 (4. Cardpeek is a tool to read the contents of ISO7816 smart cards: caribou: Simplified in-place on-screen keyboard: cartago: Framework for programming and executing environments in multi-agent: casady-fonts: TrueType fonts by Robin Casady: castget: Command-line RSS enclosures dowloader: cataclysm-dda: Roguelike set in a post-apocalyptic world: catfish I want to do operations on a copy of a dataset and then overwrite the NetCDF it was read from: python f = xr. By voting up you can indicate which examples are most useful and appropriate. 1 minute read. A key – but challenging – part of learning to program is moving from writing technically-correct code “that works” to writing high-quality code that is sensibly decomposed into functions, generically-applicable and generally “good”. open_dataset('dataset. Artificial Intelligence can compose songs, paint pictures, help in cancer therapy, drive cars and play games. rpm. It’s also starting to write code. chunking words, phone numbers or ideas and data. If not given, source projection is read from the command-line -s_srs or -gcp parameters dstfile: File with destination projection definition. tif) that I'd like to convert to a single NetCDF file. Learn how to use geopandas, rasterio and matplotlib to they use fairly low-level systems, such as, for example, the fiona and rasterio Python libraries or their equivalent in other programming languages. The data is uint16. store the code chunks for future references; 2. Robin's Blog Showing code changes when teaching July 25, 2016. Parameters. Getting data into xarray ¶ xarray can read various formats directly: gdal_translate: add a -projwin_srs option to be able to express -projwin coordinates in another SRS than the one of the dataset gdal_translate: support -'outsize avalue 0' or '-outsize 0 avalue' to preserve aspect ratio gdal_translate: avoid preserving statistics when changing data type in situations where clamping can occur In that sense, the datashould always be in a GDAL supported format. Download the data yourself: Driving Data My ultimate goal is to read into RAM only a clipped portion of a large raster (well, actually a raster stack, but taking baby steps here). Windowed Reads and Writes. However, pickling is # Author(s): # Lorenzo Clementi <lorenzo. Fractional Cover: Trend and Variability Analysis¶. They can be set programmatically, by commandline switches or in the environment by the user. close() n. gdal-1. lock: False or duck threading. – parupalu May 2 at 12:26 Python Rasterio. Read bytes from file. rasterio read in chunks. 1 1. Read the documentation for more details: https://rasterio. open_rasterio (filename, parse_coordinates=None, chunks=None, cache=None, lock=None) ¶ Open a file with rasterio (experimental). xarray. Preface: ROS is only officially supported on Ubuntu & Debian and is experimental on OS X (Homebrew), Gentoo, and OpenEmbedded/Yocto. Accounting Billing and Invoicing Budgeting Compliance Payment Processing Risk Management. For convenience, I downloaded the original, smaller, data set. Note: As of August 2018, this notebook requires modification in order to run successfully. Now these operations run at full C speed. Meltdown and Spectre exploit critical vulnerabilities in modern processors, allowing attackers to read arbitrary data currently processed on the computer without any permissions or privileges. 15 Conclusion | Geocomputation with R is for people who want to analyze, visualize and model geographic data with open source software. 1-2) unstable; urgency=medium * Update to SVN 20151206 (r231339, 5. Der Chaos Computer Club ist die größte europäische Hackervereinigung, und seit über 25 Jahren Vermittler im Spannungsfeld technischer und sozialer Entwicklungen. * Remove upstreamed chunks from the ada-kfreebsd patch. ncxgenindex. 12. [gdal-dev] GDAL Raster Attribute Tables. 11. The above works, however if I use the chunks argument while opening the dataset, a KeyError: 'tcw' is thrown. GDAL's gdal_calc. - - -- Matthias Klose Sun, 16 Jan 2011 23:28:28 +0100 - -gcc-4. Analytics I read about the release of their second data set yesterday and wanted to check it out. The NetCDF on Rasterio is a GDAL and NumPy-based Python library for raster data, written with the Python developer in mind instead of C, using Python language types, protocols, and idioms. At the beginning of last year, two major security vulnerabilities have been disclosed to the public. A parse_coordinates kwarg has beed added to open_rasterio() (set to True per default). Try to read projection info embedded in ECW file before reading the worldfile Add support for updating geotransform and projection info of a ECW file () Get Started With GIS in Open Source Python - Geopandas, Rasterio & Matplotlib. The problem is that the code that projects and clips all of the rasters to the same cell size and dimensions is not producing rasters that all have the same dimensions. gz) files without decompressing them priorly. Example. build_rasterio_path (bucket, path) Build rasterio compliant s3 path to object: util. 0 urn:oasis:names:tc:opendocument:xmlns:container content. Configuration Options. Does it mean that the days of human programmers are already numbered? File with source projection definition or GCP's. The colors of discrete colormaps are now the same regardless if seaborn is installed or not . chunks={} loads the dataset with dask using a single chunk for all arrays. CONTENTS 1 About 1 1. This should work with any file that rasterio can open (most often: geoTIFF). Basic idea behind the script is to: · Read elevation model as a numpy array with rasterio · Create a suitable kernel that results in mean of surrounding area being computed · Apply sliding mean to your elevation array using your kernel Landsat-live is now twice as crisp! We’ve added pansharpening to our constantly refreshed Landsat-live pipeline, and are now serving NASA’s Landsat 8 data at 15 meter resolution. ch> # Panu Lahtinen <panu. Changelog for GDAL 1. The version of rasterio I got is 0. You can also save this page to your account. In his EuroSciPy talk Joris compares the performance of GeoPandas (both before and after Cython) with PostGIS, the standard geospatial plugin for the popular PostgreSQL database (original notebook with the comparison). From the point of view of either a process or a channel, the writing end of the channel means the same thing. I was thinking more along the lines of using windowed read/write and just have a convenient way to align the processing chunks with the block size of the source raster. com/evenrouault">Twitter</a>, <a href="http://github. Current system settings; Available IO plugins I'm doing some image processing, and I'd like to individually read each pixel value in a JPEG and PNG images. Path next to string Closes #7 See merge request visr/imod-python!6 All of these different chunks, and separate processing chains can be run on separate processes or separate computers. mga2. Rasterio 1. They are extracted from open source Python projects. Example Ideally we could use Rasterio's ability to read directly from S3 URIs, but after implementing this, I found that there were some issues that I could not resolve. 0 or greater. Only relevant when using dask or another form of parallelism. "At this stage, the smaller chunks of each case study area still have their own statistics. - * Work around PR libffi/47248, force a read only eh frame section. I could probably use gdal_translate to convert each im Basically, GDAL is your best friend for working with any type of raster or vector data. The goal is to get larger units of information that can be processed faster and memorized easier. This is the online home of Geocomputation with R, a bo Normalmente, se almacenaban los metadatos de la cobertura completa por un lado (geolocalización, tamaño de píxel, srid, extensión, etc) y las teselas por otro, como simples chunks de datos binarios adyacentes. Rasterio employs GDAL under the hood for file I/O and raster formatting. 6-20110105-1) experimental Rasterio and Xarray know how to pull down chunks of full resolution images, and Dask knows how to distribute computations that use those chunks. 2 License Ultimately, I want to get the lat, lon, and elevation coordinates to plot the topology of different regions. This is useful when you want to work on rasters that are larger than your computers RAM or process chunks of large rasters in parallel. There are a suite of powerful open source python libraries that can be used to work with spatial data. 5. • For the officers at the checkpoint, if the car is a real police car, say Car A, the database will return an In this section, we discuss the operation of the proposed system. com), 专注于IT课程的研发和培训,课程分为:实战课程、 免费教程、中文文档、博客和在线工具 形成了五 mimetypeMETA-INF/container. 编程字典. rasterio read in chunks 1. In my deployment scenario, it would be awkward for me to use a 3rd party library (as I have restricted access on the target computer), but I'm assuming that there's no standard C or C++ library for reading JPEG/PNG Pickling is important because it doesn’t require any external libraries and lets you use xarray objects with Python modules like multiprocessing or Dask. 0-3. Is there a straightforward way to calculate these values given extent information? > A PostGIS-Raster data proposal. To use methods like pd. db. Its functions typically accept and return Numpy ndarrays. The software is designed to compute a few (k) eigenvalues with user specified features such as those of largest real part or largest magnitude. py xarray. To submit a question, use the anonymous questions page. 9. if you want speed, use the chunk option cache=TRUE. Reading Datasets¶. By default, appropriate locks are chosen to safely read and write files with the currently active dask scheduler. com/rouault">GitHub</a> or on my company <a . Does anyone know of a Python module that maybe interacts with satellite images or some public database to get the coordinates into Python at different levels of fine/coarse? ) messages often have names containing "in", "read", "from" or "receive". Mark GDAL_DCAP_VIRTUALIO=YES when the driver is configured in read-only mode. Dictionary with keys given by dimension names and values given by chunk sizes. Windowed reading and writing¶. Dataset objects provide read, read-write, and write access to raster data files and are obtained by calling rasterio. Chunk out NED ⅓arc second data using pyspark. open(). Find me on <a href="http://twitter. It is based on R, a statistical programming language that has powerful data processing, visualization, and geospatial capabilities. Each data object will be passed to the corresponding GDALRasterProcessFn * * @param windowXSize The desired width of each read window. By default, all pixels and all bands are read in memory. Explore our 263 earth data science lessons that will help you learn how to work with data in the R and Python programming languages. I mean hats off to them for getting a nice result, but they could have done it so much more efficiently by using the right tools. ops. read_stars has an argument called RasterIO which controls how a GDAL dataset is being read. Rayna Harris nominated videoconferencing as her most useful research tool, while Greg Wilson talks up the benefits of asking for help. Tracker / GDAL / changelog / GDAL / changelog [x] Have read How To Contribute. -- Matthias Klose Tue, 08 Dec 2015 02:10:51 +0100 gcc-5 (5. By default, chunks will be chosen to load entire input files into memory at once. You have two avenues for working with GDAL: the Application Programming Interface or the command line utilities . The two links in my answer are my best attempt of explanation. The email threads tend to look like this: --- Poster: ABI Laboratory. readdvd(1) Is creating an image of your source dvd media or medias even if it has / they have corrupted Reading and manipulating tiled GeoTIFF datasets¶. It is possible to create and load data from files that are not GDAL compliant - CSIRO has created an extension to ODC for use with AWS S3 that creates serialized chunks of data that are not accessible except via an ODC API. daca2 - r Der Chaos Computer Club ist die größte europäische Hackervereinigung, und seit über 25 Jahren Vermittler im Spannungsfeld technischer und sozialer Entwicklungen. The GDALWarpOperation::ChunkAndWarpImage() invokes GDALWarpOperation::WarpRegion() on chunks of output and input image that are small enough to hold in the amount of memory allowed by the application. 3, you can read and write “windows” of raster files. This page discussed runtime configuration options for GDAL, and is distinct from options to the build-time configure script. write_raster (bucket, path, arr, **kwargs) Write a numpy array as a geospatial raster to a s3 bucket: util. The RasterIO would return immediately if the buffer contains a proper set of the intermediary data. The NetCDF on Cardpeek is a tool to read the contents of ISO7816 smart cards: caribou: Simplified in-place on-screen keyboard: cartago: Framework for programming and executing environments in multi-agent: casady-fonts: TrueType fonts by Robin Casady: castget: Command-line RSS enclosures dowloader: cataclysm-dda: Roguelike set in a post-apocalyptic world: catfish I want to do operations on a copy of a dataset and then overwrite the NetCDF it was read from: python f = xr. Reads nCount objects of nSize bytes from the indicated file at the current offset into the indicated buffer. The following are 11 code examples for showing how to use rasterio. Runtime configuration options apply on all platforms, and are evaluated at runtime. Thanks for the response. + Since we’re using rasterio, It’s read in as a 2D numpy array. For fast operations we see speedups of 100x. This is a fun thing I experimented with in AWS, using Python/Lambda to proxy requests from API Gateway. Must support RasterIO in write mode. Here's an example of some basic features that Rasterio provides. For slower operations we’re closer to 10x. Yea, as someone who does this sort of thing for a living much of that was quite painful to read. Full text of "Journal Of Computer Science IJCSIS October 2015" See other formats At the beginning of last year, two major security vulnerabilities have been disclosed to the public. This requires some additional processing but 2310: cuts the memory required for the prediction to that needed for just 2311: one of the chunks. 1. read(): access a section of source data in native projection but possibly in different resolution; reproject(): access a section of source data, re-projecting to an arbitrary projection/resolution; This interface follows very closely the interface provided by the rasterio library. Learning to read chunks of words is all about training in which you will practice Making sense of what you read – it’s in the chunks. 36. * Author: Frank Warmerdam, warmerdam@pobox. 2019-04-24. Hi, I would like to read in an entire ENVI image into a GDAL Dataset, and then, create a matrix the size of which is pixels X number of Rasterio is a GDAL and NumPy-based Python library for raster data, written with the Python developer in mind instead of C, using Python language types, protocols, and idioms. 2. This feature allows you to work on rasters that are larger than your computers RAM or process chunks of large rasters in parallel. s3. Accounting & Finance. rasterio and dask for multithreaded chunked raster operations - rioarray. py script divides the job into chunks that match the storage of the input files. Rasterio reads and writes geospatial raster datasets. > > My immediate question: the `RasterIO` option of read_stars defines cell offsets and cell counts (*Size). x86_64. /vsigzip/ (gzipped file) /vsigzip/ is a file handler that allows reading on-the-fly in GZip (. Resource lock to use when reading data from disk. mini-RFID reader will automatically read the tag data and transmit the data via the EPCglobal Network to query the central databases. The chunck is evaluated only when fetched from the iterator. This method goes through the VSIFileHandler virtualization and may work on unusual filesystems such as in memory. Hi All, We were wondering if there is any interest in the GDAL community for improving the Raster Attribute Implementation? In 1. read(1plan9) ↣ cat(1plan9) Catenate files. This can consume a lot of time and require a lot of memory. By Fabien Maussion. The new zip must be closed before being re-opened for read. over 2 years How to avoid the auto convert variable dtype from float32 to float64 when read netCDF file use open_dataset? over 2 years How to efficiently use DataArrays with Cartopy's add_cyclic_point utility? over 2 years Remove IndexVariable. Chunking is a general concept that can be applied to many different activities, i. * * @param dataObjectArray an array of process-specific data objects of size nProcesses. * Build a native compiler with a cross directory layout using the FORCE_CROSS_LAYOUT environment variable. My immediate question: the `RasterIO` option of read_stars defines cell offsets and cell counts (*Size). Rasterio aims to make GIS data more accessible to Python programmers and helps GIS analysts learn important Python standards. . classification_to_cmap (x) Generate a colormap (cmap) object for a given { "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Spectral Clustering Example" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The 02/05/2019 Geocomputation with R. [x] Run npm run lint to ensure code style at the turf module level. io by mapbox - fast, simple map creation. com ARPACK software is capable of solving large scale symmetric, nonsymmetric, and generalized eigenproblems from significant application areas. com), 专注于IT课程的研发和培训,课程分为:实战课程、 免费教程、中文文档、博客和在线工具 形成了五 Here are the examples of the python api json. fi> # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. As stored in the Data Cube Dataset. But when I installed rasterio using pip3 it did not work. name; over 2 years Bytes being transformed to a numpy array with dtype=object in coordinates def read_shapefile_to_grid (fpath, grid): """Same as read_shapefile but directly transformed to a grid. [Aside: it's safer to use the terms write and read, rather than out and in. * Fix PR sanitizer/67899, build failure on sparc/sparc64. clementi@meteoswiss. Commit Score: This score is calculated by counting number of weeks with non-zero commits in the last 1 year period. 3. Why? Because meaning comes in groups of words, sometimes called chunks. * Re-enable building gdc/libphobos, fixing the profiled build. 1 What is GDAL?. Now that I have introduced you to GIS Programming with Python and QGIS Python Console in part 1 (read part 1 here), lets dive deeper here in part 2. Currently we are downloading the whole file (and then deleting it to save disk space) which is inefficient. This removes defineProperties, which was only used for one property, also removes that property and simply gets . Coordinates are read as pairs (or triples) of numbers per line from standard input, transformed, and written out to standard output in the same way. I rewrote rio-calc to chunk the work more like GDAL's warper does How to efficiently read in a GDAL image into a matrix. Rasterio. This is not as fast as using block indexes directly, but it is significantly faster than making badly aligned reads, and it should prevent mistakes as you mention. to_netcdf(path='dataset. [read more here] You can have a look at the code below: This slightly reduces the compression rate, so too small chunks should be avoided. This notebook shows how to perform simple calculations with a GeoTIFF dataset using XArray and Dask. Geocomputation with R Robin Lovelace, Jakub Nowosad, Jannes Muenchow. read(1posix) Read a line from standard input. x is not compatible with GDAL versions 3. In the FOSS4G ecosystem, there is a middle species, though: tools that are composed of multiple command-line modules that can be chained to form very efficient work processes. These new coordinates might be handy for plotting and indexing, but it should be kept in mind that a grid which is regular in projection coordinates will likely be irregular in lon/lat. This site contains open, tutorials and course materials covering topics including data integration, GIS and data intensive science. Conflating the reading and transformation of pixel data into one Reading chunks, change resolution, select bands. GitHub Gist: instantly share code, notes, and snippets. Ideally we could use Rasterio's ability to read directly from S3 URIs, but after implementing this, I found that there were some issues that I could not resolve. Here are the examples of the python api json. data is written and read from disk, allowing Using lambda with s3 and dynamodb: Resolving import issues when deploying Python code to AWS Lambda 8 minute read AWS Lambda is Amazon’s “serverless” compute platform that basically lets you run code without thinking (too much) of servers. The whole thing is cached so that the second call will will be much faster. So if 26 weeks out of the last 52 had non-zero commits and the rest had zero commits, the score would be 50%. 22, rio-calc read all your sources into memory, preventing calculations on very large datasets. Three bands are read from an image and averaged to produce something like a panchromatic band. Getting the data. In this article, am going to run you through some important basics of python GIS programming on the QGIS Python Console. Unlike read, this method will only return part of the layer that intersects the specified region. xml1. Reading chunks, change resolution, select bands. Internally, we now use the rasterio coordinate transform tool instead of doing the computations ourselves. About Tracker Viewer Navigator Open-Source Reports Contacts Donate. The window read was rectangular, but we masked the elements which did not overlap with the actual geometry shape, so that those values are not included when we do certain numpy operations. 0. " ] }, Dictionary with keys given by dimension names and values given by chunk sizes. We could of course put in various commands here to fetch a file explicitly from a remote server, but the notebook would then very quickly get complex and unreadable. Read and write operations cannot be interleaved. Since downloading from S3 to EC2 is fast, this might not be a big bottleneck, but if it is, we should dig deeper into these issues and try to get it to work. You may find the keyword index and/or top-level index useful for locating past questions and answers. nc') n = f. py. Read plug-ins are specified as supporting particular uri protocols and formats, both of which are fields available on existing Datasets. I have investigated further and have realised that GeoViews is cropping to the UTM bounds (in particular, not only cropping at the right but also the left for TIFFs wide enough). open_rasterio¶ xarray. Over the past several months, I've seen a number of postings regarding support in PostGIS for raster data. Default: 256. read_file (bucket, path) Read a text file as string: util. I used pip3 install xarray and it got installed. If you have read them and still do not understand read_chunk(), I would recommend you to leave this behind -- you probably do not really need it. This process is described in greater detail in the Image Chunking section. The user would use the existing RasterIO method to initiate the operation as well as to fetch the next available data. geojson. s3:// Dataset format. Note The whole layer could still be read in if intersects and/or time_intervals have not been set, or if the querried region contains the entire layer. How to Read Groups of Words. 2312: 2313: If you need to use this parameter we recommend that you start with a 2314: value of 100. GSoC Proposal : GDAL PostGIS Raster driver. - The Now that I have introduced you to GIS Programming with Python and QGIS Python Console in part 1 (read part 1 here), lets dive deeper here in part 2. length. geotalleres-teoria Documentation Release 1 Varios - Read the Docs Parsing rasterio’s geocoordinates Parsing rasterio’s geocoordinates¶ Converting a projection’s cartesian coordinates into 2D longitudes and latitudes. lahtinen@fmi. The GDAL API is a library of classes and functions for dealing with raster and vector data. Thank you all for your time. Clicking on a keyword will take you to a page containing all questions and answers for that keyword, grouped by year. edges. util. e. A plan for improving the data management of the collections in the RDS Landsat (rs0) and WOfs (fk4) Projects, such as establishing data layout, appropriate access controls (including read/write permissions) and alignment to existing organisational data libraries); Reformatting of all data in projects rs0 (Landsat) and fk4 (WOfS) that are Clifton Franklund likes RStudio, while Francesco Montanari is a fan of emacs. Please contact the author (Chad Burton) for assistance prior to running any analyses. loads taken from open source projects. Merge branch 'path' into 'master' support pathlib. io/. in GDAL you can also use rasterio to read Reading chunks, change resolution, select bands. into the specified number of same-size chunks and invokes the R 2309: function on each chunk. The improvements from 30 meter resolution to 15 meter resolution is like putting on a pair of glasses with the right This is the responsibility of the GDALWarpOperation class. La filosofía tras PostGIS Raster es diferente. chunks int or dict, optional. You can vote up the examples you like or vote down the exmaples you don't like. Welcome. Useful when you want to iterate over a big rasters. readbin(1) ATLC's binary file information provider. geotalleres-teoria Documentation Release 1 Varios - Read the Docs Robin's Blog Showing code changes when teaching July 25, 2016. Good readers do not read word by word