From ef68ad4dcbdc81ef5e0bb7e9333cc6c16416b098 Mon Sep 17 00:00:00 2001 From: csubira Date: Thu, 22 Feb 2018 17:25:12 +0100 Subject: [PATCH 01/45] Add new docs folder structure --- docs/examples/01-example.md | 1 + docs/guides/01-overview.md | 49 +++ docs/reference/01-geocoding-functions.md | 348 +++++++++++++++++++ docs/reference/02-isoline-functions.md | 104 ++++++ docs/reference/03-demographic-functions.md | 155 +++++++++ docs/reference/04-routing-functions.md | 84 +++++ docs/reference/05-segementation-functions.md | 181 ++++++++++ docs/support/01-quota-information.md | 135 +++++++ docs/support/02-rate-limits.md | 197 +++++++++++ 9 files changed, 1254 insertions(+) create mode 100644 docs/examples/01-example.md create mode 100644 docs/guides/01-overview.md create mode 100644 docs/reference/01-geocoding-functions.md create mode 100644 docs/reference/02-isoline-functions.md create mode 100644 docs/reference/03-demographic-functions.md create mode 100644 docs/reference/04-routing-functions.md create mode 100644 docs/reference/05-segementation-functions.md create mode 100644 docs/support/01-quota-information.md create mode 100644 docs/support/02-rate-limits.md diff --git a/docs/examples/01-example.md b/docs/examples/01-example.md new file mode 100644 index 0000000..5bc9ae3 --- /dev/null +++ b/docs/examples/01-example.md @@ -0,0 +1 @@ +## Example 1 \ No newline at end of file diff --git a/docs/guides/01-overview.md b/docs/guides/01-overview.md new file mode 100644 index 0000000..9eb1862 --- /dev/null +++ b/docs/guides/01-overview.md @@ -0,0 +1,49 @@ +## Overview + +By using CARTO libraries and the SQL API, you can apply location data services to your maps with unique data services functions. These functions are integrated with a number of internal and external services, enabling you to programatically customize subsets of data for your visualizations. These features are useful for geospatial analysis and the results can be saved, and stored, for additional location data service operations. + +**Note:** Based on your account plan, some of these data services are subject to different [quota limitations](https://carto.com/docs/carto-engine/dataservices-api/quota-information/#quota-information). + +_In order to supply the best location data services from within our CARTO Engine, the Data Services API collaborates with [Mapbox](https://www.mapbox.com/) and several other geospatial service providers. [Contact us](mailto:sales@carto.com) if you have any specific questions or requirements about the location data service provider being used with your account._ + +### Data Services Integration + +By using the SQL API to query the Data Services API functions, you can manage specific operations and the corresponding geometries (a `polygon` or a `point`), according to the input information. + +The Data Services API also exposes its services directly through CARTO Builder. For example, you can geocode data (from single rows, complete datasets, or simple inputs) and perform trade areas analysis (computing isodistances or isochrones) programatically, through authenticated SQL requests, or by using the ANALYSIS options. + +The geometries provided by this API are projected in the projection [WGS 84 SRID 4326](http://spatialreference.org/ref/epsg/wgs-84/). + +**Note:** The Data Services API [geocoding functions](https://carto.com/docs/carto-engine/dataservices-api/geocoding-functions/#geocoding-functions) return different types of geometries (points or polygons) as result of different geocoding processes. The CARTO Engine does not support multi-geometry layers or datasets, therefore you must confirm that you are using consistent geometry types inside a table, to avoid future conflicts in your map visualization. + +#### Best Practices + +_Be mindful of the following usage notes when using the Data Services functions with the SQL API:_ + +It is discouraged to use the SELECT operation with the Data Services API functions in your map layers, as these type of queries consume quota when rendering tiles for your live map views. It may also result in sync performance issues, due to executing multiple requests to the API each time your map is viewed. See details about [Quota Consumption](https://carto.com/docs/carto-engine/dataservices-api/quota-information/#quota-consumption). + +The Data Services API is **recommended** to be used with INSERT or UPDATE operations, for applying location data to your tables. While SELECT (retrieve) is standard for SQL API requests, be mindful of quota consumption and use INSERT (to insert a new record) or UPDATE (to update an existing record), for best practices. + +### Authentication + +All requests performed to the CARTO Data Services API must be authenticated with the user API Key. For more information about where to find your API Key, and how to authenticate your SQL API requests, view the [SQL API authentication](/carto-engine/sql-api/authentication/) documentation. + +### Errors + +Errors are described in the response of the request. An example is as follows: + +```json +{ + error: [ + "The api_key must be provided" + ] +} +``` + +Since the Data Services API is used on top of the CARTO SQL API, you can refer to the [Making calls to the SQL API](https://carto.com/docs/carto-engine/sql-api/making-calls/) documentation for help debugging your SQL errors. + +If the requested information is not in the CARTO geocoding database, or if CARTO is unable to recognize your input and match it with a result, the geocoding function returns `null` as a result. + +### Limits + +Usage of the Data Services API is subject to the CARTO SQL API limits, stated in our [Terms of Service](https://carto.com/terms/#excessive). diff --git a/docs/reference/01-geocoding-functions.md b/docs/reference/01-geocoding-functions.md new file mode 100644 index 0000000..f82f457 --- /dev/null +++ b/docs/reference/01-geocoding-functions.md @@ -0,0 +1,348 @@ +## Geocoding Functions + +The [geocoder](https://carto.com/data/geocoder-api/) functions allow you to match your data with geometries on your map. This geocoding service can be used programatically to geocode datasets via the CARTO SQL API. It is fed from _Open Data_ and it serves geometries for countries, provinces, states, cities, postal codes, IP addresses and street addresses. CARTO provides functions for several different categories of geocoding through the Data Services API. + +_**This service is subject to quota limitations and extra fees may apply**. View the [Quota Information](https://carto.com/docs/carto-engine/dataservices-api/quota-information/) section for details and recommendations about to quota consumption._ + +The following example displays how to geocode a single country: + +```bash +https://{username}.carto.com/api/v2/sql?q=SELECT cdb_geocode_admin0_polygon('USA')&api_key={api_key} +``` + +In order to geocode an existent CARTO dataset, an SQL UPDATE statement must be used to populate the geometry column in the dataset with the results of the Data Services API. For example, if the column where you are storing the country names for each one of our rows is called `country_column`, run the following statement in order to geocode the dataset: + +```bash +https://{username}.carto.com/api/v2/sql?q=UPDATE {tablename} SET the_geom = cdb_geocode_admin0_polygon('USA')&api_key={api_key} +``` + +Notice that you can make use of Postgres or PostGIS functions in your Data Services API requests, as the result is a geometry that can be handled by the system. For example, suppose you need to retrieve the centroid of a specific country, you can wrap the resulting geometry from the geocoder functions inside the PostGIS `ST_Centroid` function: + +```bash +https://{username}.carto.com/api/v2/sql?q=UPDATE {tablename} SET the_geom = ST_Centroid(cdb_geocode_admin0_polygon('USA'))&api_key={api_key} +``` + + +The following geocoding functions are available, grouped by categories. + +### Country Geocoder + +This function geocodes your data into country border geometries. It recognizes the names of the different countries either by different synonyms (such as their English name or their endonym), or by ISO (ISO2 or ISO3) codes. + +#### cdb_geocode_admin0_polygon(_country_name text_) + +Geocodes the text name of a country into a country_name geometry, displayed as polygon data. + +##### Arguments + +Name | Type | Description +--- | --- | --- +`country_name` | `text` | Name of the country + +##### Returns + +Geometry (polygon, EPSG 4326) or null + +##### Example + +###### Update the geometry of a table to geocode it + +```bash +UPDATE {tablename} SET the_geom = cdb_geocode_admin0_polygon({country_column}) +``` + +###### Insert a geocoded row into a table + +```bash +INSERT INTO {tablename} (the_geom) SELECT cdb_geocode_admin0_polygon('France') +``` + +### Level-1 Administrative Regions Geocoder + +This function geocodes your data into polygon geometries for [Level 1](https://en.wikipedia.org/wiki/Table_of_administrative_divisions_by_country), or [NUTS-1](https://en.wikipedia.org/wiki/NUTS_1_statistical_regions_of_England), administrative divisions (or units) of countries. For example, a "state" in the United States, "départements" in France, or an autonomous community in Spain. + +#### cdb_geocode_admin1_polygon(_admin1_name text_) + +Geocodes the name of the province/state into a Level-1 administrative region, displayed as a polygon geometry. + +##### Arguments + +Name | Type | Description +--- | --- | --- +`admin1_name` | `text` | Name of the province/state + +##### Returns + +Geometry (polygon, EPSG 4326) or null + +##### Example + +###### Update the geometry of a table to geocode it + +```bash +UPDATE {tablename} SET the_geom = cdb_geocode_admin1_polygon({province_column}) +``` + +###### Insert a geocoded row into a table + +```bash +INSERT INTO {tablename} (the_geom) SELECT cdb_geocode_admin1_polygon('Alicante') +``` + + +#### cdb_geocode_admin1_polygon(_admin1_name text, country_name text_) + +Geocodes the name of the province/state for a specified country into a Level-1 administrative region, displayed as a polygon geometry. + +##### Arguments + +Name | Type | Description +--- | --- | --- +`admin1_name` | `text` | Name of the province/state +`country_name` | `text` | Name of the country in which the province/state is located + +##### Returns + +Geometry (polygon, EPSG 4326) or null + +##### Example + +###### Update the geometry of a table to geocode it + +```bash +UPDATE {tablename} SET the_geom = cdb_geocode_admin1_polygon({province_column}, {country_column}) +``` +###### Insert a geocoded row into a table + +```bash +INSERT INTO {tablename} (the_geom) SELECT cdb_geocode_admin1_polygon('Alicante', 'Spain') +``` + + +### City Geocoder + +This function geocodes your data into point geometries for names of cities. It is recommended to use geocoding functions that require more defined parameters — this returns more accurate results when several cities have the same name. _If there are duplicate results for a city name, the city name with the highest population will be returned._ + +#### cdb_geocode_namedplace_point(_city_name text_) + +Geocodes the text name of a city into a named place geometry, displayed as point data. + +##### Arguments + +Name | Type | Description +--- | --- | --- +`city_name` | `text` | Name of the city + +##### Returns + +Geometry (point, EPSG 4326) or null + +##### Example + +###### Select + +###### Update the geometry of a table to geocode it + +```bash +UPDATE {tablename} SET the_geom = cdb_geocode_namedplace_point({city_column}) +``` + +###### Insert a geocoded row into a table + +```bash +INSERT INTO {tablename} (the_geom) SELECT cdb_geocode_namedplace_point('Barcelona') +``` + + +#### cdb_geocode_namedplace_point(_city_name text, country_name text_) + +Geocodes the text name of a city for a specified country into a named place point geometry. + +##### Arguments + +Name | Type | Description +--- | --- | --- +`city_name` | `text` | Name of the city +`country_name` | `text` | Name of the country in which the city is located + +##### Returns + +Geometry (point, EPSG 4326) or null + +##### Example + +###### Update the geometry of a table to geocode it + +```bash +UPDATE {tablename} SET the_geom = cdb_geocode_namedplace_point({city_column}, 'Spain') +``` + +###### Insert a geocoded row into a table + +```bash +INSERT INTO {tablename} (the_geom) SELECT cdb_geocode_namedplace_point('Barcelona', 'Spain') +``` + + +#### cdb_geocode_namedplace_point(_city_name text, admin1_name text, country_name text_) + +Geocodes your data into a named place point geometry, containing the text name of a city, for a specified province/state and country. This is recommended for the most accurate geocoding of city data. +##### Arguments + +Name | Type | Description +--- | --- | --- +`city_name` | `text` | Name of the city +`admin1_name` | `text` | Name of the province/state in which the city is located +`country_name` | `text` | Name of the country in which the city is located + +##### Returns + +Geometry (point, EPSG 4326) or null + +##### Example + +###### Update the geometry of a table to geocode it + +```bash +UPDATE {tablename} SET the_geom = cdb_geocode_namedplace_point({city_column}, {province_column}, 'USA') +``` + +###### Insert a geocoded row into a table + +```bash +INSERT INTO {tablename} (the_geom) SELECT cdb_geocode_namedplace_point('New York', 'New York', 'USA') +``` + +### Postal Code Geocoder + +These functions geocode your data into point, or polygon, geometries for postal codes. The postal code geocoder covers the United States, France, Australia and Canada; a request for a different country will return an empty response. + +**Note:** For the USA, US Census Zip Code Tabulation Areas (ZCTA) are used to reference geocodes for USPS postal codes service areas. This is not a CARTO restriction, this is a US Government licensing protection of their zip code data source; which is not publicly available. Additionally, zip codes are considered service areas and are not actually geometric areas. As a solution, the US Census provides ZCTA data, which tabulates GIS postal codes for USPS locations by aggregating census blocks. For details about how ZCTAs are created, see [ZIP Code™ Tabulation Areas (ZCTAs™)](https://www.census.gov/geo/reference/zctas.html). If you are geocoding data and your zip codes fail, ensure you are using ZCTAs for the postal code. + +#### cdb_geocode_postalcode_polygon(_postal_code text, country_name text_) + +Geocodes the postal code for a specified country into a **polygon** geometry. + +##### Arguments + +Name | Type | Description +--- | --- | --- +`postal_code` | `text` | Postal code +`country_name` | `text` | Name of the country in which the postal code is located + +##### Returns + +Geometry (polygon, EPSG 4326) or null + +##### Example + +###### Update the geometry of a table to geocode it + +```bash +UPDATE {tablename} SET the_geom = cdb_geocode_postalcode_polygon({postal_code_column}, 'USA') +``` + +###### Insert a geocoded row into a table + +```bash +INSERT INTO {tablename} (the_geom) SELECT cdb_geocode_postalcode_polygon('11211', 'USA') +``` + +#### cdb_geocode_postalcode_point(_code text, country_name text_) + +Geocodes the postal code for a specified country into a **point** geometry. + +##### Arguments + +Name | Type | Description +--- | --- | --- +`postal_code` | `text` | Postal code +`country_name` | `text` | Name of the country in which the postal code is located + +##### Returns + +Geometry (point, EPSG 4326) or null + +##### Example + +###### Update the geometry of a table to geocode it + +```bash +UPDATE {tablename} SET the_geom = cdb_geocode_postalcode_point({postal_code_column}, 'USA') +``` + +###### Insert a geocoded row into a table + +```bash +INSERT INTO {tablename} (the_geom) SELECT cdb_geocode_postalcode_point('11211', 'USA') +``` + + +### IP Addresses Geocoder + +This function geocodes your data into point geometries for IP addresses. This is useful if you are analyzing location based data, based on a set of user's IP addresses. + +#### cdb_geocode_ipaddress_point(_ip_address text_) + +Geocodes a postal code from a specified country into an IP address, displayed as a point geometry. + +##### Arguments + +Name | Type | Description +--- | --- | --- +`ip_address` | `text` | IPv4 or IPv6 address + +##### Returns + +Geometry (point, EPSG 4326) or null + +##### Example + +###### Update the geometry of a table to geocode it + +```bash +UPDATE {tablename} SET the_geom = cdb_geocode_ipaddress_point('102.23.34.1') +``` + +###### Insert a geocoded row into a table + +```bash +INSERT INTO {tablename} (the_geom) SELECT cdb_geocode_ipaddress_point('102.23.34.1') +``` + +### Street-Level Geocoder + +This function geocodes your data into a point geometry for a street address. CARTO uses several different service providers for street-level geocoding, depending on your platform. If you access CARTO on a Google Cloud Platform, [Google Maps geocoding](https://developers.google.com/maps/documentation/geocoding/intro) is applied. All other platform users are provided with [Mapbox geocoding services](https://www.mapbox.com/). [Contact us](mailto:sales@carto.com) if you have any specific questions or requirements about the location data service provider being used with your account._. + +**This service is subject to quota limitations, and extra fees may apply**. View the [Quota information](https://carto.com/docs/carto-engine/dataservices-api/quota-information/) for details and recommendations about quota consumption. + +#### cdb_geocode_street_point(_search_text text, [city text], [state text], [country text]_) + +Geocodes a complete address into a single street geometry, displayed as point data. + +##### Arguments + +Name | Type | Description +--- | --- | --- | --- +`searchtext` | `text` | searchtext contains free-form text containing address elements. You can specify the searchtext parameter by itself, or with other parameters, to narrow your search. For example, you can specify the state or country parameters, along with a free-form address in the searchtext field. +`city` | `text` | (Optional) Name of the city. +`state` | `text` | (Optional) Name of the state. +`country` | `text` | (Optional) Name of the country. + +##### Returns + +Geometry (point, EPSG 4326) or null + +##### Example + +###### Update the geometry of a table to geocode it + +```bash +UPDATE {tablename} SET the_geom = cdb_geocode_street_point({street_name_column}) +``` + +###### Insert a geocoded row into a table + +```bash +INSERT INTO {tablename} (the_geom) SELECT cdb_geocode_street_point('651 Lombard Street', 'San Francisco', 'California', 'United States') +``` diff --git a/docs/reference/02-isoline-functions.md b/docs/reference/02-isoline-functions.md new file mode 100644 index 0000000..4b1cc49 --- /dev/null +++ b/docs/reference/02-isoline-functions.md @@ -0,0 +1,104 @@ +## Isoline Functions + +[Isolines](https://carto.com/data/isolines/) are contoured lines that display equally calculated levels over a given surface area. This enables you to view polygon dimensions by forward or reverse measurements. Isoline functions are calculated as the intersection of areas from the origin point, measured by distance (isodistance) or time (isochrone). For example, the distance of a road from a sidewalk. Isoline services through CARTO are available by requesting a single function in the Data Services API. + +_**This service is subject to quota limitations and extra fees may apply**. View the [Quota Information](https://carto.com/docs/carto-engine/dataservices-api/quota-information/) section for details and recommendations about to quota consumption._ + +You can use the isoline functions to retrieve, for example, isochrone lines from a certain location, specifying the mode and the ranges that will define each of the isolines. The following query calculates isolines for areas that are 5, 10 and 15 minutes (300, 600 and 900 seconds, respectively) away from the location by following a path defined by car routing and inserts them into a table. + +```bash +https://{username}.carto.com/api/v2/sql?q=INSERT INTO {table} (the_geom) SELECT the_geom FROM cdb_isodistance('POINT(-3.70568 40.42028)'::geometry, 'car', ARRAY[300, 600, 900]::integer[])&api_key={api_key} +``` + +The following functions provide an isoline generator service, based on time or distance. This service uses the isolines service defined for your account. The default service limits the usage of displayed polygons represented on top of [Mapbox](https://www.mapbox.com/) maps. + +### cdb_isodistance(_source geometry, mode text, range integer[], [options text[]]_) + +Displays a contoured line on a map, connecting geometries to a defined area, measured by an equal range of distance (in meters). + +##### Arguments + +Name | Type | Description | Accepted values +--- | --- | --- | --- +`source` | `geometry` | Source point, in 4326 projection, which defines the start location. | +`mode` | `text` | Type of transport used to calculate the isolines. | `car` or `walk` +`range` | `integer[]` | Range of the isoline, in meters. | +`options` | `text[]` | (Optional) Multiple options to add more capabilities to the analysis. See [Optional isolines parameters](#optional-isoline-parameters) for details. + + +##### Returns + +Name | Type | Description +--- | --- | --- +`center` | `geometry` | Source point, in 4326 projection, which defines the start location. +`data_range` | `integer` | The range that belongs to the generated isoline. +`the_geom` | `geometry(MultiPolygon)` | MultiPolygon geometry of the generated isoline in the 4326 projection. + +##### Examples + +###### Calculate and insert isodistance polygons from a point into another table + +```bash +INSERT INTO {table} (the_geom) SELECT the_geom FROM cdb_isodistance('POINT(-3.70568 40.42028)'::geometry, 'walk', ARRAY[300, 600, 900]::integer[]) +``` + +or equivalently: + +```bash +INSERT INTO {table} (the_geom) SELECT (cdb_isodistance('POINT(-3.70568 40.42028)'::geometry, 'walk', ARRAY[300, 600, 900]::integer[])).the_geom +``` + +###### Calculate and insert the generated isolines from `points_table` table to another table + +```bash +INSERT INTO {table} (the_geom) SELECT (cdb_isodistance(the_geom, 'walk', string_to_array(distance, ',')::integer[])).the_geom FROM {points_table} +``` + + +### cdb_isochrone(_source geometry, mode text, range integer[], [options text[]]_) + +Displays a contoured line on a map, connecting geometries to a defined area, measured by an equal range of time (in seconds). + +##### Arguments + +This function uses the same parameters and information as the `cdb_isodistance` function, with the exception that the range is measured in seconds instead of meters. + +Name | Type | Description | Accepted values +--- | --- | --- | --- +`source` | `geometry` | Source point, in 4326 projection, which defines the start location. | +`mode` | `text` | Type of transport used to calculate the isolines. | `car` or `walk` +`range` | `integer[]` | Range of the isoline, in seconds. | +`options` | `text[]` | (Optional) Multiple options to add more capabilities to the analysis. See [Optional isolines parameters](#optional-isoline-parameters) for details. + +##### Examples + +###### Calculate and insert isochrone polygons from a point into another table + +```bash +INSERT INTO {table} (the_geom) SELECT the_geom FROM cdb_isochrone('POINT(-3.70568 40.42028)'::geometry, 'car', ARRAY[300, 900, 12000]::integer[], ARRAY['mode_traffic=enabled','quality=3']::text[]) +``` + +or equivalently: + +```bash +INSERT INTO {table} (the_geom) SELECT (cdb_isochrone('POINT(-3.70568 40.42028)'::geometry, 'car', ARRAY[300, 900, 12000]::integer[], ARRAY['mode_traffic=enabled','quality=3']::text[])).the_geom +``` + +###### Calculate and insert the generated isolines from `points_table` table into another table + +```bash +INSERT INTO {table} (the_geom) SELECT (cdb_isochrone(the_geom, 'walk', string_to_array(time_distance, ',')::integer[])).the_geom FROM {points_table} +``` + +#### Optional isoline parameters + +The optional value parameters must be passed using the format: `option=value`. + +Name | Type | Description | Accepted values +--- | --- | --- | --- +`is_destination` | `boolean` | If true, the source point is the destination instead of the starting location | `true` or `false`. `false` by default +`mode_type` | `text` | Type of route calculation | `shortest` or `fastest`. `shortest` by default +`mode_traffic` | `text` | Use traffic data to calculate the route | `enabled` or `disabled`. `disabled` by default +`resolution` | `text` | Allows you to specify the level of detail needed for the isoline polygon. Unit is meters per pixel. Higher resolution may increase the response time of the service. +`maxpoints` | `text` | Allows you to limit the amount of points in the returned isoline. If the isoline consists of multiple components, the sum of points from all components is considered. Each component will have at least two points. It is possible that more points than specified could be returned, in case when `2 * number of components` is higher than the `maxpoints` value itself. Increasing the number of `maxpoints` may increase the response time of the service. +`quality` | `text` | Allows you to reduce the quality of the isoline in favor of the response time. | `1`, `2`, `3`. Default value is `1`, corresponding to the best quality option. diff --git a/docs/reference/03-demographic-functions.md b/docs/reference/03-demographic-functions.md new file mode 100644 index 0000000..204962e --- /dev/null +++ b/docs/reference/03-demographic-functions.md @@ -0,0 +1,155 @@ +### Demographic Functions + +The Demographic Snapshot enables you to collect demographic reports around a point location. For example, you can take the coordinates of a coffee shop and find the average population characteristics, such as total population, educational attainment, housing and income information around that location. You can use raw street addresses by combining the Demographic Snapshot with CARTO's geocoding features. If you need help creating coordinates from addresses, see the [Geocoding Functions](https://carto.com/docs/carto-engine/dataservices-api/geocoding-functions/) documentation. + +_**Note:** The Demographic Snapshot functions are only available for the United States._ + +#### OBS_GetDemographicSnapshot( point geometry ) + +Fields returned include information about income, education, transportation, race, and more. Not all fields will have information for every coordinate queried. + +##### Arguments + +Name | Description | Example Values +--- | --- | --- +point geometry | A point geometry. You can use the helper function, `CDB_LatLng` to quickly generate one from latitude and longitude | `CDB_LatLng(40.760410,-73.964242)` + +##### Returns + +The Demographic Snapshot contains a broad subset of demographic measures in the Data Observatory. Over 80 measurements are returned by a single API request. For each demographic measure, the API returns the following values. + +Value | Name | Tablename | Aggregate | Type | Description +----- | ---- | --------- | --------- | ---- |------------ +The value of the measure at the point you requested | The name of the measure | The table it was drawn from | Indicated if the measure is a count or median. | postgresql | A description of the measure + +For example the "Female Population" measure returns + +```json +obs_getdemographicsnapshot: { + "value": 32.5395066379175, + "name": "Female Population", + "tablename": "obs_1a098da56badf5f32e336002b0a81708c40d29cd", + "aggregate": "sum", + "type": "Numeric", + "description": "The number of people within each geography who are female." +} +``` + +**For details, see the [Glossary of Demographic Measures](#glossary-of-demographic-measures).** + +##### Examples + +```bash +https://{username}.carto.com/api/v2/sql?q=SELECT * FROM +OBS_GetDemographicSnapshot({{point geometry}}) +``` + +####### Get the Geographic Snapshot of a Demographic + +__Get the Demographic Snapshot at Camp David__ + +```bash +https://{username}.carto.com/api/v2/sql?q=SELECT * FROM +OBS_GetDemographicSnapshot(CDB_LatLng(39.648333, -77.465)) +``` + +__Get the Demographic Snapshot in the Upper West Side__ + +```bash +https://{username}.carto.com/api/v2/sql?q=SELECT * FROM +OBS_GetDemographicSnapshot(CDB_LatLng(40.80, -73.960)) +``` + +#### Glossary of Demographic Measures + +This list contains the demographic measures and response names for results from the ```OBS_GetDemographicSnapshot``` function. + + Measure name | Measure Description | Response Mame | Response Units +--- | --- | --- | --- +Total Population | The total number of all people living in a given geographic area. This is a very useful catch-all denominator when calculating rates. | total_pop | Count per sq. km +Male Population | The number of people within each geography who are male. | male_pop | Count per sq. km +Female Population | The number of people within each geography who are female.| female_pop | Count per sq. km +Population not Hispanic | The number of people not identifying as Hispanic or Latino in each geography. | not_hispanic_pop | Count per sq. km +White Population | The number of people identifying as white, non-Hispanic in each geography. | white_pop | Count per sq. km +Black or African American Population| The number of people identifying as black or African American, non-Hispanic in each geography. | black_pop | Count per sq. km +American Indian and Alaska Native Population | The number of people identifying as American Indian or Alaska native in each geography.| amerindian_pop| Count per sq. km +Asian Population | The number of people identifying as Asian, non-Hispanic in each geography.| asian_pop | Count per sq. km +Other Race population | The number of people identifying as another race in each geography. | other_race_pop | Count per sq. km +Two or more races population| The number of people identifying as two or more races in each geography | two_or_more_races_pop | Count per sq. km +Hispanic Population | The number of people identifying as Hispanic or Latino in each geography. | hispanic_pop | Count per sq. km +Not a U.S. Citizen Population | The number of people within each geography who indicated that they are not U.S. citizens. | not_us_citizen_pop | Count per sq. km +Median Age | The median age of all people in a given geographic area.| median_age | Years +Children under 18 Years of Age | The number of people within each geography who are under 18 years of age.| children | Count per sq. km +Population 15 Years and Over | The number of people in a geographic area who are over the age of 15. This is used mostly as a denominator of marital status. | pop_15_and_over | Count per sq. km +Population 3 Years and Over | The total number of people in each geography age 3 years and over. This denominator is mostly used to calculate rates of school enrollment. | population_3_years_over | Count per sq. km +Population 5 Years and Over | The number of people in a geographic area who are over the age of 5. This is primarily used as a denominator of measures of language spoken at home.| pop_5_years_over | Count per sq. km +Workers over the Age of 16 | The number of people in each geography who work. Workers include those employed at private for-profit companies, the self-employed, government workers and non-profit employees. | workers_16_and_over | Count per sq. km +Workers age 16 and over who do not work from home| The number of workers over the age of 16 who do not work from home in a geographic area| commuters_16_over | Count per sq. km +Commuters by Car, Truck, or Van | The number of workers age 16 years and over within a geographic area who primarily traveled to work by car, truck or van. This is the principal mode of travel or type of conveyance, by distance rather than time, that the worker usually used to get from home to work. | commuters_by_car_truck_van | Count per sq. km +Commuters who drove alone | The number of workers age 16 years and over within a geographic area who primarily traveled by car driving alone. This is the principal mode of travel or type of conveyance, by distance rather than time, that the worker usually used to get from home to work. | commuters_drove_alone | Count per sq. km +Commuters by Carpool| The number of workers age 16 years and over within a geographic area who primarily traveled to work by carpool. This is the principal mode of travel or type of conveyance, by distance rather than time, that the worker usually used to get from home to work. | commuters_by_carpool | Count per sq. km +Commuters by Public Transportation | The number of workers age 16 years and over within a geographic area who primarily traveled to work by public transportation. This is the principal mode of travel or type of conveyance, by distance rather than time, that the worker usually used to get from home to work. | commuters_by_public_transportation | Count per sq. km | +Commuters by Bus | The number of workers age 16 years and over within a geographic area who primarily traveled to work by bus. This is the principal mode of travel or type of conveyance, by distance rather than time, that the worker usually used to get from home to work. This is a subset of workers who commuted by public transport. | commuters_by_bus| Count per sq. km +Commuters by Subway or Elevated | The number of workers age 16 years and over within a geographic area who primarily traveled to work by subway or elevated train. This is the principal mode of travel or type of conveyance, by distance rather than time, that the worker usually used to get from home to work. This is a subset of workers who commuted by public transport. | commuters_by_subway_or_elevated | Count per sq. km +Walked to Work | The number of workers age 16 years and over within a geographic area who primarily walked to work. This would mean that of any way of getting to work, they travelled the most distance walking. | walked_to_work | Count per sq. km +Worked at Home | The count within a geographical area of workers over the age of 16 who worked at home. | worked_at_home | Count per sq. km +Number of workers with less than 10 minute commute | The number of workers over the age of 16 who do not work from home and commute in less than 10 minutes in a geographic area. | commute_less_10_mins | Count per sq. km +Number of workers with a commute between 10 and 14 minutes| The number of workers over the age of 16 who do not work from home and commute in between 10 and 14 minutes in a geographic area. | commute_10_14_mins | Count per sq. km +Number of workers with a commute between 15 and 19 minutes | The number of workers over the age of 16 who do not work from home and commute in between 15 and 19 minutes in a geographic area. | commute_15_19_mins | Count per sq. km +Number of workers with a commute between 20 and 24 minutes | The number of workers over the age of 16 who do not work from home and commute in between 20 and 24 minutes in a geographic area. | commute_20_24_mins | Count per sq. km +Number of workers with a commute between 25 and 29 minutes | The number of workers over the age of 16 who do not work from home and commute in between 25 and 29 minutes in a geographic area. | commute_25_29_mins| Count per sq. km +Number of workers with a commute between 30 and 34 minutes | The number of workers over the age of 16 who do not work from home and commute in between 30 and 34 minutes in a geographic area. | commute_30_34_mins | Count per sq. km +Number of workers with a commute between 35 and 44 minutes | The number of workers over the age of 16 who do not work from home and commute in between 35 and 44 minutes in a geographic area. | commute_35_44_mins | Count per sq. km +Number of workers with a commute between 45 and 59 minutes | The number of workers over the age of 16 who do not work from home and commute in between 45 and 59 minutes in a geographic area. | commute_45_59_mins | Count per sq. km +Number of workers with a commute of over 60 minutes | The number of workers over the age of 16 who do not work from home and commute in over 60 minutes in a geographic area.| commute_60_more_mins | Count per sq. km +Aggregate travel time to work | The total number of minutes every worker over the age of 16 who did not work from home spent spent commuting to work in one day in a geographic area. | aggregate_travel_time_to_work | Minutes +Households | A count of the number of households in each geography. A household consists of one or more people who live in the same dwelling and also share at meals or living accommodation, and may consist of a single family or some other grouping of people. | households | Count per sq. km +Never Married | The number of people in a geographic area who have never been married. | pop_never_married | Count per sq. km +Currently married| The number of people in a geographic area who are currently married. | pop_now_married | Count per sq. km +Married but separated | The number of people in a geographic area who are married but separated.| pop_separated | Count per sq. km +Widowed | The number of people in a geographic area who are widowed.| pop_widowed | Count per sq. km +Divorced | The number of people in a geographic area who are divorced. | pop_divorced | Count per sq. km +Students Enrolled in School | The total number of people in each geography currently enrolled at any level of school, from nursery or pre-school to advanced post-graduate education. Only includes those over the age of 3. | in_school | Count per sq. km +Students Enrolled in Grades 1 to 4 | The total number of people in each geography currently enrolled in grades 1 through 4 inclusive. This corresponds roughly to elementary school. | in_grades_1_to_4 | Count per sq. km +Students Enrolled in Grades 5 to 8 | The total number of people in each geography currently enrolled in grades 5 through 8 inclusive. This corresponds roughly to middle school. | in_grades_5_to_8 | Count per sq. km +Students Enrolled in Grades 9 to 12 | The total number of people in each geography currently enrolled in grades 9 through 12 inclusive. This corresponds roughly to high school. | in_grades_9_to_12 | Count per sq. km +Students Enrolled as Undergraduate in College | The number of people in a geographic area who are enrolled in college at the undergraduate level. Enrollment refers to being registered or listed as a student in an educational program leading to a college degree. This may be a public school or college, a private school or college. | in_undergrad_college | Count per sq. km +Population 25 Years and Over | The number of people in a geographic area who are over the age of 25. This is used mostly as a denominator of educational attainment. | pop_25_years_over | Count per sq. km +Population Completed High School | The number of people in a geographic area over the age of 25 who completed high school, and did not complete a more advanced degree. | high_school_diploma| Count per sq. km +Population completed less than one year of college, no degree | The number of people in a geographic area over the age of 25 who attended college for less than one year and no further. | less_one_year_college | Count per sq. km +Population completed more than one year of college, no degree | The number of people in a geographic area over the age of 25 who attended college for more than one year but did not obtain a degree. | one_year_more_college | Count per sq. km +Population Completed Associate's Degree | The number of people in a geographic area over the age of 25 who obtained a associate's degree, and did not complete a more advanced degree.| associates_degree | Count per sq. km +Population Completed Bachelor's Degree| The number of people in a geographic area over the age of 25 who obtained a bachelor's degree, and did not complete a more advanced degree. | bachelors_degree| Count per sq. km +Population Completed Master's Degree | The number of people in a geographic area over the age of 25 who obtained a master's degree, but did not complete a more advanced degree. | masters_degree | Count per sq. km +Speaks only English at Home | The number of people in a geographic area over age 5 who speak only English at home. | speak_only_english_at_home | Count per sq. km +Speaks Spanish at Home | The number of people in a geographic area over age 5 who speak Spanish at home, possibly in addition to other languages. | speak_spanish_at_home | Count per sq. km +Population for Whom Poverty Status Determined | The number of people in each geography who could be identified as either living in poverty or not. This should be used as the denominator when calculating poverty rates, as it excludes people for whom it was not possible to determine poverty. | pop_determined_poverty_status | Count per sq. km +Income In The Past 12 Months Below Poverty Level | The number of people in a geographic area who are part of a family (which could be just them as an individual) determined to be "in poverty" following the [Office of Management and Budget's Directive 14](https://www.census.gov/hhes/povmeas/methodology/ombdir14.html). | poverty | Count per sq. km +Households with income less than $10,000 | The number of households in a geographic area whose annual income was less than $10,000. | income_less_10000 | Count per sq. km +Households with income of $10,000 to $14,999 | The number of households in a geographic area whose annual income was between $10,000 and $14,999. | income_10000_14999 | Count per sq. km +Households with income of $15,000 to $19,999 | The number of households in a geographic area whose annual income was between $15,000 and $19,999. | income_15000_19999 | Count per sq. km +Households with income of $20,000 To $24,999 | The number of households in a geographic area whose annual income was between $20,000 and $24,999. | income_20000_24999 | Count per sq. km +Households with income of $25,000 To $29,999 | The number of households in a geographic area whose annual income was between $20,000 and $24,999. | income_25000_29999 | Count per sq. km +Households with income of $30,000 To $34,999 | The number of households in a geographic area whose annual income was between $30,000 and $34,999. | income_30000_34999 | Count per sq. km +Households with income of $35,000 To $39,999 | The number of households in a geographic area whose annual income was between $35,000 and $39,999. | income_35000_39999 | Count per sq. km +Households with income of $40,000 To $44,999 | The number of households in a geographic area whose annual income was between $40,000 and $44,999. | income_40000_44999| Count per sq. km +Households with income of $45,000 To $49,999 | The number of households in a geographic area whose annual income was between $45,000 and $49,999. | income_45000_49999 | Count per sq. km +Households with income of $50,000 To $59,999 | The number of households in a geographic area whose annual income was between $50,000 and $59,999. | income_50000_59999 | Count per sq. km +Households with income of $60,000 To $74,999 | The number of households in a geographic area whose annual income was between $60,000 and $74,999. | income_60000_74999 | Count per sq. km +Households with income of $75,000 To $99,999 | The number of households in a geographic area whose annual income was between $75,000 and $99,999. | income_75000_99999 | Count per sq. km +Households with income of $100,000 To $124,999 | The number of households in a geographic area whose annual income was between $100,000 and $124,999. | income_100000_124999 | Count per sq. km +Households with income of $125,000 To $149,999 | The number of households in a geographic area whose annual income was between $125,000 and $149,999. | income_125000_149999 | Count per sq. km +Households with income of $150,000 To $199,999 | The number of households in a geographic area whose annual income was between $150,000 and $1999,999. | income_150000_199999 | Count per sq. km +Households with income of $200,000 Or More | The number of households in a geographic area whose annual income was more than $200,000. | income_200000_or_more | Count per sq. km +Median Household Income in the past 12 Months | Within a geographic area, the median income received by every household on a regular basis before payments for personal income taxes, social security, union dues, medicare deductions, etc. It includes income received from wages, salary, commissions, bonuses, and tips; self-employment income from own nonfarm or farm businesses, including proprietorships and partnerships; interest, dividends, net rental income, royalty income, or income from estates and trusts; Social Security or Railroad Retirement income; Supplemental Security Income (SSI); any cash public assistance or welfare payments from the state or local welfare office; retirement, survivor, or disability benefits; and any other sources of income received regularly such as Veterans' (VA) payments, unemployment and/or worker's compensation, child support, and alimony. | median_income | USD +Per Capita Income in the past 12 Months | | income_per_capita | USD +Gini Index | A measurement of the income distribution of a country's residents. | gini_index | None +Housing Units | A count of housing units in each geography. A housing unit is a house, an apartment, a mobile home or trailer, a group of rooms, or a single room occupied as separate living quarters, or if vacant, intended for occupancy as separate living quarters. | housing_units | Count per sq. km +Vacant Housing Units | The count of vacant housing units in a geographic area. A housing unit is vacant if no one is living in it at the time of enumeration, unless its occupants are only temporarily absent. Units temporarily occupied at the time of enumeration entirely by people who have a usual residence elsewhere are also classified as vacant. | vacant_housing_units | Count per sq. km +Vacant Housing Units for Rent | The count of vacant housing units in a geographic area that are for rent. A housing unit is vacant if no one is living in it at the time of enumeration, unless its occupants are only temporarily absent. Units temporarily occupied at the time of enumeration entirely by people who have a usual residence elsewhere are also classified as vacant. | vacant_housing_units_for_rent | Count per sq. km +Vacant Housing Units for Sale| The count of vacant housing units in a geographic area that are for sale. A housing unit is vacant if no one is living in it at the time of enumeration, unless its occupants are only temporarily absent. Units temporarily occupied at the time of enumeration entirely by people who have a usual residence elsewhere are also classified as vacant. | vacant_housing_units_for_sale | Count per sq. km +Owner-occupied Housing Units | The count of owner occupied housing units in a geographic area. | owner_occupied_housing_units | Count per sq. km +Owner-occupied Housing Units valued at $1,000,000 or more. | The count of owner occupied housing units in a geographic area that are valued at $1,000,000 or more. Value is the respondent's estimate of how much the property (house and lot, mobile home and lot, or condominium unit) would sell for if it were for sale. | million_dollar_housing_units | Count per sq. km +Owner-occupied Housing Units with a Mortgage | The count of housing units within a geographic area that are mortagaged. "Mortgage" refers to all forms of debt where the property is pledged as security for repayment of the debt, including deeds of trust, trust deed, contracts to purchase, land contracts, junior mortgages, and home equity loans. | mortgaged_housing_units | Count per sq. km +Median Rent | The median contract rent within a geographic area. The contract rent is the monthly rent agreed to or contracted for, regardless of any furnishings, utilities, fees, meals, or services that may be included. For vacant units, it is the monthly rent asked for the rental unit at the time of interview.| median_rent | USD +Percent of Household Income Spent on Rent | Within a geographic area, the median percentage of household income which was spent on gross rent. Gross rent is the amount of the contract rent plus the estimated average monthly cost of utilities (electricity, gas, water, sewer etc.) and fuels (oil, coal, wood, etc.) if these are paid by the renter. Household income is the sum of the income of all people 15 years and older living in the household. | percent_income_spent_on_rent | Percent diff --git a/docs/reference/04-routing-functions.md b/docs/reference/04-routing-functions.md new file mode 100644 index 0000000..8d55951 --- /dev/null +++ b/docs/reference/04-routing-functions.md @@ -0,0 +1,84 @@ +## Routing Functions + +Routing is the navigation from a defined start location to a defined end location. The calculated results are displayed as turn-by-turn directions on your map, based on the transportation mode that you specified. Routing services through CARTO are available by using the available functions in the Data Services API. + +### cdb_route_point_to_point(_origin geometry(Point), destination geometry(Point), mode text, [options text[], units text]_) + +Returns a route from origin to destination. + +##### Arguments + +Name | Type | Description | Accepted values +--- | --- | --- | --- +`origin` | `geometry(Point)` | Origin point, in 4326 projection, which defines the start location. | +`destination` | `geometry(Point)` | Destination point, in 4326 projection, which defines the end location. | +`mode` | `text` | Type of transport used to calculate the routes. | `car`, `walk`, `bicycle` or `public_transport` +`options` | `text[]` | (Optional) Multiple options to add more capabilities to the analysis. See [Optional routing parameters](#optional-routing-parameters) for details. +`units` | `text` | (Optional) Unit used to represent the length of the route. | `kilometers`, `miles`. By default is `kilometers`. This option is not supported by Mapbox provider + + +##### Returns + +Name | Type | Description +--- | --- | --- +`duration` | `integer` | Duration in seconds of the calculated route. +`length` | `real` | Length in the defined unit in the `units` field. `meters` by default . +`the_geom` | `geometry(LineString)` | LineString geometry of the calculated route in the 4326 projection. + +##### Examples + +###### Insert the values from the calculated route in your table + +```bash +INSERT INTO (duration, length, the_geom) SELECT duration, length, shape FROM cdb_route_point_to_point('POINT(-3.70237112 40.41706163)'::geometry,'POINT(-3.69909883 40.41236875)'::geometry, 'car') +``` +###### Update the geometry field with the calculated route shape + +```bash +UPDATE
SET the_geom = (SELECT shape FROM cdb_route_point_to_point('POINT(-3.70237112 40.41706163)'::geometry,'POINT(-3.69909883 40.41236875)'::geometry, 'car', ARRAY['mode_type=shortest']::text[])) +``` + +### cdb_route_with_waypoints(_waypoints geometry(Point)[], mode text, [options text[], units text]_) + +Returns a route that goes from origin to destination and whose path travels through the defined locations. + +##### Arguments + +Name | Type | Description | Accepted values +--- | --- | --- | --- +`waypoints` | `geometry(Point)[]` | Array of ordered points, in 4326 projection, which defines the origin point, one or more locations for the route path to travel through, and the destination. The first element of the array defines the origin and the last element the destination of the route. | +`mode` | `text` | Type of transport used to calculate the routes. | `car`, `walk`, `bicycle` or `public_transport` +`options` | `text[]` | (Optional) Multiple options to add more capabilities to the analysis. See [Optional routing parameters](#optional-routing-parameters) for details. +`units` | `text` | (Optional) Unit used to represent the length of the route. | `kilometers`, `miles`. By default is `kilometers`. This option is not supported by Mapbox provider + + +##### Returns + +Name | Type | Description +--- | --- | --- +`duration` | `integer` | Duration in seconds of the calculated route. +`length` | `real` | Length in the defined unit in the `units` field. `meters` by default . +`the_geom` | `geometry(LineString)` | LineString geometry of the calculated route in the 4326 projection. + +*Note*: A request to the function _cdb\_route\_with\_waypoints(waypoints geometry(Point)[], mode text, [options text[], units text])_ with only two points in the geometry array are automatically defined as origin and destination. It is equivalent to performing the following request with these two locations as parameters: _cdb\_route\_point\_to\_point(origin geometry(Point), destination geometry(Point), mode text, [options text[], units text])_. + +##### Examples + +###### Insert the values from the calculated route in your table + +```bash +INSERT INTO
(duration, length, the_geom) SELECT duration, length, shape FROM cdb_route_with_waypoints(Array['POINT(-3.7109 40.4234)'::GEOMETRY, 'POINT(-3.7059 40.4203)'::geometry, 'POINT(-3.7046 40.4180)'::geometry]::geometry[], 'walk') +``` +###### Update the geometry field with the calculated route shape + +```bash +UPDATE
SET the_geom = (SELECT shape FROM cdb_route_with_waypoints(Array['POINT(-3.7109 40.4234)'::GEOMETRY, 'POINT(-3.7059 40.4203)'::geometry, 'POINT(-3.7046 40.4180)'::geometry]::geometry[], 'car', ARRAY['mode_type=shortest']::text[])) +``` + +#### Optional routing parameters + +The optional value parameters must be passed using the format: `option=value`. Not all are available for all the routing providers + +Name | Type | Description | Accepted values +--- | --- | --- | --- +`mode_type` | `text` | Type of route calculation | `shortest` (this option only applies to the car transport mode) diff --git a/docs/reference/05-segementation-functions.md b/docs/reference/05-segementation-functions.md new file mode 100644 index 0000000..bbfe913 --- /dev/null +++ b/docs/reference/05-segementation-functions.md @@ -0,0 +1,181 @@ +## Segmentation Functions + +The Segmentation Snapshot functions enable you to determine the pre-calculated population segment for a location. Segmentation is a method that divides a populations into subclassifications based on common traits. For example, you can take the a store location and determine what classification of population exists around that location. If you need help creating coordinates from addresses, see the [Geocoding Functions](https://carto.com/docs/carto-engine/dataservices-api/geocoding-functions/) documentation. + +_**Note:** The Segmentation Snapshot functions are only available for the United States. Our first release (May 18, 2016) is derived from Census 2010 variables. Our next release will be based on Census 2014 data. For the latest information, see the [Open Segments](https://github.com/CartoDB/open-segments) project repository._ + +### OBS_GetSegmentSnapshot( Point Geometry ) + +#### Arguments + +Name | Description | Example Values +--- | --- | --- +point geometry | A point geometry. You can use the helper function, `CDB_LatLng` to quickly generate one from latitude and longitude | `CDB_LatLng(40.760410,-73.964242)` + +#### Returns + +The segmentation function returns two segment levels for the point you requests, the x10\_segment and x55\_segment. These segmentation levels contain different classifications of population within with each segment. The function also returns the quantile of a number of census variables. For example, if total_poulation is at 90% quantile level then this tract has a higher total population than 90% of the other tracts. + +Name | Type | Description +---- | ---- | ----------- +x10\_segment | text | The demographic segment location at the 10 segment level, containing populations at high-levels, broken down into 10 broad categories +x55\_segment | text | The demographic segment location at the 55 segment level, containing more granular sub-levels to categorize the population + +An example response appears as follows: + +```json +obs_getsegmentsnapshot: { + "x10_segment": "Wealthy, urban without Kids", + "x55_segment": "Wealthy city commuters", + "us.census.acs.B01001001_quantile": "0.0180540540540541", + "us.census.acs.B01001002_quantile": "0.0279864864864865", + "us.census.acs.B01001026_quantile": "0.016527027027027", + "us.census.acs.B01002001_quantile": "0.507297297297297", + "us.census.acs.B03002003_quantile": "0.133162162162162", + "us.census.acs.B03002004_quantile": "0.283743243243243", + "us.census.acs.B03002006_quantile": "0.683945945945946", + "us.census.acs.B03002012_quantile": "0.494594594594595", + "us.census.acs.B05001006_quantile": "0.670972972972973", + "us.census.acs.B08006001_quantile": "0.0607567567567568", + "us.census.acs.B08006002_quantile": "0.0684324324324324", + "us.census.acs.B08006008_quantile": "0.565135135135135", + "us.census.acs.B08006009_quantile": "0.638081081081081", + "us.census.acs.B08006011_quantile": "0", + "us.census.acs.B08006015_quantile": "0.900932432432432", + "us.census.acs.B08006017_quantile": "0.186648648648649", + "us.census.acs.B09001001_quantile": "0.0193513513513514", + "us.census.acs.B11001001_quantile": "0.0617972972972973", + "us.census.acs.B14001001_quantile": "0.0179594594594595", + "us.census.acs.B14001002_quantile": "0.0140405405405405", + "us.census.acs.B14001005_quantile": "0", + "us.census.acs.B14001006_quantile": "0", + "us.census.acs.B14001007_quantile": "0", + "us.census.acs.B14001008_quantile": "0.0609054054054054", + "us.census.acs.B15003001_quantile": "0.0314594594594595", + "us.census.acs.B15003017_quantile": "0.0403378378378378", + "us.census.acs.B15003022_quantile": "0.285972972972973", + "us.census.acs.B15003023_quantile": "0.214567567567568", + "us.census.acs.B16001001_quantile": "0.0181621621621622", + "us.census.acs.B16001002_quantile": "0.0463108108108108", + "us.census.acs.B16001003_quantile": "0.540540540540541", + "us.census.acs.B17001001_quantile": "0.0237567567567568", + "us.census.acs.B17001002_quantile": "0.155972972972973", + "us.census.acs.B19013001_quantile": "0.380662162162162", + "us.census.acs.B19083001_quantile": "0.986891891891892", + "us.census.acs.B19301001_quantile": "0.989594594594595", + "us.census.acs.B25001001_quantile": "0.998418918918919", + "us.census.acs.B25002003_quantile": "0.999824324324324", + "us.census.acs.B25004002_quantile": "0.999986486486486", + "us.census.acs.B25004004_quantile": "0.999662162162162", + "us.census.acs.B25058001_quantile": "0.679054054054054", + "us.census.acs.B25071001_quantile": "0.569716216216216", + "us.census.acs.B25075001_quantile": "0.0415", + "us.census.acs.B25075025_quantile": "0.891702702702703" +} +``` + +The possible segments are: + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
X10 segment X55 Segment
Hispanic and kids
Middle Class, Educated, Suburban, Mixed Race
Low Income on Urban Periphery
Suburban, Young and Low-income
low-income, urban, young, unmarried
Low education, mainly suburban
Young, working class and rural
Low-Income with gentrification
Low Income and Diverse
High school education Long Commuters, Black, White Hispanic mix
Rural, Bachelors or college degree, Rent owned mix
Rural,High School Education, Owns property
Young, City based renters in Sparse neighborhoods, Low poverty
Low income, minority mix
Predominantly black, high high school attainment, home owners
White and minority mix multilingual, mixed income / education. Married
Hispanic Black mix multilingual, high poverty, renters, uses public transport
Predominantly black renters, rent own mix
Middle income, single family homes
Lower Middle Income with higher rent burden
Black and mixed community with rent burden
Lower Middle Income with affordable housing
Relatively affordable, satisfied lower middle class
Satisfied Lower Middle Income Higher Rent Costs
Suburban/Rural Satisfied, decently educated lower middle class
Struggling lower middle class with rent burden
Older white home owners, less comfortable financially
Older home owners, more financially comfortable, some diversity
Native American
Younger, poorer,single parent family Native Americans
Older, middle income Native Americans once married and Educated
Old Wealthy, White
Older, mixed race professionals
Works from home, Highly Educated, Super Wealthy
Retired Grandparents
Wealthy and Rural Living
Wealthy, Retired Mountains/Coasts
Wealthy Diverse Suburbanites On the Coasts
Retirement Communitties
Low Income African American
Urban - Inner city
Rural families
Residential institutions, young people
College towns
College town with poverty
University campus wider area
City Outskirt University Campuses
City Center University Campuses
Wealthy Nuclear Families
Lower educational attainment, Homeowner, Low rent
Younger, Long Commuter in dense neighborhood
Long commuters White black mix
Low rent in built up neighborhoods
Renters within cities, mixed income areas, White/Hispanic mix, Unmarried
Older Home owners with high income
Older home owners and very high income
White Asian Mix Big City Burbs Dwellers
Bachelors degree Mid income With Mortgages
Asian Hispanic Mix, Mid income
Bachelors degree Higher income Home Owners
Wealthy, urban, and kid-free
Wealthy city commuters
New Developments
Very wealthy, multiple million dollar homes
High rise, dense urbanites
+ + +#### Examples + +```bash +https://{username}.carto.com/api/v2/sql?q=SELECT * FROM +OBS_GetSegmentSnapshot({{point geometry}}) +``` + +###### Get the Geographic Snapshot of a Segmentation + +__Get the Segmentation Snapshot around the MGM Grand__ + + +```bash +https://{username}.carto.com/api/v2/sql?q=SELECT * FROM +OBS_GetSegmentSnapshot(CDB_LatLng(36.10222, -115.169516)) +``` + +__Get the Segmentation Snapshot at CARTO's NYC HQ__ + + +```bash +https://{username}.carto.com/api/v2/sql?q=SELECT * FROM +OBS_GetSegmentSnapshot(CDB_LatLng(40.704512, -73.936669)) +``` diff --git a/docs/support/01-quota-information.md b/docs/support/01-quota-information.md new file mode 100644 index 0000000..c52b553 --- /dev/null +++ b/docs/support/01-quota-information.md @@ -0,0 +1,135 @@ +## Quota Information + +**Based on your account plan, some of the Data Services API functions are subject to quota limitations and extra fees may apply.** View our [terms and conditions](https://carto.com/terms/), or [contact us](mailto:sales@carto.com) for details about which functions require service credits to your account. + +### Quota Consumption + +Quota consumption is calculated based on the number of request made for each function. Be mindful of the following usage recommendations when using the Data Services API functions: + +* One credit per function call will be consumed. The results are not cached. If the query is applied to a _N_ rows dataset, then _N_ credits are consumed +* Avoid running dynamic queries to these functions in your maps. This can result in credit consumption per map view. + + **Note:** Queries to the Data Services API, and any of its functions in your maps, may be forbidden in the future + +* It is advised to store results of these queries into your datasets, and refresh them as needed. This ensure more control of quota credits for your account + + +### Quota Information Functions + +There are several SQL functions that you can run to obtain quota information about your services. + +### cdb_service_quota_info() + +Returns information about per-service quotas (available and used) for the account. + +##### Returns + +This function returns a set of service quota information records, one per service. + +Name | Type | Description +--------------- | --------- | ------------ +`service` | `text` | Type of service. +`monthly_quota` | `numeric` | Quota available to the user (number of calls) per monthly period. +`used_quota` | `numeric` | Quota used by the user in the present period. +`soft_limit` | `boolean` | Set to `True`, if the user has *soft-limit* quota. +`provider` | `text` | Service provider for this type of service. + +Service Types: + +* `'isolines'` [Isoline/Isochrones (isochrone/isodistance lines) service](https://carto.com/docs/carto-engine/dataservices-api/isoline_functions/) +* `'hires_geocoder'` [Street level geocoding](https://carto.com/docs/carto-engine/dataservices-api/geocoding-functions#street-level-geocoder) +* `'routing'` [Routing functions](https://carto.com/docs/carto-engine/dataservices-api/routing_functions/) +* `'observatory'` Data Observatory services ([demographic](https://carto.com/docs/carto-engine/dataservices-api/demographic_functions/) and [segmentation](https://carto.com/docs/carto-engine/dataservices-api/segmentation_functions/) functions) + +**Notes** + +Users who have *soft-quota* activated never run out of quota, but they may incur extra +expenses when the regular quota is exceeded. + +A zero value of `monthly_quota` indicates that the service has not been activated for the user. + +##### Example + +```sql +SELECT * FROM cdb_service_quota_info(); +``` + +Result: + +```sql + service | monthly_quota | used_quota | soft_limit | provider +----------------+---------------+------------+------------+------------------ + isolines | 100 | 0 | f | mapbox + hires_geocoder | 100 | 0 | f | mapbox + routing | 50 | 0 | f | mapbox + observatory | 0 | 0 | f | data observatory +(4 rows) + +``` + +In this case, notice that the user has no access to the observatory services. All quotas are *hard-limited* (no soft limits), and no quota has been used in the present period. + +### cdb_enough_quota(service text ,input_size numeric) + +This function is useful to check if enough quota is available for completing a job. + +This is specifically relevant if a number of service calls are to be performed inside a transaction. If any of the calls fails (due to exceeded quota), the transaction will be rolled back; resulting in partial quota consumption, but no saved results from the services consumed. + +**Tip:** If you are requesting repeating quota-consuming functions (e.g. to geocode a whole table), it is extremely important to check if enough quota is available to complete the job _before_ applying this function. + +Note that some services consume more than one credit per row/call. For example, isolines (with more than one range/track) consume (N rows x M ranges) credits; indicating that the input size should be N x M. + +##### Arguments + +Name | Type | Description +------------ | --------- | ----------- +`service` | `text` | Service to check; see the list of valid services above. +`input_size` | `numeric` | Number of service calls required, i.e. size of the input to be processed. + +##### Returns + +The result is a *boolean* value. A *true* value (`'t'`) indicates that the available quota +for the service is enough for the input size requested. A *false* value (`'f'`) indicates +insufficient quota. + +##### Example + +Suppose you want to geocode a whole table. In order to check that you have enough quota, and avoid a "quota exhausted" exception, first find out how many records you need to geocode: + +```sql +SELECT COUNT(*) FROM {tablename} WHERE {street_name_column} IS NOT NULL; +``` + +Result: A sample result of 10000 records: + +```sql + count +------- + 10000 +(1 row) +``` + +The result shows how much quota is needed to complete this job. In this case, +each call to `cdb_geocode_street_point` consumes one quota credit. This indicates that we need one credit per row to geocode the whole table. + +```sql +SELECT cdb_enough_quota('hires_geocoder', {number_of_records}); +``` + +The result is similar to the following: + +```sql + cdb_enough_quota +------------------ + t +``` + +If the result of this query is *true* (`'t'`), you can safely proceed. If a *false* value (`'f'`) is returned, you should avoid processing any more requests that consume quota. Apply the `cdb_service_quota_info` function to get more information about your services. + +**Note:** Remember to apply any filtering conditions that you used to count the records (in this case, `{street_name_column} IS NOT NULL`): + + +```sql +UPDATE {tablename} SET the_geom = cdb_geocode_street_point({street_name_column}) + WHERE {street_name_column} IS NOT NULL; +``` diff --git a/docs/support/02-rate-limits.md b/docs/support/02-rate-limits.md new file mode 100644 index 0000000..115ec8d --- /dev/null +++ b/docs/support/02-rate-limits.md @@ -0,0 +1,197 @@ +## Rate limits + +Services can be rate-limited. (currently only gecoding is limited) + +The rate limits configuration can be established at server, organization or user levels, the latter having precedence over the earlier. + +The default configuration (a null or empty configuration) doesn't impose any limits. + +The configuration consist of a JSON object with two attributes: + +* `period`: the rate-limiting period, in seconds. +* `limit`: the maximum number of request in the established period. + +If a service request exceeds the configured rate limits +(i.e. if more than `limit` calls are performe in a fixed interval of +duration `period` seconds) the call will fail with an "Rate limit exceeded" error. + +### Server-side interface + +There's a server-side SQL interface to query or change the configuration. + +#### cdb_dataservices_server.cdb_service_get_rate_limit(username, orgname, service) + +This function returns the rate limit configuration for a given user and service. + +##### Returns + +The result is a JSON object with the configuration (`period` and `limit` attributes as explained above). + +#### cdb_dataservices_server.cdb_service_set_user_rate_limit(username, orgname, service, rate_limit) + +This function sets the rate limit configuration for the user. This overrides any other configuration. + +The configuration is provided as a JSON literal. To remove the user-level configuration `NULL` should be passed as the `rate_limit`. + +##### Returns + +This functions doesn't return any value. + +#### cdb_dataservices_server.cdb_service_set_org_rate_limit(username, orgname, service, rate_limit) + +This function sets the rate limit configuration for the organization. +This overrides server level configuration and is overriden by user configuration if present. + +The configuration is provided as a JSON literal. To remove the organization-level configuration `NULL` should be passed as the `rate_limit`. + +##### Returns + +This functions doesn't return any value. + +#### cdb_dataservices_server.cdb_service_set_server_rate_limit(username, orgname, service, rate_limit) + +This function sets the default rate limit configuration for all users accesing the dataservices server. This is overriden by organization of user configuration. + +The configuration is provided as a JSON literal. To remove the organization-level configuration `NULL` should be passed as the `rate_limit`. + +##### Returns + +This functions doesn't return any value. + +### Client-side interface + +For convenience there's also a client-side interface (in the client dataservices-api extension), consisting +of public functions to get the current configuration and privileged functions to change it. + +#### Public functions + +These functions are accesible to non-privileged roles, and should only be executed +using the role corresponding to a CARTO user, since that will determine the +user and organization to which the rate limits configuration applies. + +#### cdb_dataservices_client.cdb_service_get_rate_limit(service) + +This function returns the rate limit configuration in effect for the specified service +and the user corresponding to the role which makes the calls. The effective configuration +may come from any of the configuration levels (server/organization/user); only the +existing configuration with most precedence is returned. + +##### Returns + +The result is a JSON object with the configuration (`period` and `limit` attributes as explained above). + +##### Example: + +``` +SELECT cdb_dataservices_client.cdb_service_get_rate_limit('geocoder'); + + cdb_service_get_rate_limit +--------------------------------- + {"limit": 1000, "period": 86400} +(1 row) +``` + + +#### Privileged (superuser) functions + +Thes functions are not accessible by regular user roles, and the user and organization names must be provided as parameters. + +#### cdb_dataservices_client.cdb_service_set_user_rate_limit(username, orgname, service, rate_limit) + +This function sets the rate limit configuration for the user. This overrides any other configuration. + +The configuration is provided as a JSON literal. To remove the user-level configuration `NULL` should be passed as the `rate_limit`. + +##### Returns + +This functions doesn't return any value. + +##### Example + +This will configure the geocoder service rate limit for user `myusername`, a non-organization user. +The limit will be set at 1000 requests per day. Since the user doesn't belong to any organization, +`NULL` will be passed to the organization argument; otherwise the name of the user's organization should +be provided. + +Note that the name of the geocoding services is `geocoder` and not `geocoding`. + +``` +SELECT cdb_dataservices_client.cdb_service_set_user_rate_limit( + 'myusername', + NULL, + 'geocoder', + '{"limit":1000,"period":86400}' +); + + cdb_service_set_user_rate_limit +--------------------------------- + +(1 row) +``` + +#### cdb_dataservices_client.cdb_service_set_org_rate_limit(username, orgname, service, rate_limit) + +This function sets the rate limit configuration for the organization. +This overrides server level configuration and is overriden by user configuration if present. + +The configuration is provided as a JSON literal. To remove the organization-level configuration `NULL` should be passed as the `rate_limit`. + +##### Returns + +This functions doesn't return any value. + +##### Example + +This will configure the geocoder service rate limit for the `myorg` organization. +The limit will be set at 100 requests per hour. +Note that even we're setting the default configuration for the whole organization, +the name of a user of the organization must be provided for technical reasons. + +``` +SELECT cdb_dataservices_client.cdb_service_set_org_rate_limit( + 'myorgadmin', + 'myorg', + 'geocoder', + '{"limit":100,"period":3600}' +); + + + cdb_service_set_org_rate_limit +--------------------------------- + +(1 row) +``` + +#### cdb_dataservices_client.cdb_service_set_server_rate_limit(username, orgname, service, rate_limit) + +This function sets the default rate limit configuration for all users accesing the dataservices server. This is overriden by organization of user configuration. + +The configuration is provided as a JSON literal. To remove the organization-level configuration `NULL` should be passed as the `rate_limit`. + +##### Returns + +This functions doesn't return any value. + +##### Example + +This will configure the default geocoder service rate limit for all users +accesing the data-services server. +The limit will be set at 10000 requests per month. +Note that even we're setting the default configuration for the server, +the name of a user and the name of the corresponding organization (or NULL) +must be provided for technical reasons. + +``` +SELECT cdb_dataservices_client.cdb_service_set_server_rate_limit( + 'myorgadmin', + 'myorg', + 'geocoder', + '{"limit":10000,"period":108000}' +); + + + cdb_service_set_server_rate_limit +--------------------------------- + +(1 row) +``` From 140094cdde427c9f8704f98358a257c3199719e8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?I=C3=B1igo=20Medina?= Date: Fri, 13 Apr 2018 00:39:38 +0200 Subject: [PATCH 02/45] Create 02-geocoding-functions.md --- docs/guides/02-geocoding-functions.md | 348 ++++++++++++++++++++++++++ 1 file changed, 348 insertions(+) create mode 100644 docs/guides/02-geocoding-functions.md diff --git a/docs/guides/02-geocoding-functions.md b/docs/guides/02-geocoding-functions.md new file mode 100644 index 0000000..c5d2c21 --- /dev/null +++ b/docs/guides/02-geocoding-functions.md @@ -0,0 +1,348 @@ +# Geocoding Functions + +The [geocoder](https://carto.com/data/geocoder-api/) functions allow you to match your data with geometries on your map. This geocoding service can be used programatically to geocode datasets via the CARTO SQL API. It is fed from _Open Data_ and it serves geometries for countries, provinces, states, cities, postal codes, IP addresses and street addresses. CARTO provides functions for several different categories of geocoding through the Data Services API. + +_**This service is subject to quota limitations and extra fees may apply**. View the [Quota Information](https://carto.com/docs/carto-engine/dataservices-api/quota-information/) section for details and recommendations about to quota consumption._ + +The following example displays how to geocode a single country: + +```bash +https://{username}.carto.com/api/v2/sql?q=SELECT cdb_geocode_admin0_polygon('USA')&api_key={api_key} +``` + +In order to geocode an existent CARTO dataset, an SQL UPDATE statement must be used to populate the geometry column in the dataset with the results of the Data Services API. For example, if the column where you are storing the country names for each one of our rows is called `country_column`, run the following statement in order to geocode the dataset: + +```bash +https://{username}.carto.com/api/v2/sql?q=UPDATE {tablename} SET the_geom = cdb_geocode_admin0_polygon('USA')&api_key={api_key} +``` + +Notice that you can make use of Postgres or PostGIS functions in your Data Services API requests, as the result is a geometry that can be handled by the system. For example, suppose you need to retrieve the centroid of a specific country, you can wrap the resulting geometry from the geocoder functions inside the PostGIS `ST_Centroid` function: + +```bash +https://{username}.carto.com/api/v2/sql?q=UPDATE {tablename} SET the_geom = ST_Centroid(cdb_geocode_admin0_polygon('USA'))&api_key={api_key} +``` + + +The following geocoding functions are available, grouped by categories. + +## Country Geocoder + +This function geocodes your data into country border geometries. It recognizes the names of the different countries either by different synonyms (such as their English name or their endonym), or by ISO (ISO2 or ISO3) codes. + +### cdb_geocode_admin0_polygon(_country_name text_) + +Geocodes the text name of a country into a country_name geometry, displayed as polygon data. + +#### Arguments + +Name | Type | Description +--- | --- | --- +`country_name` | `text` | Name of the country + +#### Returns + +Geometry (polygon, EPSG 4326) or null + +#### Example + +##### Update the geometry of a table to geocode it + +```bash +UPDATE {tablename} SET the_geom = cdb_geocode_admin0_polygon({country_column}) +``` + +##### Insert a geocoded row into a table + +```bash +INSERT INTO {tablename} (the_geom) SELECT cdb_geocode_admin0_polygon('France') +``` + +## Level-1 Administrative Regions Geocoder + +This function geocodes your data into polygon geometries for [Level 1](https://en.wikipedia.org/wiki/Table_of_administrative_divisions_by_country), or [NUTS-1](https://en.wikipedia.org/wiki/NUTS_1_statistical_regions_of_England), administrative divisions (or units) of countries. For example, a "state" in the United States, "départements" in France, or an autonomous community in Spain. + +### cdb_geocode_admin1_polygon(_admin1_name text_) + +Geocodes the name of the province/state into a Level-1 administrative region, displayed as a polygon geometry. + +#### Arguments + +Name | Type | Description +--- | --- | --- +`admin1_name` | `text` | Name of the province/state + +#### Returns + +Geometry (polygon, EPSG 4326) or null + +#### Example + +##### Update the geometry of a table to geocode it + +```bash +UPDATE {tablename} SET the_geom = cdb_geocode_admin1_polygon({province_column}) +``` + +##### Insert a geocoded row into a table + +```bash +INSERT INTO {tablename} (the_geom) SELECT cdb_geocode_admin1_polygon('Alicante') +``` + + +### cdb_geocode_admin1_polygon(_admin1_name text, country_name text_) + +Geocodes the name of the province/state for a specified country into a Level-1 administrative region, displayed as a polygon geometry. + +#### Arguments + +Name | Type | Description +--- | --- | --- +`admin1_name` | `text` | Name of the province/state +`country_name` | `text` | Name of the country in which the province/state is located + +#### Returns + +Geometry (polygon, EPSG 4326) or null + +#### Example + +##### Update the geometry of a table to geocode it + +```bash +UPDATE {tablename} SET the_geom = cdb_geocode_admin1_polygon({province_column}, {country_column}) +``` +##### Insert a geocoded row into a table + +```bash +INSERT INTO {tablename} (the_geom) SELECT cdb_geocode_admin1_polygon('Alicante', 'Spain') +``` + + +## City Geocoder + +This function geocodes your data into point geometries for names of cities. It is recommended to use geocoding functions that require more defined parameters — this returns more accurate results when several cities have the same name. _If there are duplicate results for a city name, the city name with the highest population will be returned._ + +### cdb_geocode_namedplace_point(_city_name text_) + +Geocodes the text name of a city into a named place geometry, displayed as point data. + +#### Arguments + +Name | Type | Description +--- | --- | --- +`city_name` | `text` | Name of the city + +#### Returns + +Geometry (point, EPSG 4326) or null + +#### Example + +##### Select + +##### Update the geometry of a table to geocode it + +```bash +UPDATE {tablename} SET the_geom = cdb_geocode_namedplace_point({city_column}) +``` + +##### Insert a geocoded row into a table + +```bash +INSERT INTO {tablename} (the_geom) SELECT cdb_geocode_namedplace_point('Barcelona') +``` + + +### cdb_geocode_namedplace_point(_city_name text, country_name text_) + +Geocodes the text name of a city for a specified country into a named place point geometry. + +#### Arguments + +Name | Type | Description +--- | --- | --- +`city_name` | `text` | Name of the city +`country_name` | `text` | Name of the country in which the city is located + +#### Returns + +Geometry (point, EPSG 4326) or null + +#### Example + +##### Update the geometry of a table to geocode it + +```bash +UPDATE {tablename} SET the_geom = cdb_geocode_namedplace_point({city_column}, 'Spain') +``` + +##### Insert a geocoded row into a table + +```bash +INSERT INTO {tablename} (the_geom) SELECT cdb_geocode_namedplace_point('Barcelona', 'Spain') +``` + + +### cdb_geocode_namedplace_point(_city_name text, admin1_name text, country_name text_) + +Geocodes your data into a named place point geometry, containing the text name of a city, for a specified province/state and country. This is recommended for the most accurate geocoding of city data. +#### Arguments + +Name | Type | Description +--- | --- | --- +`city_name` | `text` | Name of the city +`admin1_name` | `text` | Name of the province/state in which the city is located +`country_name` | `text` | Name of the country in which the city is located + +#### Returns + +Geometry (point, EPSG 4326) or null + +#### Example + +##### Update the geometry of a table to geocode it + +```bash +UPDATE {tablename} SET the_geom = cdb_geocode_namedplace_point({city_column}, {province_column}, 'USA') +``` + +##### Insert a geocoded row into a table + +```bash +INSERT INTO {tablename} (the_geom) SELECT cdb_geocode_namedplace_point('New York', 'New York', 'USA') +``` + +## Postal Code Geocoder + +These functions geocode your data into point, or polygon, geometries for postal codes. The postal code geocoder covers the United States, France, Australia and Canada; a request for a different country will return an empty response. + +**Note:** For the USA, US Census Zip Code Tabulation Areas (ZCTA) are used to reference geocodes for USPS postal codes service areas. This is not a CARTO restriction, this is a US Government licensing protection of their zip code data source; which is not publicly available. Additionally, zip codes are considered service areas and are not actually geometric areas. As a solution, the US Census provides ZCTA data, which tabulates GIS postal codes for USPS locations by aggregating census blocks. For details about how ZCTAs are created, see [ZIP Code™ Tabulation Areas (ZCTAs™)](https://www.census.gov/geo/reference/zctas.html). If you are geocoding data and your zip codes fail, ensure you are using ZCTAs for the postal code. + +### cdb_geocode_postalcode_polygon(_postal_code text, country_name text_) + +Geocodes the postal code for a specified country into a **polygon** geometry. + +#### Arguments + +Name | Type | Description +--- | --- | --- +`postal_code` | `text` | Postal code +`country_name` | `text` | Name of the country in which the postal code is located + +#### Returns + +Geometry (polygon, EPSG 4326) or null + +#### Example + +##### Update the geometry of a table to geocode it + +```bash +UPDATE {tablename} SET the_geom = cdb_geocode_postalcode_polygon({postal_code_column}, 'USA') +``` + +##### Insert a geocoded row into a table + +```bash +INSERT INTO {tablename} (the_geom) SELECT cdb_geocode_postalcode_polygon('11211', 'USA') +``` + +### cdb_geocode_postalcode_point(_code text, country_name text_) + +Geocodes the postal code for a specified country into a **point** geometry. + +#### Arguments + +Name | Type | Description +--- | --- | --- +`postal_code` | `text` | Postal code +`country_name` | `text` | Name of the country in which the postal code is located + +#### Returns + +Geometry (point, EPSG 4326) or null + +#### Example + +##### Update the geometry of a table to geocode it + +```bash +UPDATE {tablename} SET the_geom = cdb_geocode_postalcode_point({postal_code_column}, 'USA') +``` + +##### Insert a geocoded row into a table + +```bash +INSERT INTO {tablename} (the_geom) SELECT cdb_geocode_postalcode_point('11211', 'USA') +``` + + +## IP Addresses Geocoder + +This function geocodes your data into point geometries for IP addresses. This is useful if you are analyzing location based data, based on a set of user's IP addresses. + +### cdb_geocode_ipaddress_point(_ip_address text_) + +Geocodes a postal code from a specified country into an IP address, displayed as a point geometry. + +#### Arguments + +Name | Type | Description +--- | --- | --- +`ip_address` | `text` | IPv4 or IPv6 address + +#### Returns + +Geometry (point, EPSG 4326) or null + +#### Example + +##### Update the geometry of a table to geocode it + +```bash +UPDATE {tablename} SET the_geom = cdb_geocode_ipaddress_point('102.23.34.1') +``` + +##### Insert a geocoded row into a table + +```bash +INSERT INTO {tablename} (the_geom) SELECT cdb_geocode_ipaddress_point('102.23.34.1') +``` + +## Street-Level Geocoder + +This function geocodes your data into a point geometry for a street address. CARTO uses several different service providers for street-level geocoding, depending on your platform. If you access CARTO on a Google Cloud Platform, [Google Maps geocoding](https://developers.google.com/maps/documentation/geocoding/intro) is applied. All other platform users are provided with [Mapbox geocoding services](https://www.mapbox.com/). [Contact us](mailto:sales@carto.com) if you have any specific questions or requirements about the location data service provider being used with your account._. + +**This service is subject to quota limitations, and extra fees may apply**. View the [Quota information](https://carto.com/docs/carto-engine/dataservices-api/quota-information/) for details and recommendations about quota consumption. + +### cdb_geocode_street_point(_search_text text, [city text], [state text], [country text]_) + +Geocodes a complete address into a single street geometry, displayed as point data. + +#### Arguments + +Name | Type | Description +--- | --- | --- | --- +`searchtext` | `text` | searchtext contains free-form text containing address elements. You can specify the searchtext parameter by itself, or with other parameters, to narrow your search. For example, you can specify the state or country parameters, along with a free-form address in the searchtext field. +`city` | `text` | (Optional) Name of the city. +`state` | `text` | (Optional) Name of the state. +`country` | `text` | (Optional) Name of the country. + +#### Returns + +Geometry (point, EPSG 4326) or null + +#### Example + +##### Update the geometry of a table to geocode it + +```bash +UPDATE {tablename} SET the_geom = cdb_geocode_street_point({street_name_column}) +``` + +##### Insert a geocoded row into a table + +```bash +INSERT INTO {tablename} (the_geom) SELECT cdb_geocode_street_point('651 Lombard Street', 'San Francisco', 'California', 'United States') +``` From 8ab24dc61158a556f456e4b1cf4608657e4c3940 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?I=C3=B1igo=20Medina?= Date: Fri, 13 Apr 2018 00:40:07 +0200 Subject: [PATCH 03/45] Create 03-isoline-functions.md --- docs/guides/03-isoline-functions.md | 104 ++++++++++++++++++++++++++++ 1 file changed, 104 insertions(+) create mode 100644 docs/guides/03-isoline-functions.md diff --git a/docs/guides/03-isoline-functions.md b/docs/guides/03-isoline-functions.md new file mode 100644 index 0000000..97949b9 --- /dev/null +++ b/docs/guides/03-isoline-functions.md @@ -0,0 +1,104 @@ +# Isoline Functions + +[Isolines](https://carto.com/data/isolines/) are contoured lines that display equally calculated levels over a given surface area. This enables you to view polygon dimensions by forward or reverse measurements. Isoline functions are calculated as the intersection of areas from the origin point, measured by distance (isodistance) or time (isochrone). For example, the distance of a road from a sidewalk. Isoline services through CARTO are available by requesting a single function in the Data Services API. + +_**This service is subject to quota limitations and extra fees may apply**. View the [Quota Information](https://carto.com/docs/carto-engine/dataservices-api/quota-information/) section for details and recommendations about to quota consumption._ + +You can use the isoline functions to retrieve, for example, isochrone lines from a certain location, specifying the mode and the ranges that will define each of the isolines. The following query calculates isolines for areas that are 5, 10 and 15 minutes (300, 600 and 900 seconds, respectively) away from the location by following a path defined by car routing and inserts them into a table. + +```bash +https://{username}.carto.com/api/v2/sql?q=INSERT INTO {table} (the_geom) SELECT the_geom FROM cdb_isodistance('POINT(-3.70568 40.42028)'::geometry, 'car', ARRAY[300, 600, 900]::integer[])&api_key={api_key} +``` + +The following functions provide an isoline generator service, based on time or distance. This service uses the isolines service defined for your account. The default service limits the usage of displayed polygons represented on top of [Mapbox](https://www.mapbox.com/) maps. + +## cdb_isodistance(_source geometry, mode text, range integer[], [options text[]]_) + +Displays a contoured line on a map, connecting geometries to a defined area, measured by an equal range of distance (in meters). + +#### Arguments + +Name | Type | Description | Accepted values +--- | --- | --- | --- +`source` | `geometry` | Source point, in 4326 projection, which defines the start location. | +`mode` | `text` | Type of transport used to calculate the isolines. | `car` or `walk` +`range` | `integer[]` | Range of the isoline, in meters. | +`options` | `text[]` | (Optional) Multiple options to add more capabilities to the analysis. See [Optional isolines parameters](#optional-isoline-parameters) for details. + + +#### Returns + +Name | Type | Description +--- | --- | --- +`center` | `geometry` | Source point, in 4326 projection, which defines the start location. +`data_range` | `integer` | The range that belongs to the generated isoline. +`the_geom` | `geometry(MultiPolygon)` | MultiPolygon geometry of the generated isoline in the 4326 projection. + +#### Examples + +##### Calculate and insert isodistance polygons from a point into another table + +```bash +INSERT INTO {table} (the_geom) SELECT the_geom FROM cdb_isodistance('POINT(-3.70568 40.42028)'::geometry, 'walk', ARRAY[300, 600, 900]::integer[]) +``` + +or equivalently: + +```bash +INSERT INTO {table} (the_geom) SELECT (cdb_isodistance('POINT(-3.70568 40.42028)'::geometry, 'walk', ARRAY[300, 600, 900]::integer[])).the_geom +``` + +##### Calculate and insert the generated isolines from `points_table` table to another table + +```bash +INSERT INTO {table} (the_geom) SELECT (cdb_isodistance(the_geom, 'walk', string_to_array(distance, ',')::integer[])).the_geom FROM {points_table} +``` + + +## cdb_isochrone(_source geometry, mode text, range integer[], [options text[]]_) + +Displays a contoured line on a map, connecting geometries to a defined area, measured by an equal range of time (in seconds). + +#### Arguments + +This function uses the same parameters and information as the `cdb_isodistance` function, with the exception that the range is measured in seconds instead of meters. + +Name | Type | Description | Accepted values +--- | --- | --- | --- +`source` | `geometry` | Source point, in 4326 projection, which defines the start location. | +`mode` | `text` | Type of transport used to calculate the isolines. | `car` or `walk` +`range` | `integer[]` | Range of the isoline, in seconds. | +`options` | `text[]` | (Optional) Multiple options to add more capabilities to the analysis. See [Optional isolines parameters](#optional-isoline-parameters) for details. + +#### Examples + +##### Calculate and insert isochrone polygons from a point into another table + +```bash +INSERT INTO {table} (the_geom) SELECT the_geom FROM cdb_isochrone('POINT(-3.70568 40.42028)'::geometry, 'car', ARRAY[300, 900, 12000]::integer[], ARRAY['mode_traffic=enabled','quality=3']::text[]) +``` + +or equivalently: + +```bash +INSERT INTO {table} (the_geom) SELECT (cdb_isochrone('POINT(-3.70568 40.42028)'::geometry, 'car', ARRAY[300, 900, 12000]::integer[], ARRAY['mode_traffic=enabled','quality=3']::text[])).the_geom +``` + +##### Calculate and insert the generated isolines from `points_table` table into another table + +```bash +INSERT INTO {table} (the_geom) SELECT (cdb_isochrone(the_geom, 'walk', string_to_array(time_distance, ',')::integer[])).the_geom FROM {points_table} +``` + +### Optional isoline parameters + +The optional value parameters must be passed using the format: `option=value`. + +Name | Type | Description | Accepted values +--- | --- | --- | --- +`is_destination` | `boolean` | If true, the source point is the destination instead of the starting location | `true` or `false`. `false` by default +`mode_type` | `text` | Type of route calculation | `shortest` or `fastest`. `shortest` by default +`mode_traffic` | `text` | Use traffic data to calculate the route | `enabled` or `disabled`. `disabled` by default +`resolution` | `text` | Allows you to specify the level of detail needed for the isoline polygon. Unit is meters per pixel. Higher resolution may increase the response time of the service. +`maxpoints` | `text` | Allows you to limit the amount of points in the returned isoline. If the isoline consists of multiple components, the sum of points from all components is considered. Each component will have at least two points. It is possible that more points than specified could be returned, in case when `2 * number of components` is higher than the `maxpoints` value itself. Increasing the number of `maxpoints` may increase the response time of the service. +`quality` | `text` | Allows you to reduce the quality of the isoline in favor of the response time. | `1`, `2`, `3`. Default value is `1`, corresponding to the best quality option. From 70232957f8a57b3548dc860d3dc3d6752906325d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?I=C3=B1igo=20Medina?= Date: Fri, 13 Apr 2018 00:40:45 +0200 Subject: [PATCH 04/45] Create 04-routing-functions.md --- docs/guides/04-routing-functions.md | 84 +++++++++++++++++++++++++++++ 1 file changed, 84 insertions(+) create mode 100644 docs/guides/04-routing-functions.md diff --git a/docs/guides/04-routing-functions.md b/docs/guides/04-routing-functions.md new file mode 100644 index 0000000..17188cd --- /dev/null +++ b/docs/guides/04-routing-functions.md @@ -0,0 +1,84 @@ +# Routing Functions + +Routing is the navigation from a defined start location to a defined end location. The calculated results are displayed as turn-by-turn directions on your map, based on the transportation mode that you specified. Routing services through CARTO are available by using the available functions in the Data Services API. + +## cdb_route_point_to_point(_origin geometry(Point), destination geometry(Point), mode text, [options text[], units text]_) + +Returns a route from origin to destination. + +#### Arguments + +Name | Type | Description | Accepted values +--- | --- | --- | --- +`origin` | `geometry(Point)` | Origin point, in 4326 projection, which defines the start location. | +`destination` | `geometry(Point)` | Destination point, in 4326 projection, which defines the end location. | +`mode` | `text` | Type of transport used to calculate the routes. | `car`, `walk`, `bicycle` or `public_transport` +`options` | `text[]` | (Optional) Multiple options to add more capabilities to the analysis. See [Optional routing parameters](#optional-routing-parameters) for details. +`units` | `text` | (Optional) Unit used to represent the length of the route. | `kilometers`, `miles`. By default is `kilometers`. This option is not supported by Mapbox provider + + +#### Returns + +Name | Type | Description +--- | --- | --- +`duration` | `integer` | Duration in seconds of the calculated route. +`length` | `real` | Length in the defined unit in the `units` field. `meters` by default . +`the_geom` | `geometry(LineString)` | LineString geometry of the calculated route in the 4326 projection. + +#### Examples + +##### Insert the values from the calculated route in your table + +```bash +INSERT INTO (duration, length, the_geom) SELECT duration, length, shape FROM cdb_route_point_to_point('POINT(-3.70237112 40.41706163)'::geometry,'POINT(-3.69909883 40.41236875)'::geometry, 'car') +``` +##### Update the geometry field with the calculated route shape + +```bash +UPDATE
SET the_geom = (SELECT shape FROM cdb_route_point_to_point('POINT(-3.70237112 40.41706163)'::geometry,'POINT(-3.69909883 40.41236875)'::geometry, 'car', ARRAY['mode_type=shortest']::text[])) +``` + +## cdb_route_with_waypoints(_waypoints geometry(Point)[], mode text, [options text[], units text]_) + +Returns a route that goes from origin to destination and whose path travels through the defined locations. + +#### Arguments + +Name | Type | Description | Accepted values +--- | --- | --- | --- +`waypoints` | `geometry(Point)[]` | Array of ordered points, in 4326 projection, which defines the origin point, one or more locations for the route path to travel through, and the destination. The first element of the array defines the origin and the last element the destination of the route. | +`mode` | `text` | Type of transport used to calculate the routes. | `car`, `walk`, `bicycle` or `public_transport` +`options` | `text[]` | (Optional) Multiple options to add more capabilities to the analysis. See [Optional routing parameters](#optional-routing-parameters) for details. +`units` | `text` | (Optional) Unit used to represent the length of the route. | `kilometers`, `miles`. By default is `kilometers`. This option is not supported by Mapbox provider + + +#### Returns + +Name | Type | Description +--- | --- | --- +`duration` | `integer` | Duration in seconds of the calculated route. +`length` | `real` | Length in the defined unit in the `units` field. `meters` by default . +`the_geom` | `geometry(LineString)` | LineString geometry of the calculated route in the 4326 projection. + +*Note*: A request to the function _cdb\_route\_with\_waypoints(waypoints geometry(Point)[], mode text, [options text[], units text])_ with only two points in the geometry array are automatically defined as origin and destination. It is equivalent to performing the following request with these two locations as parameters: _cdb\_route\_point\_to\_point(origin geometry(Point), destination geometry(Point), mode text, [options text[], units text])_. + +#### Examples + +##### Insert the values from the calculated route in your table + +```bash +INSERT INTO
(duration, length, the_geom) SELECT duration, length, shape FROM cdb_route_with_waypoints(Array['POINT(-3.7109 40.4234)'::GEOMETRY, 'POINT(-3.7059 40.4203)'::geometry, 'POINT(-3.7046 40.4180)'::geometry]::geometry[], 'walk') +``` +##### Update the geometry field with the calculated route shape + +```bash +UPDATE
SET the_geom = (SELECT shape FROM cdb_route_with_waypoints(Array['POINT(-3.7109 40.4234)'::GEOMETRY, 'POINT(-3.7059 40.4203)'::geometry, 'POINT(-3.7046 40.4180)'::geometry]::geometry[], 'car', ARRAY['mode_type=shortest']::text[])) +``` + +### Optional routing parameters + +The optional value parameters must be passed using the format: `option=value`. Not all are available for all the routing providers + +Name | Type | Description | Accepted values +--- | --- | --- | --- +`mode_type` | `text` | Type of route calculation | `shortest` (this option only applies to the car transport mode) From af81ba2cf284b1a4c6c9d65d10e6d8814bec0a3a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?I=C3=B1igo=20Medina?= Date: Fri, 13 Apr 2018 00:41:27 +0200 Subject: [PATCH 05/45] Create 05-demographic-functions.md --- docs/guides/05-demographic-functions.md | 155 ++++++++++++++++++++++++ 1 file changed, 155 insertions(+) create mode 100644 docs/guides/05-demographic-functions.md diff --git a/docs/guides/05-demographic-functions.md b/docs/guides/05-demographic-functions.md new file mode 100644 index 0000000..1f9f003 --- /dev/null +++ b/docs/guides/05-demographic-functions.md @@ -0,0 +1,155 @@ +# Demographic Functions + +The Demographic Snapshot enables you to collect demographic reports around a point location. For example, you can take the coordinates of a coffee shop and find the average population characteristics, such as total population, educational attainment, housing and income information around that location. You can use raw street addresses by combining the Demographic Snapshot with CARTO's geocoding features. If you need help creating coordinates from addresses, see the [Geocoding Functions](https://carto.com/docs/carto-engine/dataservices-api/geocoding-functions/) documentation. + +**Note:** The Demographic Snapshot functions are only available for the United States. + +## OBS_GetDemographicSnapshot( point geometry ) + +Fields returned include information about income, education, transportation, race, and more. Not all fields will have information for every coordinate queried. + +### Arguments + +Name | Description | Example Values +--- | --- | --- +point geometry | A point geometry. You can use the helper function, `CDB_LatLng` to quickly generate one from latitude and longitude | `CDB_LatLng(40.760410,-73.964242)` + +### Returns + +The Demographic Snapshot contains a broad subset of demographic measures in the Data Observatory. Over 80 measurements are returned by a single API request. For each demographic measure, the API returns the following values. + +Value | Name | Tablename | Aggregate | Type | Description +----- | ---- | --------- | --------- | ---- |------------ +The value of the measure at the point you requested | The name of the measure | The table it was drawn from | Indicated if the measure is a count or median. | postgresql | A description of the measure + +For example the "Female Population" measure returns + +```json +obs_getdemographicsnapshot: { + "value": 32.5395066379175, + "name": "Female Population", + "tablename": "obs_1a098da56badf5f32e336002b0a81708c40d29cd", + "aggregate": "sum", + "type": "Numeric", + "description": "The number of people within each geography who are female." +} +``` + +**For details, see the [Glossary of Demographic Measures](#glossary-of-demographic-measures).** + +### Examples + +```bash +https://{username}.carto.com/api/v2/sql?q=SELECT * FROM +OBS_GetDemographicSnapshot({{point geometry}}) +``` + +##### Get the Geographic Snapshot of a Demographic + +__Get the Demographic Snapshot at Camp David__ + +```bash +https://{username}.carto.com/api/v2/sql?q=SELECT * FROM +OBS_GetDemographicSnapshot(CDB_LatLng(39.648333, -77.465)) +``` + +__Get the Demographic Snapshot in the Upper West Side__ + +```bash +https://{username}.carto.com/api/v2/sql?q=SELECT * FROM +OBS_GetDemographicSnapshot(CDB_LatLng(40.80, -73.960)) +``` + +## Glossary of Demographic Measures + +This list contains the demographic measures and response names for results from the ```OBS_GetDemographicSnapshot``` function. + + Measure name | Measure Description | Response Mame | Response Units +--- | --- | --- | --- +Total Population | The total number of all people living in a given geographic area. This is a very useful catch-all denominator when calculating rates. | total_pop | Count per sq. km +Male Population | The number of people within each geography who are male. | male_pop | Count per sq. km +Female Population | The number of people within each geography who are female.| female_pop | Count per sq. km +Population not Hispanic | The number of people not identifying as Hispanic or Latino in each geography. | not_hispanic_pop | Count per sq. km +White Population | The number of people identifying as white, non-Hispanic in each geography. | white_pop | Count per sq. km +Black or African American Population| The number of people identifying as black or African American, non-Hispanic in each geography. | black_pop | Count per sq. km +American Indian and Alaska Native Population | The number of people identifying as American Indian or Alaska native in each geography.| amerindian_pop| Count per sq. km +Asian Population | The number of people identifying as Asian, non-Hispanic in each geography.| asian_pop | Count per sq. km +Other Race population | The number of people identifying as another race in each geography. | other_race_pop | Count per sq. km +Two or more races population| The number of people identifying as two or more races in each geography | two_or_more_races_pop | Count per sq. km +Hispanic Population | The number of people identifying as Hispanic or Latino in each geography. | hispanic_pop | Count per sq. km +Not a U.S. Citizen Population | The number of people within each geography who indicated that they are not U.S. citizens. | not_us_citizen_pop | Count per sq. km +Median Age | The median age of all people in a given geographic area.| median_age | Years +Children under 18 Years of Age | The number of people within each geography who are under 18 years of age.| children | Count per sq. km +Population 15 Years and Over | The number of people in a geographic area who are over the age of 15. This is used mostly as a denominator of marital status. | pop_15_and_over | Count per sq. km +Population 3 Years and Over | The total number of people in each geography age 3 years and over. This denominator is mostly used to calculate rates of school enrollment. | population_3_years_over | Count per sq. km +Population 5 Years and Over | The number of people in a geographic area who are over the age of 5. This is primarily used as a denominator of measures of language spoken at home.| pop_5_years_over | Count per sq. km +Workers over the Age of 16 | The number of people in each geography who work. Workers include those employed at private for-profit companies, the self-employed, government workers and non-profit employees. | workers_16_and_over | Count per sq. km +Workers age 16 and over who do not work from home| The number of workers over the age of 16 who do not work from home in a geographic area| commuters_16_over | Count per sq. km +Commuters by Car, Truck, or Van | The number of workers age 16 years and over within a geographic area who primarily traveled to work by car, truck or van. This is the principal mode of travel or type of conveyance, by distance rather than time, that the worker usually used to get from home to work. | commuters_by_car_truck_van | Count per sq. km +Commuters who drove alone | The number of workers age 16 years and over within a geographic area who primarily traveled by car driving alone. This is the principal mode of travel or type of conveyance, by distance rather than time, that the worker usually used to get from home to work. | commuters_drove_alone | Count per sq. km +Commuters by Carpool| The number of workers age 16 years and over within a geographic area who primarily traveled to work by carpool. This is the principal mode of travel or type of conveyance, by distance rather than time, that the worker usually used to get from home to work. | commuters_by_carpool | Count per sq. km +Commuters by Public Transportation | The number of workers age 16 years and over within a geographic area who primarily traveled to work by public transportation. This is the principal mode of travel or type of conveyance, by distance rather than time, that the worker usually used to get from home to work. | commuters_by_public_transportation | Count per sq. km | +Commuters by Bus | The number of workers age 16 years and over within a geographic area who primarily traveled to work by bus. This is the principal mode of travel or type of conveyance, by distance rather than time, that the worker usually used to get from home to work. This is a subset of workers who commuted by public transport. | commuters_by_bus| Count per sq. km +Commuters by Subway or Elevated | The number of workers age 16 years and over within a geographic area who primarily traveled to work by subway or elevated train. This is the principal mode of travel or type of conveyance, by distance rather than time, that the worker usually used to get from home to work. This is a subset of workers who commuted by public transport. | commuters_by_subway_or_elevated | Count per sq. km +Walked to Work | The number of workers age 16 years and over within a geographic area who primarily walked to work. This would mean that of any way of getting to work, they travelled the most distance walking. | walked_to_work | Count per sq. km +Worked at Home | The count within a geographical area of workers over the age of 16 who worked at home. | worked_at_home | Count per sq. km +Number of workers with less than 10 minute commute | The number of workers over the age of 16 who do not work from home and commute in less than 10 minutes in a geographic area. | commute_less_10_mins | Count per sq. km +Number of workers with a commute between 10 and 14 minutes| The number of workers over the age of 16 who do not work from home and commute in between 10 and 14 minutes in a geographic area. | commute_10_14_mins | Count per sq. km +Number of workers with a commute between 15 and 19 minutes | The number of workers over the age of 16 who do not work from home and commute in between 15 and 19 minutes in a geographic area. | commute_15_19_mins | Count per sq. km +Number of workers with a commute between 20 and 24 minutes | The number of workers over the age of 16 who do not work from home and commute in between 20 and 24 minutes in a geographic area. | commute_20_24_mins | Count per sq. km +Number of workers with a commute between 25 and 29 minutes | The number of workers over the age of 16 who do not work from home and commute in between 25 and 29 minutes in a geographic area. | commute_25_29_mins| Count per sq. km +Number of workers with a commute between 30 and 34 minutes | The number of workers over the age of 16 who do not work from home and commute in between 30 and 34 minutes in a geographic area. | commute_30_34_mins | Count per sq. km +Number of workers with a commute between 35 and 44 minutes | The number of workers over the age of 16 who do not work from home and commute in between 35 and 44 minutes in a geographic area. | commute_35_44_mins | Count per sq. km +Number of workers with a commute between 45 and 59 minutes | The number of workers over the age of 16 who do not work from home and commute in between 45 and 59 minutes in a geographic area. | commute_45_59_mins | Count per sq. km +Number of workers with a commute of over 60 minutes | The number of workers over the age of 16 who do not work from home and commute in over 60 minutes in a geographic area.| commute_60_more_mins | Count per sq. km +Aggregate travel time to work | The total number of minutes every worker over the age of 16 who did not work from home spent spent commuting to work in one day in a geographic area. | aggregate_travel_time_to_work | Minutes +Households | A count of the number of households in each geography. A household consists of one or more people who live in the same dwelling and also share at meals or living accommodation, and may consist of a single family or some other grouping of people. | households | Count per sq. km +Never Married | The number of people in a geographic area who have never been married. | pop_never_married | Count per sq. km +Currently married| The number of people in a geographic area who are currently married. | pop_now_married | Count per sq. km +Married but separated | The number of people in a geographic area who are married but separated.| pop_separated | Count per sq. km +Widowed | The number of people in a geographic area who are widowed.| pop_widowed | Count per sq. km +Divorced | The number of people in a geographic area who are divorced. | pop_divorced | Count per sq. km +Students Enrolled in School | The total number of people in each geography currently enrolled at any level of school, from nursery or pre-school to advanced post-graduate education. Only includes those over the age of 3. | in_school | Count per sq. km +Students Enrolled in Grades 1 to 4 | The total number of people in each geography currently enrolled in grades 1 through 4 inclusive. This corresponds roughly to elementary school. | in_grades_1_to_4 | Count per sq. km +Students Enrolled in Grades 5 to 8 | The total number of people in each geography currently enrolled in grades 5 through 8 inclusive. This corresponds roughly to middle school. | in_grades_5_to_8 | Count per sq. km +Students Enrolled in Grades 9 to 12 | The total number of people in each geography currently enrolled in grades 9 through 12 inclusive. This corresponds roughly to high school. | in_grades_9_to_12 | Count per sq. km +Students Enrolled as Undergraduate in College | The number of people in a geographic area who are enrolled in college at the undergraduate level. Enrollment refers to being registered or listed as a student in an educational program leading to a college degree. This may be a public school or college, a private school or college. | in_undergrad_college | Count per sq. km +Population 25 Years and Over | The number of people in a geographic area who are over the age of 25. This is used mostly as a denominator of educational attainment. | pop_25_years_over | Count per sq. km +Population Completed High School | The number of people in a geographic area over the age of 25 who completed high school, and did not complete a more advanced degree. | high_school_diploma| Count per sq. km +Population completed less than one year of college, no degree | The number of people in a geographic area over the age of 25 who attended college for less than one year and no further. | less_one_year_college | Count per sq. km +Population completed more than one year of college, no degree | The number of people in a geographic area over the age of 25 who attended college for more than one year but did not obtain a degree. | one_year_more_college | Count per sq. km +Population Completed Associate's Degree | The number of people in a geographic area over the age of 25 who obtained a associate's degree, and did not complete a more advanced degree.| associates_degree | Count per sq. km +Population Completed Bachelor's Degree| The number of people in a geographic area over the age of 25 who obtained a bachelor's degree, and did not complete a more advanced degree. | bachelors_degree| Count per sq. km +Population Completed Master's Degree | The number of people in a geographic area over the age of 25 who obtained a master's degree, but did not complete a more advanced degree. | masters_degree | Count per sq. km +Speaks only English at Home | The number of people in a geographic area over age 5 who speak only English at home. | speak_only_english_at_home | Count per sq. km +Speaks Spanish at Home | The number of people in a geographic area over age 5 who speak Spanish at home, possibly in addition to other languages. | speak_spanish_at_home | Count per sq. km +Population for Whom Poverty Status Determined | The number of people in each geography who could be identified as either living in poverty or not. This should be used as the denominator when calculating poverty rates, as it excludes people for whom it was not possible to determine poverty. | pop_determined_poverty_status | Count per sq. km +Income In The Past 12 Months Below Poverty Level | The number of people in a geographic area who are part of a family (which could be just them as an individual) determined to be "in poverty" following the [Office of Management and Budget's Directive 14](https://www.census.gov/hhes/povmeas/methodology/ombdir14.html). | poverty | Count per sq. km +Households with income less than $10,000 | The number of households in a geographic area whose annual income was less than $10,000. | income_less_10000 | Count per sq. km +Households with income of $10,000 to $14,999 | The number of households in a geographic area whose annual income was between $10,000 and $14,999. | income_10000_14999 | Count per sq. km +Households with income of $15,000 to $19,999 | The number of households in a geographic area whose annual income was between $15,000 and $19,999. | income_15000_19999 | Count per sq. km +Households with income of $20,000 To $24,999 | The number of households in a geographic area whose annual income was between $20,000 and $24,999. | income_20000_24999 | Count per sq. km +Households with income of $25,000 To $29,999 | The number of households in a geographic area whose annual income was between $20,000 and $24,999. | income_25000_29999 | Count per sq. km +Households with income of $30,000 To $34,999 | The number of households in a geographic area whose annual income was between $30,000 and $34,999. | income_30000_34999 | Count per sq. km +Households with income of $35,000 To $39,999 | The number of households in a geographic area whose annual income was between $35,000 and $39,999. | income_35000_39999 | Count per sq. km +Households with income of $40,000 To $44,999 | The number of households in a geographic area whose annual income was between $40,000 and $44,999. | income_40000_44999| Count per sq. km +Households with income of $45,000 To $49,999 | The number of households in a geographic area whose annual income was between $45,000 and $49,999. | income_45000_49999 | Count per sq. km +Households with income of $50,000 To $59,999 | The number of households in a geographic area whose annual income was between $50,000 and $59,999. | income_50000_59999 | Count per sq. km +Households with income of $60,000 To $74,999 | The number of households in a geographic area whose annual income was between $60,000 and $74,999. | income_60000_74999 | Count per sq. km +Households with income of $75,000 To $99,999 | The number of households in a geographic area whose annual income was between $75,000 and $99,999. | income_75000_99999 | Count per sq. km +Households with income of $100,000 To $124,999 | The number of households in a geographic area whose annual income was between $100,000 and $124,999. | income_100000_124999 | Count per sq. km +Households with income of $125,000 To $149,999 | The number of households in a geographic area whose annual income was between $125,000 and $149,999. | income_125000_149999 | Count per sq. km +Households with income of $150,000 To $199,999 | The number of households in a geographic area whose annual income was between $150,000 and $1999,999. | income_150000_199999 | Count per sq. km +Households with income of $200,000 Or More | The number of households in a geographic area whose annual income was more than $200,000. | income_200000_or_more | Count per sq. km +Median Household Income in the past 12 Months | Within a geographic area, the median income received by every household on a regular basis before payments for personal income taxes, social security, union dues, medicare deductions, etc. It includes income received from wages, salary, commissions, bonuses, and tips; self-employment income from own nonfarm or farm businesses, including proprietorships and partnerships; interest, dividends, net rental income, royalty income, or income from estates and trusts; Social Security or Railroad Retirement income; Supplemental Security Income (SSI); any cash public assistance or welfare payments from the state or local welfare office; retirement, survivor, or disability benefits; and any other sources of income received regularly such as Veterans' (VA) payments, unemployment and/or worker's compensation, child support, and alimony. | median_income | USD +Per Capita Income in the past 12 Months | | income_per_capita | USD +Gini Index | A measurement of the income distribution of a country's residents. | gini_index | None +Housing Units | A count of housing units in each geography. A housing unit is a house, an apartment, a mobile home or trailer, a group of rooms, or a single room occupied as separate living quarters, or if vacant, intended for occupancy as separate living quarters. | housing_units | Count per sq. km +Vacant Housing Units | The count of vacant housing units in a geographic area. A housing unit is vacant if no one is living in it at the time of enumeration, unless its occupants are only temporarily absent. Units temporarily occupied at the time of enumeration entirely by people who have a usual residence elsewhere are also classified as vacant. | vacant_housing_units | Count per sq. km +Vacant Housing Units for Rent | The count of vacant housing units in a geographic area that are for rent. A housing unit is vacant if no one is living in it at the time of enumeration, unless its occupants are only temporarily absent. Units temporarily occupied at the time of enumeration entirely by people who have a usual residence elsewhere are also classified as vacant. | vacant_housing_units_for_rent | Count per sq. km +Vacant Housing Units for Sale| The count of vacant housing units in a geographic area that are for sale. A housing unit is vacant if no one is living in it at the time of enumeration, unless its occupants are only temporarily absent. Units temporarily occupied at the time of enumeration entirely by people who have a usual residence elsewhere are also classified as vacant. | vacant_housing_units_for_sale | Count per sq. km +Owner-occupied Housing Units | The count of owner occupied housing units in a geographic area. | owner_occupied_housing_units | Count per sq. km +Owner-occupied Housing Units valued at $1,000,000 or more. | The count of owner occupied housing units in a geographic area that are valued at $1,000,000 or more. Value is the respondent's estimate of how much the property (house and lot, mobile home and lot, or condominium unit) would sell for if it were for sale. | million_dollar_housing_units | Count per sq. km +Owner-occupied Housing Units with a Mortgage | The count of housing units within a geographic area that are mortagaged. "Mortgage" refers to all forms of debt where the property is pledged as security for repayment of the debt, including deeds of trust, trust deed, contracts to purchase, land contracts, junior mortgages, and home equity loans. | mortgaged_housing_units | Count per sq. km +Median Rent | The median contract rent within a geographic area. The contract rent is the monthly rent agreed to or contracted for, regardless of any furnishings, utilities, fees, meals, or services that may be included. For vacant units, it is the monthly rent asked for the rental unit at the time of interview.| median_rent | USD +Percent of Household Income Spent on Rent | Within a geographic area, the median percentage of household income which was spent on gross rent. Gross rent is the amount of the contract rent plus the estimated average monthly cost of utilities (electricity, gas, water, sewer etc.) and fuels (oil, coal, wood, etc.) if these are paid by the renter. Household income is the sum of the income of all people 15 years and older living in the household. | percent_income_spent_on_rent | Percent From 5a3fcec664c755f6d5705e48faaa05b7ab066e26 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?I=C3=B1igo=20Medina?= Date: Fri, 13 Apr 2018 00:41:53 +0200 Subject: [PATCH 06/45] Create 06-segmentation-functions.md --- docs/guides/06-segmentation-functions.md | 181 +++++++++++++++++++++++ 1 file changed, 181 insertions(+) create mode 100644 docs/guides/06-segmentation-functions.md diff --git a/docs/guides/06-segmentation-functions.md b/docs/guides/06-segmentation-functions.md new file mode 100644 index 0000000..ec11c59 --- /dev/null +++ b/docs/guides/06-segmentation-functions.md @@ -0,0 +1,181 @@ +# Segmentation Functions + +The Segmentation Snapshot functions enable you to determine the pre-calculated population segment for a location. Segmentation is a method that divides a populations into subclassifications based on common traits. For example, you can take the a store location and determine what classification of population exists around that location. If you need help creating coordinates from addresses, see the [Geocoding Functions](https://carto.com/docs/carto-engine/dataservices-api/geocoding-functions/) documentation. + +_**Note:** The Segmentation Snapshot functions are only available for the United States. Our first release (May 18, 2016) is derived from Census 2010 variables. Our next release will be based on Census 2014 data. For the latest information, see the [Open Segments](https://github.com/CartoDB/open-segments) project repository._ + +## OBS_GetSegmentSnapshot( Point Geometry ) + +### Arguments + +Name | Description | Example Values +--- | --- | --- +point geometry | A point geometry. You can use the helper function, `CDB_LatLng` to quickly generate one from latitude and longitude | `CDB_LatLng(40.760410,-73.964242)` + +### Returns + +The segmentation function returns two segment levels for the point you requests, the x10\_segment and x55\_segment. These segmentation levels contain different classifications of population within with each segment. The function also returns the quantile of a number of census variables. For example, if total_poulation is at 90% quantile level then this tract has a higher total population than 90% of the other tracts. + +Name | Type | Description +---- | ---- | ----------- +x10\_segment | text | The demographic segment location at the 10 segment level, containing populations at high-levels, broken down into 10 broad categories +x55\_segment | text | The demographic segment location at the 55 segment level, containing more granular sub-levels to categorize the population + +An example response appears as follows: + +```json +obs_getsegmentsnapshot: { + "x10_segment": "Wealthy, urban without Kids", + "x55_segment": "Wealthy city commuters", + "us.census.acs.B01001001_quantile": "0.0180540540540541", + "us.census.acs.B01001002_quantile": "0.0279864864864865", + "us.census.acs.B01001026_quantile": "0.016527027027027", + "us.census.acs.B01002001_quantile": "0.507297297297297", + "us.census.acs.B03002003_quantile": "0.133162162162162", + "us.census.acs.B03002004_quantile": "0.283743243243243", + "us.census.acs.B03002006_quantile": "0.683945945945946", + "us.census.acs.B03002012_quantile": "0.494594594594595", + "us.census.acs.B05001006_quantile": "0.670972972972973", + "us.census.acs.B08006001_quantile": "0.0607567567567568", + "us.census.acs.B08006002_quantile": "0.0684324324324324", + "us.census.acs.B08006008_quantile": "0.565135135135135", + "us.census.acs.B08006009_quantile": "0.638081081081081", + "us.census.acs.B08006011_quantile": "0", + "us.census.acs.B08006015_quantile": "0.900932432432432", + "us.census.acs.B08006017_quantile": "0.186648648648649", + "us.census.acs.B09001001_quantile": "0.0193513513513514", + "us.census.acs.B11001001_quantile": "0.0617972972972973", + "us.census.acs.B14001001_quantile": "0.0179594594594595", + "us.census.acs.B14001002_quantile": "0.0140405405405405", + "us.census.acs.B14001005_quantile": "0", + "us.census.acs.B14001006_quantile": "0", + "us.census.acs.B14001007_quantile": "0", + "us.census.acs.B14001008_quantile": "0.0609054054054054", + "us.census.acs.B15003001_quantile": "0.0314594594594595", + "us.census.acs.B15003017_quantile": "0.0403378378378378", + "us.census.acs.B15003022_quantile": "0.285972972972973", + "us.census.acs.B15003023_quantile": "0.214567567567568", + "us.census.acs.B16001001_quantile": "0.0181621621621622", + "us.census.acs.B16001002_quantile": "0.0463108108108108", + "us.census.acs.B16001003_quantile": "0.540540540540541", + "us.census.acs.B17001001_quantile": "0.0237567567567568", + "us.census.acs.B17001002_quantile": "0.155972972972973", + "us.census.acs.B19013001_quantile": "0.380662162162162", + "us.census.acs.B19083001_quantile": "0.986891891891892", + "us.census.acs.B19301001_quantile": "0.989594594594595", + "us.census.acs.B25001001_quantile": "0.998418918918919", + "us.census.acs.B25002003_quantile": "0.999824324324324", + "us.census.acs.B25004002_quantile": "0.999986486486486", + "us.census.acs.B25004004_quantile": "0.999662162162162", + "us.census.acs.B25058001_quantile": "0.679054054054054", + "us.census.acs.B25071001_quantile": "0.569716216216216", + "us.census.acs.B25075001_quantile": "0.0415", + "us.census.acs.B25075025_quantile": "0.891702702702703" +} +``` + +The possible segments are: + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
X10 segment X55 Segment
Hispanic and kids
Middle Class, Educated, Suburban, Mixed Race
Low Income on Urban Periphery
Suburban, Young and Low-income
low-income, urban, young, unmarried
Low education, mainly suburban
Young, working class and rural
Low-Income with gentrification
Low Income and Diverse
High school education Long Commuters, Black, White Hispanic mix
Rural, Bachelors or college degree, Rent owned mix
Rural,High School Education, Owns property
Young, City based renters in Sparse neighborhoods, Low poverty
Low income, minority mix
Predominantly black, high high school attainment, home owners
White and minority mix multilingual, mixed income / education. Married
Hispanic Black mix multilingual, high poverty, renters, uses public transport
Predominantly black renters, rent own mix
Middle income, single family homes
Lower Middle Income with higher rent burden
Black and mixed community with rent burden
Lower Middle Income with affordable housing
Relatively affordable, satisfied lower middle class
Satisfied Lower Middle Income Higher Rent Costs
Suburban/Rural Satisfied, decently educated lower middle class
Struggling lower middle class with rent burden
Older white home owners, less comfortable financially
Older home owners, more financially comfortable, some diversity
Native American
Younger, poorer,single parent family Native Americans
Older, middle income Native Americans once married and Educated
Old Wealthy, White
Older, mixed race professionals
Works from home, Highly Educated, Super Wealthy
Retired Grandparents
Wealthy and Rural Living
Wealthy, Retired Mountains/Coasts
Wealthy Diverse Suburbanites On the Coasts
Retirement Communitties
Low Income African American
Urban - Inner city
Rural families
Residential institutions, young people
College towns
College town with poverty
University campus wider area
City Outskirt University Campuses
City Center University Campuses
Wealthy Nuclear Families
Lower educational attainment, Homeowner, Low rent
Younger, Long Commuter in dense neighborhood
Long commuters White black mix
Low rent in built up neighborhoods
Renters within cities, mixed income areas, White/Hispanic mix, Unmarried
Older Home owners with high income
Older home owners and very high income
White Asian Mix Big City Burbs Dwellers
Bachelors degree Mid income With Mortgages
Asian Hispanic Mix, Mid income
Bachelors degree Higher income Home Owners
Wealthy, urban, and kid-free
Wealthy city commuters
New Developments
Very wealthy, multiple million dollar homes
High rise, dense urbanites
+ + +### Examples + +```bash +https://{username}.carto.com/api/v2/sql?q=SELECT * FROM +OBS_GetSegmentSnapshot({{point geometry}}) +``` + +##### Get the Geographic Snapshot of a Segmentation + +__Get the Segmentation Snapshot around the MGM Grand__ + + +```bash +https://{username}.carto.com/api/v2/sql?q=SELECT * FROM +OBS_GetSegmentSnapshot(CDB_LatLng(36.10222, -115.169516)) +``` + +__Get the Segmentation Snapshot at CARTO's NYC HQ__ + + +```bash +https://{username}.carto.com/api/v2/sql?q=SELECT * FROM +OBS_GetSegmentSnapshot(CDB_LatLng(40.704512, -73.936669)) +``` From 6606d2698484e99122c662759ebf8a6142aa9275 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?I=C3=B1igo=20Medina?= Date: Fri, 13 Apr 2018 00:42:17 +0200 Subject: [PATCH 07/45] Create 07-quota-information.md --- docs/guides/07-quota-information.md | 135 ++++++++++++++++++++++++++++ 1 file changed, 135 insertions(+) create mode 100644 docs/guides/07-quota-information.md diff --git a/docs/guides/07-quota-information.md b/docs/guides/07-quota-information.md new file mode 100644 index 0000000..7ffd4db --- /dev/null +++ b/docs/guides/07-quota-information.md @@ -0,0 +1,135 @@ +# Quota Information + +**Based on your account plan, some of the Data Services API functions are subject to quota limitations and extra fees may apply.** View our [terms and conditions](https://carto.com/terms/), or [contact us](mailto:sales@carto.com) for details about which functions require service credits to your account. + +## Quota Consumption + +Quota consumption is calculated based on the number of request made for each function. Be mindful of the following usage recommendations when using the Data Services API functions: + +* One credit per function call will be consumed. The results are not cached. If the query is applied to a _N_ rows dataset, then _N_ credits are consumed +* Avoid running dynamic queries to these functions in your maps. This can result in credit consumption per map view. + + **Note:** Queries to the Data Services API, and any of its functions in your maps, may be forbidden in the future + +* It is advised to store results of these queries into your datasets, and refresh them as needed. This ensure more control of quota credits for your account + + +## Quota Information Functions + +There are several SQL functions that you can run to obtain quota information about your services. + +## cdb_service_quota_info() + +Returns information about per-service quotas (available and used) for the account. + +#### Returns + +This function returns a set of service quota information records, one per service. + +Name | Type | Description +--------------- | --------- | ------------ +`service` | `text` | Type of service. +`monthly_quota` | `numeric` | Quota available to the user (number of calls) per monthly period. +`used_quota` | `numeric` | Quota used by the user in the present period. +`soft_limit` | `boolean` | Set to `True`, if the user has *soft-limit* quota. +`provider` | `text` | Service provider for this type of service. + +Service Types: + +* `'isolines'` [Isoline/Isochrones (isochrone/isodistance lines) service](https://carto.com/docs/carto-engine/dataservices-api/isoline_functions/) +* `'hires_geocoder'` [Street level geocoding](https://carto.com/docs/carto-engine/dataservices-api/geocoding-functions#street-level-geocoder) +* `'routing'` [Routing functions](https://carto.com/docs/carto-engine/dataservices-api/routing_functions/) +* `'observatory'` Data Observatory services ([demographic](https://carto.com/docs/carto-engine/dataservices-api/demographic_functions/) and [segmentation](https://carto.com/docs/carto-engine/dataservices-api/segmentation_functions/) functions) + +**Notes** + +Users who have *soft-quota* activated never run out of quota, but they may incur extra +expenses when the regular quota is exceeded. + +A zero value of `monthly_quota` indicates that the service has not been activated for the user. + +#### Example + +```sql +SELECT * FROM cdb_service_quota_info(); +``` + +Result: + +```sql + service | monthly_quota | used_quota | soft_limit | provider +----------------+---------------+------------+------------+------------------ + isolines | 100 | 0 | f | mapbox + hires_geocoder | 100 | 0 | f | mapbox + routing | 50 | 0 | f | mapbox + observatory | 0 | 0 | f | data observatory +(4 rows) + +``` + +In this case, notice that the user has no access to the observatory services. All quotas are *hard-limited* (no soft limits), and no quota has been used in the present period. + +## cdb_enough_quota(service text ,input_size numeric) + +This function is useful to check if enough quota is available for completing a job. + +This is specifically relevant if a number of service calls are to be performed inside a transaction. If any of the calls fails (due to exceeded quota), the transaction will be rolled back; resulting in partial quota consumption, but no saved results from the services consumed. + +**Tip:** If you are requesting repeating quota-consuming functions (e.g. to geocode a whole table), it is extremely important to check if enough quota is available to complete the job _before_ applying this function. + +Note that some services consume more than one credit per row/call. For example, isolines (with more than one range/track) consume (N rows x M ranges) credits; indicating that the input size should be N x M. + +#### Arguments + +Name | Type | Description +------------ | --------- | ----------- +`service` | `text` | Service to check; see the list of valid services above. +`input_size` | `numeric` | Number of service calls required, i.e. size of the input to be processed. + +#### Returns + +The result is a *boolean* value. A *true* value (`'t'`) indicates that the available quota +for the service is enough for the input size requested. A *false* value (`'f'`) indicates +insufficient quota. + +#### Example + +Suppose you want to geocode a whole table. In order to check that you have enough quota, and avoid a "quota exhausted" exception, first find out how many records you need to geocode: + +```sql +SELECT COUNT(*) FROM {tablename} WHERE {street_name_column} IS NOT NULL; +``` + +Result: A sample result of 10000 records: + +```sql + count +------- + 10000 +(1 row) +``` + +The result shows how much quota is needed to complete this job. In this case, +each call to `cdb_geocode_street_point` consumes one quota credit. This indicates that we need one credit per row to geocode the whole table. + +```sql +SELECT cdb_enough_quota('hires_geocoder', {number_of_records}); +``` + +The result is similar to the following: + +```sql + cdb_enough_quota +------------------ + t +``` + +If the result of this query is *true* (`'t'`), you can safely proceed. If a *false* value (`'f'`) is returned, you should avoid processing any more requests that consume quota. Apply the `cdb_service_quota_info` function to get more information about your services. + +**Note:** Remember to apply any filtering conditions that you used to count the records (in this case, `{street_name_column} IS NOT NULL`): + + +```sql +UPDATE {tablename} SET the_geom = cdb_geocode_street_point({street_name_column}) + WHERE {street_name_column} IS NOT NULL; +``` From 38a2c3d0632cd46f3699d643e011bde8e4f7b804 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?I=C3=B1igo=20Medina?= Date: Fri, 13 Apr 2018 00:43:30 +0200 Subject: [PATCH 08/45] Delete 07-quota-information.md --- docs/guides/07-quota-information.md | 135 ---------------------------- 1 file changed, 135 deletions(-) delete mode 100644 docs/guides/07-quota-information.md diff --git a/docs/guides/07-quota-information.md b/docs/guides/07-quota-information.md deleted file mode 100644 index 7ffd4db..0000000 --- a/docs/guides/07-quota-information.md +++ /dev/null @@ -1,135 +0,0 @@ -# Quota Information - -**Based on your account plan, some of the Data Services API functions are subject to quota limitations and extra fees may apply.** View our [terms and conditions](https://carto.com/terms/), or [contact us](mailto:sales@carto.com) for details about which functions require service credits to your account. - -## Quota Consumption - -Quota consumption is calculated based on the number of request made for each function. Be mindful of the following usage recommendations when using the Data Services API functions: - -* One credit per function call will be consumed. The results are not cached. If the query is applied to a _N_ rows dataset, then _N_ credits are consumed -* Avoid running dynamic queries to these functions in your maps. This can result in credit consumption per map view. - - **Note:** Queries to the Data Services API, and any of its functions in your maps, may be forbidden in the future - -* It is advised to store results of these queries into your datasets, and refresh them as needed. This ensure more control of quota credits for your account - - -## Quota Information Functions - -There are several SQL functions that you can run to obtain quota information about your services. - -## cdb_service_quota_info() - -Returns information about per-service quotas (available and used) for the account. - -#### Returns - -This function returns a set of service quota information records, one per service. - -Name | Type | Description ---------------- | --------- | ------------ -`service` | `text` | Type of service. -`monthly_quota` | `numeric` | Quota available to the user (number of calls) per monthly period. -`used_quota` | `numeric` | Quota used by the user in the present period. -`soft_limit` | `boolean` | Set to `True`, if the user has *soft-limit* quota. -`provider` | `text` | Service provider for this type of service. - -Service Types: - -* `'isolines'` [Isoline/Isochrones (isochrone/isodistance lines) service](https://carto.com/docs/carto-engine/dataservices-api/isoline_functions/) -* `'hires_geocoder'` [Street level geocoding](https://carto.com/docs/carto-engine/dataservices-api/geocoding-functions#street-level-geocoder) -* `'routing'` [Routing functions](https://carto.com/docs/carto-engine/dataservices-api/routing_functions/) -* `'observatory'` Data Observatory services ([demographic](https://carto.com/docs/carto-engine/dataservices-api/demographic_functions/) and [segmentation](https://carto.com/docs/carto-engine/dataservices-api/segmentation_functions/) functions) - -**Notes** - -Users who have *soft-quota* activated never run out of quota, but they may incur extra -expenses when the regular quota is exceeded. - -A zero value of `monthly_quota` indicates that the service has not been activated for the user. - -#### Example - -```sql -SELECT * FROM cdb_service_quota_info(); -``` - -Result: - -```sql - service | monthly_quota | used_quota | soft_limit | provider -----------------+---------------+------------+------------+------------------ - isolines | 100 | 0 | f | mapbox - hires_geocoder | 100 | 0 | f | mapbox - routing | 50 | 0 | f | mapbox - observatory | 0 | 0 | f | data observatory -(4 rows) - -``` - -In this case, notice that the user has no access to the observatory services. All quotas are *hard-limited* (no soft limits), and no quota has been used in the present period. - -## cdb_enough_quota(service text ,input_size numeric) - -This function is useful to check if enough quota is available for completing a job. - -This is specifically relevant if a number of service calls are to be performed inside a transaction. If any of the calls fails (due to exceeded quota), the transaction will be rolled back; resulting in partial quota consumption, but no saved results from the services consumed. - -**Tip:** If you are requesting repeating quota-consuming functions (e.g. to geocode a whole table), it is extremely important to check if enough quota is available to complete the job _before_ applying this function. - -Note that some services consume more than one credit per row/call. For example, isolines (with more than one range/track) consume (N rows x M ranges) credits; indicating that the input size should be N x M. - -#### Arguments - -Name | Type | Description ------------- | --------- | ----------- -`service` | `text` | Service to check; see the list of valid services above. -`input_size` | `numeric` | Number of service calls required, i.e. size of the input to be processed. - -#### Returns - -The result is a *boolean* value. A *true* value (`'t'`) indicates that the available quota -for the service is enough for the input size requested. A *false* value (`'f'`) indicates -insufficient quota. - -#### Example - -Suppose you want to geocode a whole table. In order to check that you have enough quota, and avoid a "quota exhausted" exception, first find out how many records you need to geocode: - -```sql -SELECT COUNT(*) FROM {tablename} WHERE {street_name_column} IS NOT NULL; -``` - -Result: A sample result of 10000 records: - -```sql - count -------- - 10000 -(1 row) -``` - -The result shows how much quota is needed to complete this job. In this case, -each call to `cdb_geocode_street_point` consumes one quota credit. This indicates that we need one credit per row to geocode the whole table. - -```sql -SELECT cdb_enough_quota('hires_geocoder', {number_of_records}); -``` - -The result is similar to the following: - -```sql - cdb_enough_quota ------------------- - t -``` - -If the result of this query is *true* (`'t'`), you can safely proceed. If a *false* value (`'f'`) is returned, you should avoid processing any more requests that consume quota. Apply the `cdb_service_quota_info` function to get more information about your services. - -**Note:** Remember to apply any filtering conditions that you used to count the records (in this case, `{street_name_column} IS NOT NULL`): - - -```sql -UPDATE {tablename} SET the_geom = cdb_geocode_street_point({street_name_column}) - WHERE {street_name_column} IS NOT NULL; -``` From 5f2a0bb7dd16bd38a93fe12db4c4dd20e31e0e19 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?I=C3=B1igo=20Medina?= Date: Fri, 13 Apr 2018 00:44:22 +0200 Subject: [PATCH 09/45] Create 01-support-options.md --- docs/support/01-support-options.md | 36 ++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 docs/support/01-support-options.md diff --git a/docs/support/01-support-options.md b/docs/support/01-support-options.md new file mode 100644 index 0000000..768a374 --- /dev/null +++ b/docs/support/01-support-options.md @@ -0,0 +1,36 @@ +## Support Options + +Feeling stuck? There are many ways to find help. + +* Ask a question on [GIS StackExchange](https://gis.stackexchange.com/questions/tagged/carto) using the `CARTO` tag. +* [Report an issue](https://github.com/CartoDB/cartodb/issues) in Github. +* Engine Plan customers have additional access to enterprise-level support through CARTO's support representatives. + +If you just want to describe an issue or share an idea, just + +### Issues on Github + +If you think you may have found a bug, or if you have a feature request that you would like to share with the Data Services API team, please [open an issue](https://github.com/CartoDB/cartodb/issues/new). + +Before opening an issue, review the [contributing guidelines](https://github.com/CartoDB/cartodb/blob/master/CONTRIBUTING.md). + + +### Community support on GIS Stack Exchange + +GIS Stack Exchange is the most popular community in the geospatial industry. This is a collaboratively-edited question and answer site for geospatial programmers and technicians. It is a fantastic resource for asking technical questions about developing and maintaining your application. + + +When posting a new question, please consider the following: + +* Read the GIS Stack Exchange [help](https://gis.stackexchange.com/help) and [how to ask](https://gis.stackexchange.com/help/how-to-ask) pages for guidelines and tips about posting questions. +* Be very clear about your question in the subject. A clear explanation helps those trying to answer your question, as well as those who may be looking for information in the future. +* Be informative in your post. Details, code snippets, logs, screenshots, etc. help others to understand your problem. +* Use code that demonstrates the problem. It is very hard to debug errors without sample code to reproduce the problem. + +### Engine Plan Customers + +Engine Plan customers have additional support options beyond general community support. As per your account Terms of Service, you have access to enterprise-level support through CARTO's support representatives available at [enterprise-support@carto.com](mailto:enterprise-support@carto.com) + +In order to speed up the resolution of your issue, provide as much information as possible (even if it is a link from community support). This allows our engineers to investigate your problem as soon as possible. + +If you are not yet CARTO customer, browse our [plans & pricing](https://carto.com/pricing/) and find the right plan for you. From 89ee3ff8fb755afe554663dae378515bb80c33a1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?I=C3=B1igo=20Medina?= Date: Fri, 13 Apr 2018 00:45:12 +0200 Subject: [PATCH 10/45] Create 02-contribute.md --- docs/support/02-contribute.md | 36 +++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 docs/support/02-contribute.md diff --git a/docs/support/02-contribute.md b/docs/support/02-contribute.md new file mode 100644 index 0000000..9b62d4f --- /dev/null +++ b/docs/support/02-contribute.md @@ -0,0 +1,36 @@ +## Contribute + +CARTO platform is an open-source ecosystem. You can read about the [fundamentals]({{site.fundamental_docs}}/components/) of CARTO architecture and its components. +We are more than happy to receive your contributions to the code and the documentation as well. + +## Filling a ticket + +If you want to open a new issue in our repository, please follow these instructions: + +1. Descriptive title. +2. Write a good description, it always helps. +3. Specify the steps to reproduce the problem. +4. Try to add an example showing the problem. + +## Contributing code + +Best part of open source, collaborate in Data Services API code!. We like hearing from you, so if you have any bug fixed, or a new feature ready to be merged, those are the steps you should follow: + +1. Fork the repository. +2. Create a new branch in your forked repository. +3. Commit your changes. Add new tests if it is necessary. +4. Open a pull request. +5. Any of the maintainers will take a look. +6. If everything works, it will merged and released \o/. + +If you want more detailed information, this [GitHub guide](https://guides.github.com/activities/contributing-to-open-source/) is a must. + +## Completing documentation + +Data Services API documentation is located in ```docs/```. That folder is the content that appears in the [Developer Center](http://carto.com/developer-center/data-services-api/). Just follow the instructions described in [contributing code](#contributing-code) and after accepting your pull request, we will make it appear online :). + +**Tip:** A convenient, easy way of proposing changes in documentation is by using the GitHub editor directly on the web. You can easily create a branch with your changes and make a PR from there. + +## Submitting contributions + +You will need to sign a Contributor License Agreement (CLA) before making a submission. [Learn more here](https://carto.com/contributions). From 6d82896eaa0942e8b518d94c0b393f23cdb2486a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?I=C3=B1igo=20Medina?= Date: Fri, 13 Apr 2018 00:45:24 +0200 Subject: [PATCH 11/45] Rename 01-quota-information.md to 03-quota-information.md --- docs/support/{01-quota-information.md => 03-quota-information.md} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename docs/support/{01-quota-information.md => 03-quota-information.md} (100%) diff --git a/docs/support/01-quota-information.md b/docs/support/03-quota-information.md similarity index 100% rename from docs/support/01-quota-information.md rename to docs/support/03-quota-information.md From 292755215c3fa47a7d2c9626d741f62258369fa8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?I=C3=B1igo=20Medina?= Date: Fri, 13 Apr 2018 00:45:36 +0200 Subject: [PATCH 12/45] Rename 02-rate-limits.md to 04-rate-limits.md --- docs/support/{02-rate-limits.md => 04-rate-limits.md} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename docs/support/{02-rate-limits.md => 04-rate-limits.md} (100%) diff --git a/docs/support/02-rate-limits.md b/docs/support/04-rate-limits.md similarity index 100% rename from docs/support/02-rate-limits.md rename to docs/support/04-rate-limits.md From 9f9bdd7e64578b22bac1e2c880746c213aaefe56 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?I=C3=B1igo=20Medina?= Date: Fri, 13 Apr 2018 00:49:35 +0200 Subject: [PATCH 13/45] Delete 02-geocoding-functions.md --- docs/guides/02-geocoding-functions.md | 348 -------------------------- 1 file changed, 348 deletions(-) delete mode 100644 docs/guides/02-geocoding-functions.md diff --git a/docs/guides/02-geocoding-functions.md b/docs/guides/02-geocoding-functions.md deleted file mode 100644 index c5d2c21..0000000 --- a/docs/guides/02-geocoding-functions.md +++ /dev/null @@ -1,348 +0,0 @@ -# Geocoding Functions - -The [geocoder](https://carto.com/data/geocoder-api/) functions allow you to match your data with geometries on your map. This geocoding service can be used programatically to geocode datasets via the CARTO SQL API. It is fed from _Open Data_ and it serves geometries for countries, provinces, states, cities, postal codes, IP addresses and street addresses. CARTO provides functions for several different categories of geocoding through the Data Services API. - -_**This service is subject to quota limitations and extra fees may apply**. View the [Quota Information](https://carto.com/docs/carto-engine/dataservices-api/quota-information/) section for details and recommendations about to quota consumption._ - -The following example displays how to geocode a single country: - -```bash -https://{username}.carto.com/api/v2/sql?q=SELECT cdb_geocode_admin0_polygon('USA')&api_key={api_key} -``` - -In order to geocode an existent CARTO dataset, an SQL UPDATE statement must be used to populate the geometry column in the dataset with the results of the Data Services API. For example, if the column where you are storing the country names for each one of our rows is called `country_column`, run the following statement in order to geocode the dataset: - -```bash -https://{username}.carto.com/api/v2/sql?q=UPDATE {tablename} SET the_geom = cdb_geocode_admin0_polygon('USA')&api_key={api_key} -``` - -Notice that you can make use of Postgres or PostGIS functions in your Data Services API requests, as the result is a geometry that can be handled by the system. For example, suppose you need to retrieve the centroid of a specific country, you can wrap the resulting geometry from the geocoder functions inside the PostGIS `ST_Centroid` function: - -```bash -https://{username}.carto.com/api/v2/sql?q=UPDATE {tablename} SET the_geom = ST_Centroid(cdb_geocode_admin0_polygon('USA'))&api_key={api_key} -``` - - -The following geocoding functions are available, grouped by categories. - -## Country Geocoder - -This function geocodes your data into country border geometries. It recognizes the names of the different countries either by different synonyms (such as their English name or their endonym), or by ISO (ISO2 or ISO3) codes. - -### cdb_geocode_admin0_polygon(_country_name text_) - -Geocodes the text name of a country into a country_name geometry, displayed as polygon data. - -#### Arguments - -Name | Type | Description ---- | --- | --- -`country_name` | `text` | Name of the country - -#### Returns - -Geometry (polygon, EPSG 4326) or null - -#### Example - -##### Update the geometry of a table to geocode it - -```bash -UPDATE {tablename} SET the_geom = cdb_geocode_admin0_polygon({country_column}) -``` - -##### Insert a geocoded row into a table - -```bash -INSERT INTO {tablename} (the_geom) SELECT cdb_geocode_admin0_polygon('France') -``` - -## Level-1 Administrative Regions Geocoder - -This function geocodes your data into polygon geometries for [Level 1](https://en.wikipedia.org/wiki/Table_of_administrative_divisions_by_country), or [NUTS-1](https://en.wikipedia.org/wiki/NUTS_1_statistical_regions_of_England), administrative divisions (or units) of countries. For example, a "state" in the United States, "départements" in France, or an autonomous community in Spain. - -### cdb_geocode_admin1_polygon(_admin1_name text_) - -Geocodes the name of the province/state into a Level-1 administrative region, displayed as a polygon geometry. - -#### Arguments - -Name | Type | Description ---- | --- | --- -`admin1_name` | `text` | Name of the province/state - -#### Returns - -Geometry (polygon, EPSG 4326) or null - -#### Example - -##### Update the geometry of a table to geocode it - -```bash -UPDATE {tablename} SET the_geom = cdb_geocode_admin1_polygon({province_column}) -``` - -##### Insert a geocoded row into a table - -```bash -INSERT INTO {tablename} (the_geom) SELECT cdb_geocode_admin1_polygon('Alicante') -``` - - -### cdb_geocode_admin1_polygon(_admin1_name text, country_name text_) - -Geocodes the name of the province/state for a specified country into a Level-1 administrative region, displayed as a polygon geometry. - -#### Arguments - -Name | Type | Description ---- | --- | --- -`admin1_name` | `text` | Name of the province/state -`country_name` | `text` | Name of the country in which the province/state is located - -#### Returns - -Geometry (polygon, EPSG 4326) or null - -#### Example - -##### Update the geometry of a table to geocode it - -```bash -UPDATE {tablename} SET the_geom = cdb_geocode_admin1_polygon({province_column}, {country_column}) -``` -##### Insert a geocoded row into a table - -```bash -INSERT INTO {tablename} (the_geom) SELECT cdb_geocode_admin1_polygon('Alicante', 'Spain') -``` - - -## City Geocoder - -This function geocodes your data into point geometries for names of cities. It is recommended to use geocoding functions that require more defined parameters — this returns more accurate results when several cities have the same name. _If there are duplicate results for a city name, the city name with the highest population will be returned._ - -### cdb_geocode_namedplace_point(_city_name text_) - -Geocodes the text name of a city into a named place geometry, displayed as point data. - -#### Arguments - -Name | Type | Description ---- | --- | --- -`city_name` | `text` | Name of the city - -#### Returns - -Geometry (point, EPSG 4326) or null - -#### Example - -##### Select - -##### Update the geometry of a table to geocode it - -```bash -UPDATE {tablename} SET the_geom = cdb_geocode_namedplace_point({city_column}) -``` - -##### Insert a geocoded row into a table - -```bash -INSERT INTO {tablename} (the_geom) SELECT cdb_geocode_namedplace_point('Barcelona') -``` - - -### cdb_geocode_namedplace_point(_city_name text, country_name text_) - -Geocodes the text name of a city for a specified country into a named place point geometry. - -#### Arguments - -Name | Type | Description ---- | --- | --- -`city_name` | `text` | Name of the city -`country_name` | `text` | Name of the country in which the city is located - -#### Returns - -Geometry (point, EPSG 4326) or null - -#### Example - -##### Update the geometry of a table to geocode it - -```bash -UPDATE {tablename} SET the_geom = cdb_geocode_namedplace_point({city_column}, 'Spain') -``` - -##### Insert a geocoded row into a table - -```bash -INSERT INTO {tablename} (the_geom) SELECT cdb_geocode_namedplace_point('Barcelona', 'Spain') -``` - - -### cdb_geocode_namedplace_point(_city_name text, admin1_name text, country_name text_) - -Geocodes your data into a named place point geometry, containing the text name of a city, for a specified province/state and country. This is recommended for the most accurate geocoding of city data. -#### Arguments - -Name | Type | Description ---- | --- | --- -`city_name` | `text` | Name of the city -`admin1_name` | `text` | Name of the province/state in which the city is located -`country_name` | `text` | Name of the country in which the city is located - -#### Returns - -Geometry (point, EPSG 4326) or null - -#### Example - -##### Update the geometry of a table to geocode it - -```bash -UPDATE {tablename} SET the_geom = cdb_geocode_namedplace_point({city_column}, {province_column}, 'USA') -``` - -##### Insert a geocoded row into a table - -```bash -INSERT INTO {tablename} (the_geom) SELECT cdb_geocode_namedplace_point('New York', 'New York', 'USA') -``` - -## Postal Code Geocoder - -These functions geocode your data into point, or polygon, geometries for postal codes. The postal code geocoder covers the United States, France, Australia and Canada; a request for a different country will return an empty response. - -**Note:** For the USA, US Census Zip Code Tabulation Areas (ZCTA) are used to reference geocodes for USPS postal codes service areas. This is not a CARTO restriction, this is a US Government licensing protection of their zip code data source; which is not publicly available. Additionally, zip codes are considered service areas and are not actually geometric areas. As a solution, the US Census provides ZCTA data, which tabulates GIS postal codes for USPS locations by aggregating census blocks. For details about how ZCTAs are created, see [ZIP Code™ Tabulation Areas (ZCTAs™)](https://www.census.gov/geo/reference/zctas.html). If you are geocoding data and your zip codes fail, ensure you are using ZCTAs for the postal code. - -### cdb_geocode_postalcode_polygon(_postal_code text, country_name text_) - -Geocodes the postal code for a specified country into a **polygon** geometry. - -#### Arguments - -Name | Type | Description ---- | --- | --- -`postal_code` | `text` | Postal code -`country_name` | `text` | Name of the country in which the postal code is located - -#### Returns - -Geometry (polygon, EPSG 4326) or null - -#### Example - -##### Update the geometry of a table to geocode it - -```bash -UPDATE {tablename} SET the_geom = cdb_geocode_postalcode_polygon({postal_code_column}, 'USA') -``` - -##### Insert a geocoded row into a table - -```bash -INSERT INTO {tablename} (the_geom) SELECT cdb_geocode_postalcode_polygon('11211', 'USA') -``` - -### cdb_geocode_postalcode_point(_code text, country_name text_) - -Geocodes the postal code for a specified country into a **point** geometry. - -#### Arguments - -Name | Type | Description ---- | --- | --- -`postal_code` | `text` | Postal code -`country_name` | `text` | Name of the country in which the postal code is located - -#### Returns - -Geometry (point, EPSG 4326) or null - -#### Example - -##### Update the geometry of a table to geocode it - -```bash -UPDATE {tablename} SET the_geom = cdb_geocode_postalcode_point({postal_code_column}, 'USA') -``` - -##### Insert a geocoded row into a table - -```bash -INSERT INTO {tablename} (the_geom) SELECT cdb_geocode_postalcode_point('11211', 'USA') -``` - - -## IP Addresses Geocoder - -This function geocodes your data into point geometries for IP addresses. This is useful if you are analyzing location based data, based on a set of user's IP addresses. - -### cdb_geocode_ipaddress_point(_ip_address text_) - -Geocodes a postal code from a specified country into an IP address, displayed as a point geometry. - -#### Arguments - -Name | Type | Description ---- | --- | --- -`ip_address` | `text` | IPv4 or IPv6 address - -#### Returns - -Geometry (point, EPSG 4326) or null - -#### Example - -##### Update the geometry of a table to geocode it - -```bash -UPDATE {tablename} SET the_geom = cdb_geocode_ipaddress_point('102.23.34.1') -``` - -##### Insert a geocoded row into a table - -```bash -INSERT INTO {tablename} (the_geom) SELECT cdb_geocode_ipaddress_point('102.23.34.1') -``` - -## Street-Level Geocoder - -This function geocodes your data into a point geometry for a street address. CARTO uses several different service providers for street-level geocoding, depending on your platform. If you access CARTO on a Google Cloud Platform, [Google Maps geocoding](https://developers.google.com/maps/documentation/geocoding/intro) is applied. All other platform users are provided with [Mapbox geocoding services](https://www.mapbox.com/). [Contact us](mailto:sales@carto.com) if you have any specific questions or requirements about the location data service provider being used with your account._. - -**This service is subject to quota limitations, and extra fees may apply**. View the [Quota information](https://carto.com/docs/carto-engine/dataservices-api/quota-information/) for details and recommendations about quota consumption. - -### cdb_geocode_street_point(_search_text text, [city text], [state text], [country text]_) - -Geocodes a complete address into a single street geometry, displayed as point data. - -#### Arguments - -Name | Type | Description ---- | --- | --- | --- -`searchtext` | `text` | searchtext contains free-form text containing address elements. You can specify the searchtext parameter by itself, or with other parameters, to narrow your search. For example, you can specify the state or country parameters, along with a free-form address in the searchtext field. -`city` | `text` | (Optional) Name of the city. -`state` | `text` | (Optional) Name of the state. -`country` | `text` | (Optional) Name of the country. - -#### Returns - -Geometry (point, EPSG 4326) or null - -#### Example - -##### Update the geometry of a table to geocode it - -```bash -UPDATE {tablename} SET the_geom = cdb_geocode_street_point({street_name_column}) -``` - -##### Insert a geocoded row into a table - -```bash -INSERT INTO {tablename} (the_geom) SELECT cdb_geocode_street_point('651 Lombard Street', 'San Francisco', 'California', 'United States') -``` From 073dc3b68b82b00f2186d0b10658ab4f7d7621c6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?I=C3=B1igo=20Medina?= Date: Fri, 13 Apr 2018 00:49:44 +0200 Subject: [PATCH 14/45] Delete 03-isoline-functions.md --- docs/guides/03-isoline-functions.md | 104 ---------------------------- 1 file changed, 104 deletions(-) delete mode 100644 docs/guides/03-isoline-functions.md diff --git a/docs/guides/03-isoline-functions.md b/docs/guides/03-isoline-functions.md deleted file mode 100644 index 97949b9..0000000 --- a/docs/guides/03-isoline-functions.md +++ /dev/null @@ -1,104 +0,0 @@ -# Isoline Functions - -[Isolines](https://carto.com/data/isolines/) are contoured lines that display equally calculated levels over a given surface area. This enables you to view polygon dimensions by forward or reverse measurements. Isoline functions are calculated as the intersection of areas from the origin point, measured by distance (isodistance) or time (isochrone). For example, the distance of a road from a sidewalk. Isoline services through CARTO are available by requesting a single function in the Data Services API. - -_**This service is subject to quota limitations and extra fees may apply**. View the [Quota Information](https://carto.com/docs/carto-engine/dataservices-api/quota-information/) section for details and recommendations about to quota consumption._ - -You can use the isoline functions to retrieve, for example, isochrone lines from a certain location, specifying the mode and the ranges that will define each of the isolines. The following query calculates isolines for areas that are 5, 10 and 15 minutes (300, 600 and 900 seconds, respectively) away from the location by following a path defined by car routing and inserts them into a table. - -```bash -https://{username}.carto.com/api/v2/sql?q=INSERT INTO {table} (the_geom) SELECT the_geom FROM cdb_isodistance('POINT(-3.70568 40.42028)'::geometry, 'car', ARRAY[300, 600, 900]::integer[])&api_key={api_key} -``` - -The following functions provide an isoline generator service, based on time or distance. This service uses the isolines service defined for your account. The default service limits the usage of displayed polygons represented on top of [Mapbox](https://www.mapbox.com/) maps. - -## cdb_isodistance(_source geometry, mode text, range integer[], [options text[]]_) - -Displays a contoured line on a map, connecting geometries to a defined area, measured by an equal range of distance (in meters). - -#### Arguments - -Name | Type | Description | Accepted values ---- | --- | --- | --- -`source` | `geometry` | Source point, in 4326 projection, which defines the start location. | -`mode` | `text` | Type of transport used to calculate the isolines. | `car` or `walk` -`range` | `integer[]` | Range of the isoline, in meters. | -`options` | `text[]` | (Optional) Multiple options to add more capabilities to the analysis. See [Optional isolines parameters](#optional-isoline-parameters) for details. - - -#### Returns - -Name | Type | Description ---- | --- | --- -`center` | `geometry` | Source point, in 4326 projection, which defines the start location. -`data_range` | `integer` | The range that belongs to the generated isoline. -`the_geom` | `geometry(MultiPolygon)` | MultiPolygon geometry of the generated isoline in the 4326 projection. - -#### Examples - -##### Calculate and insert isodistance polygons from a point into another table - -```bash -INSERT INTO {table} (the_geom) SELECT the_geom FROM cdb_isodistance('POINT(-3.70568 40.42028)'::geometry, 'walk', ARRAY[300, 600, 900]::integer[]) -``` - -or equivalently: - -```bash -INSERT INTO {table} (the_geom) SELECT (cdb_isodistance('POINT(-3.70568 40.42028)'::geometry, 'walk', ARRAY[300, 600, 900]::integer[])).the_geom -``` - -##### Calculate and insert the generated isolines from `points_table` table to another table - -```bash -INSERT INTO {table} (the_geom) SELECT (cdb_isodistance(the_geom, 'walk', string_to_array(distance, ',')::integer[])).the_geom FROM {points_table} -``` - - -## cdb_isochrone(_source geometry, mode text, range integer[], [options text[]]_) - -Displays a contoured line on a map, connecting geometries to a defined area, measured by an equal range of time (in seconds). - -#### Arguments - -This function uses the same parameters and information as the `cdb_isodistance` function, with the exception that the range is measured in seconds instead of meters. - -Name | Type | Description | Accepted values ---- | --- | --- | --- -`source` | `geometry` | Source point, in 4326 projection, which defines the start location. | -`mode` | `text` | Type of transport used to calculate the isolines. | `car` or `walk` -`range` | `integer[]` | Range of the isoline, in seconds. | -`options` | `text[]` | (Optional) Multiple options to add more capabilities to the analysis. See [Optional isolines parameters](#optional-isoline-parameters) for details. - -#### Examples - -##### Calculate and insert isochrone polygons from a point into another table - -```bash -INSERT INTO {table} (the_geom) SELECT the_geom FROM cdb_isochrone('POINT(-3.70568 40.42028)'::geometry, 'car', ARRAY[300, 900, 12000]::integer[], ARRAY['mode_traffic=enabled','quality=3']::text[]) -``` - -or equivalently: - -```bash -INSERT INTO {table} (the_geom) SELECT (cdb_isochrone('POINT(-3.70568 40.42028)'::geometry, 'car', ARRAY[300, 900, 12000]::integer[], ARRAY['mode_traffic=enabled','quality=3']::text[])).the_geom -``` - -##### Calculate and insert the generated isolines from `points_table` table into another table - -```bash -INSERT INTO {table} (the_geom) SELECT (cdb_isochrone(the_geom, 'walk', string_to_array(time_distance, ',')::integer[])).the_geom FROM {points_table} -``` - -### Optional isoline parameters - -The optional value parameters must be passed using the format: `option=value`. - -Name | Type | Description | Accepted values ---- | --- | --- | --- -`is_destination` | `boolean` | If true, the source point is the destination instead of the starting location | `true` or `false`. `false` by default -`mode_type` | `text` | Type of route calculation | `shortest` or `fastest`. `shortest` by default -`mode_traffic` | `text` | Use traffic data to calculate the route | `enabled` or `disabled`. `disabled` by default -`resolution` | `text` | Allows you to specify the level of detail needed for the isoline polygon. Unit is meters per pixel. Higher resolution may increase the response time of the service. -`maxpoints` | `text` | Allows you to limit the amount of points in the returned isoline. If the isoline consists of multiple components, the sum of points from all components is considered. Each component will have at least two points. It is possible that more points than specified could be returned, in case when `2 * number of components` is higher than the `maxpoints` value itself. Increasing the number of `maxpoints` may increase the response time of the service. -`quality` | `text` | Allows you to reduce the quality of the isoline in favor of the response time. | `1`, `2`, `3`. Default value is `1`, corresponding to the best quality option. From 39af462136732e189474c317e8f3f5b615477c50 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?I=C3=B1igo=20Medina?= Date: Fri, 13 Apr 2018 00:49:53 +0200 Subject: [PATCH 15/45] Delete 04-routing-functions.md --- docs/guides/04-routing-functions.md | 84 ----------------------------- 1 file changed, 84 deletions(-) delete mode 100644 docs/guides/04-routing-functions.md diff --git a/docs/guides/04-routing-functions.md b/docs/guides/04-routing-functions.md deleted file mode 100644 index 17188cd..0000000 --- a/docs/guides/04-routing-functions.md +++ /dev/null @@ -1,84 +0,0 @@ -# Routing Functions - -Routing is the navigation from a defined start location to a defined end location. The calculated results are displayed as turn-by-turn directions on your map, based on the transportation mode that you specified. Routing services through CARTO are available by using the available functions in the Data Services API. - -## cdb_route_point_to_point(_origin geometry(Point), destination geometry(Point), mode text, [options text[], units text]_) - -Returns a route from origin to destination. - -#### Arguments - -Name | Type | Description | Accepted values ---- | --- | --- | --- -`origin` | `geometry(Point)` | Origin point, in 4326 projection, which defines the start location. | -`destination` | `geometry(Point)` | Destination point, in 4326 projection, which defines the end location. | -`mode` | `text` | Type of transport used to calculate the routes. | `car`, `walk`, `bicycle` or `public_transport` -`options` | `text[]` | (Optional) Multiple options to add more capabilities to the analysis. See [Optional routing parameters](#optional-routing-parameters) for details. -`units` | `text` | (Optional) Unit used to represent the length of the route. | `kilometers`, `miles`. By default is `kilometers`. This option is not supported by Mapbox provider - - -#### Returns - -Name | Type | Description ---- | --- | --- -`duration` | `integer` | Duration in seconds of the calculated route. -`length` | `real` | Length in the defined unit in the `units` field. `meters` by default . -`the_geom` | `geometry(LineString)` | LineString geometry of the calculated route in the 4326 projection. - -#### Examples - -##### Insert the values from the calculated route in your table - -```bash -INSERT INTO (duration, length, the_geom) SELECT duration, length, shape FROM cdb_route_point_to_point('POINT(-3.70237112 40.41706163)'::geometry,'POINT(-3.69909883 40.41236875)'::geometry, 'car') -``` -##### Update the geometry field with the calculated route shape - -```bash -UPDATE
SET the_geom = (SELECT shape FROM cdb_route_point_to_point('POINT(-3.70237112 40.41706163)'::geometry,'POINT(-3.69909883 40.41236875)'::geometry, 'car', ARRAY['mode_type=shortest']::text[])) -``` - -## cdb_route_with_waypoints(_waypoints geometry(Point)[], mode text, [options text[], units text]_) - -Returns a route that goes from origin to destination and whose path travels through the defined locations. - -#### Arguments - -Name | Type | Description | Accepted values ---- | --- | --- | --- -`waypoints` | `geometry(Point)[]` | Array of ordered points, in 4326 projection, which defines the origin point, one or more locations for the route path to travel through, and the destination. The first element of the array defines the origin and the last element the destination of the route. | -`mode` | `text` | Type of transport used to calculate the routes. | `car`, `walk`, `bicycle` or `public_transport` -`options` | `text[]` | (Optional) Multiple options to add more capabilities to the analysis. See [Optional routing parameters](#optional-routing-parameters) for details. -`units` | `text` | (Optional) Unit used to represent the length of the route. | `kilometers`, `miles`. By default is `kilometers`. This option is not supported by Mapbox provider - - -#### Returns - -Name | Type | Description ---- | --- | --- -`duration` | `integer` | Duration in seconds of the calculated route. -`length` | `real` | Length in the defined unit in the `units` field. `meters` by default . -`the_geom` | `geometry(LineString)` | LineString geometry of the calculated route in the 4326 projection. - -*Note*: A request to the function _cdb\_route\_with\_waypoints(waypoints geometry(Point)[], mode text, [options text[], units text])_ with only two points in the geometry array are automatically defined as origin and destination. It is equivalent to performing the following request with these two locations as parameters: _cdb\_route\_point\_to\_point(origin geometry(Point), destination geometry(Point), mode text, [options text[], units text])_. - -#### Examples - -##### Insert the values from the calculated route in your table - -```bash -INSERT INTO
(duration, length, the_geom) SELECT duration, length, shape FROM cdb_route_with_waypoints(Array['POINT(-3.7109 40.4234)'::GEOMETRY, 'POINT(-3.7059 40.4203)'::geometry, 'POINT(-3.7046 40.4180)'::geometry]::geometry[], 'walk') -``` -##### Update the geometry field with the calculated route shape - -```bash -UPDATE
SET the_geom = (SELECT shape FROM cdb_route_with_waypoints(Array['POINT(-3.7109 40.4234)'::GEOMETRY, 'POINT(-3.7059 40.4203)'::geometry, 'POINT(-3.7046 40.4180)'::geometry]::geometry[], 'car', ARRAY['mode_type=shortest']::text[])) -``` - -### Optional routing parameters - -The optional value parameters must be passed using the format: `option=value`. Not all are available for all the routing providers - -Name | Type | Description | Accepted values ---- | --- | --- | --- -`mode_type` | `text` | Type of route calculation | `shortest` (this option only applies to the car transport mode) From f7349e6a921aa7be91720e3449fcef28ce5a224c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?I=C3=B1igo=20Medina?= Date: Fri, 13 Apr 2018 00:50:04 +0200 Subject: [PATCH 16/45] Delete 05-demographic-functions.md --- docs/guides/05-demographic-functions.md | 155 ------------------------ 1 file changed, 155 deletions(-) delete mode 100644 docs/guides/05-demographic-functions.md diff --git a/docs/guides/05-demographic-functions.md b/docs/guides/05-demographic-functions.md deleted file mode 100644 index 1f9f003..0000000 --- a/docs/guides/05-demographic-functions.md +++ /dev/null @@ -1,155 +0,0 @@ -# Demographic Functions - -The Demographic Snapshot enables you to collect demographic reports around a point location. For example, you can take the coordinates of a coffee shop and find the average population characteristics, such as total population, educational attainment, housing and income information around that location. You can use raw street addresses by combining the Demographic Snapshot with CARTO's geocoding features. If you need help creating coordinates from addresses, see the [Geocoding Functions](https://carto.com/docs/carto-engine/dataservices-api/geocoding-functions/) documentation. - -**Note:** The Demographic Snapshot functions are only available for the United States. - -## OBS_GetDemographicSnapshot( point geometry ) - -Fields returned include information about income, education, transportation, race, and more. Not all fields will have information for every coordinate queried. - -### Arguments - -Name | Description | Example Values ---- | --- | --- -point geometry | A point geometry. You can use the helper function, `CDB_LatLng` to quickly generate one from latitude and longitude | `CDB_LatLng(40.760410,-73.964242)` - -### Returns - -The Demographic Snapshot contains a broad subset of demographic measures in the Data Observatory. Over 80 measurements are returned by a single API request. For each demographic measure, the API returns the following values. - -Value | Name | Tablename | Aggregate | Type | Description ------ | ---- | --------- | --------- | ---- |------------ -The value of the measure at the point you requested | The name of the measure | The table it was drawn from | Indicated if the measure is a count or median. | postgresql | A description of the measure - -For example the "Female Population" measure returns - -```json -obs_getdemographicsnapshot: { - "value": 32.5395066379175, - "name": "Female Population", - "tablename": "obs_1a098da56badf5f32e336002b0a81708c40d29cd", - "aggregate": "sum", - "type": "Numeric", - "description": "The number of people within each geography who are female." -} -``` - -**For details, see the [Glossary of Demographic Measures](#glossary-of-demographic-measures).** - -### Examples - -```bash -https://{username}.carto.com/api/v2/sql?q=SELECT * FROM -OBS_GetDemographicSnapshot({{point geometry}}) -``` - -##### Get the Geographic Snapshot of a Demographic - -__Get the Demographic Snapshot at Camp David__ - -```bash -https://{username}.carto.com/api/v2/sql?q=SELECT * FROM -OBS_GetDemographicSnapshot(CDB_LatLng(39.648333, -77.465)) -``` - -__Get the Demographic Snapshot in the Upper West Side__ - -```bash -https://{username}.carto.com/api/v2/sql?q=SELECT * FROM -OBS_GetDemographicSnapshot(CDB_LatLng(40.80, -73.960)) -``` - -## Glossary of Demographic Measures - -This list contains the demographic measures and response names for results from the ```OBS_GetDemographicSnapshot``` function. - - Measure name | Measure Description | Response Mame | Response Units ---- | --- | --- | --- -Total Population | The total number of all people living in a given geographic area. This is a very useful catch-all denominator when calculating rates. | total_pop | Count per sq. km -Male Population | The number of people within each geography who are male. | male_pop | Count per sq. km -Female Population | The number of people within each geography who are female.| female_pop | Count per sq. km -Population not Hispanic | The number of people not identifying as Hispanic or Latino in each geography. | not_hispanic_pop | Count per sq. km -White Population | The number of people identifying as white, non-Hispanic in each geography. | white_pop | Count per sq. km -Black or African American Population| The number of people identifying as black or African American, non-Hispanic in each geography. | black_pop | Count per sq. km -American Indian and Alaska Native Population | The number of people identifying as American Indian or Alaska native in each geography.| amerindian_pop| Count per sq. km -Asian Population | The number of people identifying as Asian, non-Hispanic in each geography.| asian_pop | Count per sq. km -Other Race population | The number of people identifying as another race in each geography. | other_race_pop | Count per sq. km -Two or more races population| The number of people identifying as two or more races in each geography | two_or_more_races_pop | Count per sq. km -Hispanic Population | The number of people identifying as Hispanic or Latino in each geography. | hispanic_pop | Count per sq. km -Not a U.S. Citizen Population | The number of people within each geography who indicated that they are not U.S. citizens. | not_us_citizen_pop | Count per sq. km -Median Age | The median age of all people in a given geographic area.| median_age | Years -Children under 18 Years of Age | The number of people within each geography who are under 18 years of age.| children | Count per sq. km -Population 15 Years and Over | The number of people in a geographic area who are over the age of 15. This is used mostly as a denominator of marital status. | pop_15_and_over | Count per sq. km -Population 3 Years and Over | The total number of people in each geography age 3 years and over. This denominator is mostly used to calculate rates of school enrollment. | population_3_years_over | Count per sq. km -Population 5 Years and Over | The number of people in a geographic area who are over the age of 5. This is primarily used as a denominator of measures of language spoken at home.| pop_5_years_over | Count per sq. km -Workers over the Age of 16 | The number of people in each geography who work. Workers include those employed at private for-profit companies, the self-employed, government workers and non-profit employees. | workers_16_and_over | Count per sq. km -Workers age 16 and over who do not work from home| The number of workers over the age of 16 who do not work from home in a geographic area| commuters_16_over | Count per sq. km -Commuters by Car, Truck, or Van | The number of workers age 16 years and over within a geographic area who primarily traveled to work by car, truck or van. This is the principal mode of travel or type of conveyance, by distance rather than time, that the worker usually used to get from home to work. | commuters_by_car_truck_van | Count per sq. km -Commuters who drove alone | The number of workers age 16 years and over within a geographic area who primarily traveled by car driving alone. This is the principal mode of travel or type of conveyance, by distance rather than time, that the worker usually used to get from home to work. | commuters_drove_alone | Count per sq. km -Commuters by Carpool| The number of workers age 16 years and over within a geographic area who primarily traveled to work by carpool. This is the principal mode of travel or type of conveyance, by distance rather than time, that the worker usually used to get from home to work. | commuters_by_carpool | Count per sq. km -Commuters by Public Transportation | The number of workers age 16 years and over within a geographic area who primarily traveled to work by public transportation. This is the principal mode of travel or type of conveyance, by distance rather than time, that the worker usually used to get from home to work. | commuters_by_public_transportation | Count per sq. km | -Commuters by Bus | The number of workers age 16 years and over within a geographic area who primarily traveled to work by bus. This is the principal mode of travel or type of conveyance, by distance rather than time, that the worker usually used to get from home to work. This is a subset of workers who commuted by public transport. | commuters_by_bus| Count per sq. km -Commuters by Subway or Elevated | The number of workers age 16 years and over within a geographic area who primarily traveled to work by subway or elevated train. This is the principal mode of travel or type of conveyance, by distance rather than time, that the worker usually used to get from home to work. This is a subset of workers who commuted by public transport. | commuters_by_subway_or_elevated | Count per sq. km -Walked to Work | The number of workers age 16 years and over within a geographic area who primarily walked to work. This would mean that of any way of getting to work, they travelled the most distance walking. | walked_to_work | Count per sq. km -Worked at Home | The count within a geographical area of workers over the age of 16 who worked at home. | worked_at_home | Count per sq. km -Number of workers with less than 10 minute commute | The number of workers over the age of 16 who do not work from home and commute in less than 10 minutes in a geographic area. | commute_less_10_mins | Count per sq. km -Number of workers with a commute between 10 and 14 minutes| The number of workers over the age of 16 who do not work from home and commute in between 10 and 14 minutes in a geographic area. | commute_10_14_mins | Count per sq. km -Number of workers with a commute between 15 and 19 minutes | The number of workers over the age of 16 who do not work from home and commute in between 15 and 19 minutes in a geographic area. | commute_15_19_mins | Count per sq. km -Number of workers with a commute between 20 and 24 minutes | The number of workers over the age of 16 who do not work from home and commute in between 20 and 24 minutes in a geographic area. | commute_20_24_mins | Count per sq. km -Number of workers with a commute between 25 and 29 minutes | The number of workers over the age of 16 who do not work from home and commute in between 25 and 29 minutes in a geographic area. | commute_25_29_mins| Count per sq. km -Number of workers with a commute between 30 and 34 minutes | The number of workers over the age of 16 who do not work from home and commute in between 30 and 34 minutes in a geographic area. | commute_30_34_mins | Count per sq. km -Number of workers with a commute between 35 and 44 minutes | The number of workers over the age of 16 who do not work from home and commute in between 35 and 44 minutes in a geographic area. | commute_35_44_mins | Count per sq. km -Number of workers with a commute between 45 and 59 minutes | The number of workers over the age of 16 who do not work from home and commute in between 45 and 59 minutes in a geographic area. | commute_45_59_mins | Count per sq. km -Number of workers with a commute of over 60 minutes | The number of workers over the age of 16 who do not work from home and commute in over 60 minutes in a geographic area.| commute_60_more_mins | Count per sq. km -Aggregate travel time to work | The total number of minutes every worker over the age of 16 who did not work from home spent spent commuting to work in one day in a geographic area. | aggregate_travel_time_to_work | Minutes -Households | A count of the number of households in each geography. A household consists of one or more people who live in the same dwelling and also share at meals or living accommodation, and may consist of a single family or some other grouping of people. | households | Count per sq. km -Never Married | The number of people in a geographic area who have never been married. | pop_never_married | Count per sq. km -Currently married| The number of people in a geographic area who are currently married. | pop_now_married | Count per sq. km -Married but separated | The number of people in a geographic area who are married but separated.| pop_separated | Count per sq. km -Widowed | The number of people in a geographic area who are widowed.| pop_widowed | Count per sq. km -Divorced | The number of people in a geographic area who are divorced. | pop_divorced | Count per sq. km -Students Enrolled in School | The total number of people in each geography currently enrolled at any level of school, from nursery or pre-school to advanced post-graduate education. Only includes those over the age of 3. | in_school | Count per sq. km -Students Enrolled in Grades 1 to 4 | The total number of people in each geography currently enrolled in grades 1 through 4 inclusive. This corresponds roughly to elementary school. | in_grades_1_to_4 | Count per sq. km -Students Enrolled in Grades 5 to 8 | The total number of people in each geography currently enrolled in grades 5 through 8 inclusive. This corresponds roughly to middle school. | in_grades_5_to_8 | Count per sq. km -Students Enrolled in Grades 9 to 12 | The total number of people in each geography currently enrolled in grades 9 through 12 inclusive. This corresponds roughly to high school. | in_grades_9_to_12 | Count per sq. km -Students Enrolled as Undergraduate in College | The number of people in a geographic area who are enrolled in college at the undergraduate level. Enrollment refers to being registered or listed as a student in an educational program leading to a college degree. This may be a public school or college, a private school or college. | in_undergrad_college | Count per sq. km -Population 25 Years and Over | The number of people in a geographic area who are over the age of 25. This is used mostly as a denominator of educational attainment. | pop_25_years_over | Count per sq. km -Population Completed High School | The number of people in a geographic area over the age of 25 who completed high school, and did not complete a more advanced degree. | high_school_diploma| Count per sq. km -Population completed less than one year of college, no degree | The number of people in a geographic area over the age of 25 who attended college for less than one year and no further. | less_one_year_college | Count per sq. km -Population completed more than one year of college, no degree | The number of people in a geographic area over the age of 25 who attended college for more than one year but did not obtain a degree. | one_year_more_college | Count per sq. km -Population Completed Associate's Degree | The number of people in a geographic area over the age of 25 who obtained a associate's degree, and did not complete a more advanced degree.| associates_degree | Count per sq. km -Population Completed Bachelor's Degree| The number of people in a geographic area over the age of 25 who obtained a bachelor's degree, and did not complete a more advanced degree. | bachelors_degree| Count per sq. km -Population Completed Master's Degree | The number of people in a geographic area over the age of 25 who obtained a master's degree, but did not complete a more advanced degree. | masters_degree | Count per sq. km -Speaks only English at Home | The number of people in a geographic area over age 5 who speak only English at home. | speak_only_english_at_home | Count per sq. km -Speaks Spanish at Home | The number of people in a geographic area over age 5 who speak Spanish at home, possibly in addition to other languages. | speak_spanish_at_home | Count per sq. km -Population for Whom Poverty Status Determined | The number of people in each geography who could be identified as either living in poverty or not. This should be used as the denominator when calculating poverty rates, as it excludes people for whom it was not possible to determine poverty. | pop_determined_poverty_status | Count per sq. km -Income In The Past 12 Months Below Poverty Level | The number of people in a geographic area who are part of a family (which could be just them as an individual) determined to be "in poverty" following the [Office of Management and Budget's Directive 14](https://www.census.gov/hhes/povmeas/methodology/ombdir14.html). | poverty | Count per sq. km -Households with income less than $10,000 | The number of households in a geographic area whose annual income was less than $10,000. | income_less_10000 | Count per sq. km -Households with income of $10,000 to $14,999 | The number of households in a geographic area whose annual income was between $10,000 and $14,999. | income_10000_14999 | Count per sq. km -Households with income of $15,000 to $19,999 | The number of households in a geographic area whose annual income was between $15,000 and $19,999. | income_15000_19999 | Count per sq. km -Households with income of $20,000 To $24,999 | The number of households in a geographic area whose annual income was between $20,000 and $24,999. | income_20000_24999 | Count per sq. km -Households with income of $25,000 To $29,999 | The number of households in a geographic area whose annual income was between $20,000 and $24,999. | income_25000_29999 | Count per sq. km -Households with income of $30,000 To $34,999 | The number of households in a geographic area whose annual income was between $30,000 and $34,999. | income_30000_34999 | Count per sq. km -Households with income of $35,000 To $39,999 | The number of households in a geographic area whose annual income was between $35,000 and $39,999. | income_35000_39999 | Count per sq. km -Households with income of $40,000 To $44,999 | The number of households in a geographic area whose annual income was between $40,000 and $44,999. | income_40000_44999| Count per sq. km -Households with income of $45,000 To $49,999 | The number of households in a geographic area whose annual income was between $45,000 and $49,999. | income_45000_49999 | Count per sq. km -Households with income of $50,000 To $59,999 | The number of households in a geographic area whose annual income was between $50,000 and $59,999. | income_50000_59999 | Count per sq. km -Households with income of $60,000 To $74,999 | The number of households in a geographic area whose annual income was between $60,000 and $74,999. | income_60000_74999 | Count per sq. km -Households with income of $75,000 To $99,999 | The number of households in a geographic area whose annual income was between $75,000 and $99,999. | income_75000_99999 | Count per sq. km -Households with income of $100,000 To $124,999 | The number of households in a geographic area whose annual income was between $100,000 and $124,999. | income_100000_124999 | Count per sq. km -Households with income of $125,000 To $149,999 | The number of households in a geographic area whose annual income was between $125,000 and $149,999. | income_125000_149999 | Count per sq. km -Households with income of $150,000 To $199,999 | The number of households in a geographic area whose annual income was between $150,000 and $1999,999. | income_150000_199999 | Count per sq. km -Households with income of $200,000 Or More | The number of households in a geographic area whose annual income was more than $200,000. | income_200000_or_more | Count per sq. km -Median Household Income in the past 12 Months | Within a geographic area, the median income received by every household on a regular basis before payments for personal income taxes, social security, union dues, medicare deductions, etc. It includes income received from wages, salary, commissions, bonuses, and tips; self-employment income from own nonfarm or farm businesses, including proprietorships and partnerships; interest, dividends, net rental income, royalty income, or income from estates and trusts; Social Security or Railroad Retirement income; Supplemental Security Income (SSI); any cash public assistance or welfare payments from the state or local welfare office; retirement, survivor, or disability benefits; and any other sources of income received regularly such as Veterans' (VA) payments, unemployment and/or worker's compensation, child support, and alimony. | median_income | USD -Per Capita Income in the past 12 Months | | income_per_capita | USD -Gini Index | A measurement of the income distribution of a country's residents. | gini_index | None -Housing Units | A count of housing units in each geography. A housing unit is a house, an apartment, a mobile home or trailer, a group of rooms, or a single room occupied as separate living quarters, or if vacant, intended for occupancy as separate living quarters. | housing_units | Count per sq. km -Vacant Housing Units | The count of vacant housing units in a geographic area. A housing unit is vacant if no one is living in it at the time of enumeration, unless its occupants are only temporarily absent. Units temporarily occupied at the time of enumeration entirely by people who have a usual residence elsewhere are also classified as vacant. | vacant_housing_units | Count per sq. km -Vacant Housing Units for Rent | The count of vacant housing units in a geographic area that are for rent. A housing unit is vacant if no one is living in it at the time of enumeration, unless its occupants are only temporarily absent. Units temporarily occupied at the time of enumeration entirely by people who have a usual residence elsewhere are also classified as vacant. | vacant_housing_units_for_rent | Count per sq. km -Vacant Housing Units for Sale| The count of vacant housing units in a geographic area that are for sale. A housing unit is vacant if no one is living in it at the time of enumeration, unless its occupants are only temporarily absent. Units temporarily occupied at the time of enumeration entirely by people who have a usual residence elsewhere are also classified as vacant. | vacant_housing_units_for_sale | Count per sq. km -Owner-occupied Housing Units | The count of owner occupied housing units in a geographic area. | owner_occupied_housing_units | Count per sq. km -Owner-occupied Housing Units valued at $1,000,000 or more. | The count of owner occupied housing units in a geographic area that are valued at $1,000,000 or more. Value is the respondent's estimate of how much the property (house and lot, mobile home and lot, or condominium unit) would sell for if it were for sale. | million_dollar_housing_units | Count per sq. km -Owner-occupied Housing Units with a Mortgage | The count of housing units within a geographic area that are mortagaged. "Mortgage" refers to all forms of debt where the property is pledged as security for repayment of the debt, including deeds of trust, trust deed, contracts to purchase, land contracts, junior mortgages, and home equity loans. | mortgaged_housing_units | Count per sq. km -Median Rent | The median contract rent within a geographic area. The contract rent is the monthly rent agreed to or contracted for, regardless of any furnishings, utilities, fees, meals, or services that may be included. For vacant units, it is the monthly rent asked for the rental unit at the time of interview.| median_rent | USD -Percent of Household Income Spent on Rent | Within a geographic area, the median percentage of household income which was spent on gross rent. Gross rent is the amount of the contract rent plus the estimated average monthly cost of utilities (electricity, gas, water, sewer etc.) and fuels (oil, coal, wood, etc.) if these are paid by the renter. Household income is the sum of the income of all people 15 years and older living in the household. | percent_income_spent_on_rent | Percent From f368925f8e639e7b92cf67d949001fe83b2e1d2e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?I=C3=B1igo=20Medina?= Date: Fri, 13 Apr 2018 00:50:12 +0200 Subject: [PATCH 17/45] Delete 06-segmentation-functions.md --- docs/guides/06-segmentation-functions.md | 181 ----------------------- 1 file changed, 181 deletions(-) delete mode 100644 docs/guides/06-segmentation-functions.md diff --git a/docs/guides/06-segmentation-functions.md b/docs/guides/06-segmentation-functions.md deleted file mode 100644 index ec11c59..0000000 --- a/docs/guides/06-segmentation-functions.md +++ /dev/null @@ -1,181 +0,0 @@ -# Segmentation Functions - -The Segmentation Snapshot functions enable you to determine the pre-calculated population segment for a location. Segmentation is a method that divides a populations into subclassifications based on common traits. For example, you can take the a store location and determine what classification of population exists around that location. If you need help creating coordinates from addresses, see the [Geocoding Functions](https://carto.com/docs/carto-engine/dataservices-api/geocoding-functions/) documentation. - -_**Note:** The Segmentation Snapshot functions are only available for the United States. Our first release (May 18, 2016) is derived from Census 2010 variables. Our next release will be based on Census 2014 data. For the latest information, see the [Open Segments](https://github.com/CartoDB/open-segments) project repository._ - -## OBS_GetSegmentSnapshot( Point Geometry ) - -### Arguments - -Name | Description | Example Values ---- | --- | --- -point geometry | A point geometry. You can use the helper function, `CDB_LatLng` to quickly generate one from latitude and longitude | `CDB_LatLng(40.760410,-73.964242)` - -### Returns - -The segmentation function returns two segment levels for the point you requests, the x10\_segment and x55\_segment. These segmentation levels contain different classifications of population within with each segment. The function also returns the quantile of a number of census variables. For example, if total_poulation is at 90% quantile level then this tract has a higher total population than 90% of the other tracts. - -Name | Type | Description ----- | ---- | ----------- -x10\_segment | text | The demographic segment location at the 10 segment level, containing populations at high-levels, broken down into 10 broad categories -x55\_segment | text | The demographic segment location at the 55 segment level, containing more granular sub-levels to categorize the population - -An example response appears as follows: - -```json -obs_getsegmentsnapshot: { - "x10_segment": "Wealthy, urban without Kids", - "x55_segment": "Wealthy city commuters", - "us.census.acs.B01001001_quantile": "0.0180540540540541", - "us.census.acs.B01001002_quantile": "0.0279864864864865", - "us.census.acs.B01001026_quantile": "0.016527027027027", - "us.census.acs.B01002001_quantile": "0.507297297297297", - "us.census.acs.B03002003_quantile": "0.133162162162162", - "us.census.acs.B03002004_quantile": "0.283743243243243", - "us.census.acs.B03002006_quantile": "0.683945945945946", - "us.census.acs.B03002012_quantile": "0.494594594594595", - "us.census.acs.B05001006_quantile": "0.670972972972973", - "us.census.acs.B08006001_quantile": "0.0607567567567568", - "us.census.acs.B08006002_quantile": "0.0684324324324324", - "us.census.acs.B08006008_quantile": "0.565135135135135", - "us.census.acs.B08006009_quantile": "0.638081081081081", - "us.census.acs.B08006011_quantile": "0", - "us.census.acs.B08006015_quantile": "0.900932432432432", - "us.census.acs.B08006017_quantile": "0.186648648648649", - "us.census.acs.B09001001_quantile": "0.0193513513513514", - "us.census.acs.B11001001_quantile": "0.0617972972972973", - "us.census.acs.B14001001_quantile": "0.0179594594594595", - "us.census.acs.B14001002_quantile": "0.0140405405405405", - "us.census.acs.B14001005_quantile": "0", - "us.census.acs.B14001006_quantile": "0", - "us.census.acs.B14001007_quantile": "0", - "us.census.acs.B14001008_quantile": "0.0609054054054054", - "us.census.acs.B15003001_quantile": "0.0314594594594595", - "us.census.acs.B15003017_quantile": "0.0403378378378378", - "us.census.acs.B15003022_quantile": "0.285972972972973", - "us.census.acs.B15003023_quantile": "0.214567567567568", - "us.census.acs.B16001001_quantile": "0.0181621621621622", - "us.census.acs.B16001002_quantile": "0.0463108108108108", - "us.census.acs.B16001003_quantile": "0.540540540540541", - "us.census.acs.B17001001_quantile": "0.0237567567567568", - "us.census.acs.B17001002_quantile": "0.155972972972973", - "us.census.acs.B19013001_quantile": "0.380662162162162", - "us.census.acs.B19083001_quantile": "0.986891891891892", - "us.census.acs.B19301001_quantile": "0.989594594594595", - "us.census.acs.B25001001_quantile": "0.998418918918919", - "us.census.acs.B25002003_quantile": "0.999824324324324", - "us.census.acs.B25004002_quantile": "0.999986486486486", - "us.census.acs.B25004004_quantile": "0.999662162162162", - "us.census.acs.B25058001_quantile": "0.679054054054054", - "us.census.acs.B25071001_quantile": "0.569716216216216", - "us.census.acs.B25075001_quantile": "0.0415", - "us.census.acs.B25075025_quantile": "0.891702702702703" -} -``` - -The possible segments are: - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
X10 segment X55 Segment
Hispanic and kids
Middle Class, Educated, Suburban, Mixed Race
Low Income on Urban Periphery
Suburban, Young and Low-income
low-income, urban, young, unmarried
Low education, mainly suburban
Young, working class and rural
Low-Income with gentrification
Low Income and Diverse
High school education Long Commuters, Black, White Hispanic mix
Rural, Bachelors or college degree, Rent owned mix
Rural,High School Education, Owns property
Young, City based renters in Sparse neighborhoods, Low poverty
Low income, minority mix
Predominantly black, high high school attainment, home owners
White and minority mix multilingual, mixed income / education. Married
Hispanic Black mix multilingual, high poverty, renters, uses public transport
Predominantly black renters, rent own mix
Middle income, single family homes
Lower Middle Income with higher rent burden
Black and mixed community with rent burden
Lower Middle Income with affordable housing
Relatively affordable, satisfied lower middle class
Satisfied Lower Middle Income Higher Rent Costs
Suburban/Rural Satisfied, decently educated lower middle class
Struggling lower middle class with rent burden
Older white home owners, less comfortable financially
Older home owners, more financially comfortable, some diversity
Native American
Younger, poorer,single parent family Native Americans
Older, middle income Native Americans once married and Educated
Old Wealthy, White
Older, mixed race professionals
Works from home, Highly Educated, Super Wealthy
Retired Grandparents
Wealthy and Rural Living
Wealthy, Retired Mountains/Coasts
Wealthy Diverse Suburbanites On the Coasts
Retirement Communitties
Low Income African American
Urban - Inner city
Rural families
Residential institutions, young people
College towns
College town with poverty
University campus wider area
City Outskirt University Campuses
City Center University Campuses
Wealthy Nuclear Families
Lower educational attainment, Homeowner, Low rent
Younger, Long Commuter in dense neighborhood
Long commuters White black mix
Low rent in built up neighborhoods
Renters within cities, mixed income areas, White/Hispanic mix, Unmarried
Older Home owners with high income
Older home owners and very high income
White Asian Mix Big City Burbs Dwellers
Bachelors degree Mid income With Mortgages
Asian Hispanic Mix, Mid income
Bachelors degree Higher income Home Owners
Wealthy, urban, and kid-free
Wealthy city commuters
New Developments
Very wealthy, multiple million dollar homes
High rise, dense urbanites
- - -### Examples - -```bash -https://{username}.carto.com/api/v2/sql?q=SELECT * FROM -OBS_GetSegmentSnapshot({{point geometry}}) -``` - -##### Get the Geographic Snapshot of a Segmentation - -__Get the Segmentation Snapshot around the MGM Grand__ - - -```bash -https://{username}.carto.com/api/v2/sql?q=SELECT * FROM -OBS_GetSegmentSnapshot(CDB_LatLng(36.10222, -115.169516)) -``` - -__Get the Segmentation Snapshot at CARTO's NYC HQ__ - - -```bash -https://{username}.carto.com/api/v2/sql?q=SELECT * FROM -OBS_GetSegmentSnapshot(CDB_LatLng(40.704512, -73.936669)) -``` From 02071f1cde8621939101a12bc63932534ffa46c4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?I=C3=B1igo=20Medina?= Date: Fri, 13 Apr 2018 10:15:28 +0200 Subject: [PATCH 18/45] Update 01-geocoding-functions.md --- docs/reference/01-geocoding-functions.md | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/docs/reference/01-geocoding-functions.md b/docs/reference/01-geocoding-functions.md index f82f457..9588597 100644 --- a/docs/reference/01-geocoding-functions.md +++ b/docs/reference/01-geocoding-functions.md @@ -2,7 +2,7 @@ The [geocoder](https://carto.com/data/geocoder-api/) functions allow you to match your data with geometries on your map. This geocoding service can be used programatically to geocode datasets via the CARTO SQL API. It is fed from _Open Data_ and it serves geometries for countries, provinces, states, cities, postal codes, IP addresses and street addresses. CARTO provides functions for several different categories of geocoding through the Data Services API. -_**This service is subject to quota limitations and extra fees may apply**. View the [Quota Information](https://carto.com/docs/carto-engine/dataservices-api/quota-information/) section for details and recommendations about to quota consumption._ +**Warning:** This service is subject to quota limitations and extra fees may apply. View the [Quota Information]({{site.dataservicesapi_docs}}/support/quota-information/) section for details and recommendations about to quota consumption. The following example displays how to geocode a single country: @@ -43,16 +43,12 @@ Name | Type | Description Geometry (polygon, EPSG 4326) or null -##### Example - -###### Update the geometry of a table to geocode it - +**Example:** +Update the geometry of a table to geocode it ```bash UPDATE {tablename} SET the_geom = cdb_geocode_admin0_polygon({country_column}) ``` - -###### Insert a geocoded row into a table - +Insert a geocoded row into a table ```bash INSERT INTO {tablename} (the_geom) SELECT cdb_geocode_admin0_polygon('France') ``` From eb1e3fc5e5c0aa8721cffe63a6d8beeca89b7570 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?I=C3=B1igo=20Medina?= Date: Fri, 13 Apr 2018 10:17:28 +0200 Subject: [PATCH 19/45] Update 01-geocoding-functions.md --- docs/reference/01-geocoding-functions.md | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/docs/reference/01-geocoding-functions.md b/docs/reference/01-geocoding-functions.md index 9588597..2558c3f 100644 --- a/docs/reference/01-geocoding-functions.md +++ b/docs/reference/01-geocoding-functions.md @@ -43,12 +43,15 @@ Name | Type | Description Geometry (polygon, EPSG 4326) or null -**Example:** -Update the geometry of a table to geocode it +### Example + +#### Update the geometry of a table to geocode it + ```bash UPDATE {tablename} SET the_geom = cdb_geocode_admin0_polygon({country_column}) ``` -Insert a geocoded row into a table + +#### Insert a geocoded row into a table ```bash INSERT INTO {tablename} (the_geom) SELECT cdb_geocode_admin0_polygon('France') ``` From 8e49d837b0e612a143b447d7620706406ab13873 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?I=C3=B1igo=20Medina?= Date: Fri, 13 Apr 2018 10:22:27 +0200 Subject: [PATCH 20/45] Create test --- docs/img/test | 1 + 1 file changed, 1 insertion(+) create mode 100644 docs/img/test diff --git a/docs/img/test b/docs/img/test new file mode 100644 index 0000000..9daeafb --- /dev/null +++ b/docs/img/test @@ -0,0 +1 @@ +test From 8ceb1e02a5bc8f82f370caea4d09191436a8c281 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?I=C3=B1igo=20Medina?= Date: Fri, 13 Apr 2018 10:22:51 +0200 Subject: [PATCH 21/45] Add files via upload --- docs/img/avatar.gif | Bin 0 -> 97238 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 docs/img/avatar.gif diff --git a/docs/img/avatar.gif b/docs/img/avatar.gif new file mode 100644 index 0000000000000000000000000000000000000000..586a34d851830c9103de398f859ee69821dcdbe7 GIT binary patch literal 97238 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

-EKi5$Mp9MIU!_WuI%6185 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 Tk_FHM2m}EC-!cdd1YG(r`7ce) literal 0 HcmV?d00001 From efad90aa624b2979584d648c742d86ed56135b92 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?I=C3=B1igo=20Medina?= Date: Fri, 13 Apr 2018 10:23:05 +0200 Subject: [PATCH 22/45] Delete test --- docs/img/test | 1 - 1 file changed, 1 deletion(-) delete mode 100644 docs/img/test diff --git a/docs/img/test b/docs/img/test deleted file mode 100644 index 9daeafb..0000000 --- a/docs/img/test +++ /dev/null @@ -1 +0,0 @@ -test From a56e9f63a37ba74d2f4ab35e44437205e0962c0f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?I=C3=B1igo=20Medina?= Date: Fri, 13 Apr 2018 10:26:29 +0200 Subject: [PATCH 23/45] Update 01-geocoding-functions.md --- docs/reference/01-geocoding-functions.md | 27 ++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/docs/reference/01-geocoding-functions.md b/docs/reference/01-geocoding-functions.md index 2558c3f..350140e 100644 --- a/docs/reference/01-geocoding-functions.md +++ b/docs/reference/01-geocoding-functions.md @@ -1,3 +1,30 @@ +## Introduction + +The CARTO Data Services API offers a set of location based services that can be used to programatically customize subsets of data for your visualizations. + +The contents described in this document are subject to CARTO's [Terms of Service](https://carto.com/legal/) + +## Authentication + +Data Services API, like any other CARTO platform's component, requires using an API Key. From your CARTO dashboard, click _[Your API keys](https://carto.com/login)_ from the avatar drop-down menu to view your uniquely generated API Key for managing data with CARTO Engine. + +![Your API Keys](../img/avatar.gif) + +Learn more about the [basics of authorization]({{site.fundamental_docs}}/authorization/), or dig into the details of [Auth API]({{site.authapi_docs}}/), if you want to know more about this part of CARTO platform. + +The examples in this documentation may include a placeholder for the API Key. Ensure that you modify any placeholder parameters with your own credentials. + +## Versioning + +Data Services API uses [Semantic Versioning](http://semver.org/). View our Github repository to find tags for each [release](https://github.com/CartoDB/data-services-api/releases). + +## Error handling + +Most of the errors fired by the API are handled by the API itself. It triggers a `CartoError` every time an error happens. + +A cartoError is an object containing a single `message` field with a string explaining the error. + + ## Geocoding Functions The [geocoder](https://carto.com/data/geocoder-api/) functions allow you to match your data with geometries on your map. This geocoding service can be used programatically to geocode datasets via the CARTO SQL API. It is fed from _Open Data_ and it serves geometries for countries, provinces, states, cities, postal codes, IP addresses and street addresses. CARTO provides functions for several different categories of geocoding through the Data Services API. From 8be34f0132dd6938092005f8f3d0b06885a2067e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?I=C3=B1igo=20Medina?= Date: Fri, 13 Apr 2018 10:31:37 +0200 Subject: [PATCH 24/45] Create 01-introduction.md --- docs/reference/01-introduction.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 docs/reference/01-introduction.md diff --git a/docs/reference/01-introduction.md b/docs/reference/01-introduction.md new file mode 100644 index 0000000..f86c955 --- /dev/null +++ b/docs/reference/01-introduction.md @@ -0,0 +1,5 @@ +## Introduction + +The CARTO Data Services API offers a set of location based services that can be used to programatically customize subsets of data for your visualizations. + +The contents described in this document are subject to CARTO's [Terms of Service](https://carto.com/legal/) From 341c2409076b644bb3404ed81cdf3e0f3ed55c60 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?I=C3=B1igo=20Medina?= Date: Fri, 13 Apr 2018 10:32:07 +0200 Subject: [PATCH 25/45] Create 02-authentication.md --- docs/reference/02-authentication.md | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 docs/reference/02-authentication.md diff --git a/docs/reference/02-authentication.md b/docs/reference/02-authentication.md new file mode 100644 index 0000000..2c9ff07 --- /dev/null +++ b/docs/reference/02-authentication.md @@ -0,0 +1,9 @@ +## Authentication + +Data Services API, like any other CARTO platform's component, requires using an API Key. From your CARTO dashboard, click _[Your API keys](https://carto.com/login)_ from the avatar drop-down menu to view your uniquely generated API Key for managing data with CARTO Engine. + +![Your API Keys](../img/avatar.gif) + +Learn more about the [basics of authorization]({{site.fundamental_docs}}/authorization/), or dig into the details of [Auth API]({{site.authapi_docs}}/), if you want to know more about this part of CARTO platform. + +The examples in this documentation may include a placeholder for the API Key. Ensure that you modify any placeholder parameters with your own credentials. From 6b38d891532e83d121deadfb74aac09ca08e57b6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?I=C3=B1igo=20Medina?= Date: Fri, 13 Apr 2018 10:32:43 +0200 Subject: [PATCH 26/45] Create 03-versioning.md --- docs/reference/03-versioning.md | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 docs/reference/03-versioning.md diff --git a/docs/reference/03-versioning.md b/docs/reference/03-versioning.md new file mode 100644 index 0000000..80d2a59 --- /dev/null +++ b/docs/reference/03-versioning.md @@ -0,0 +1,3 @@ +## Versioning + +Data Services API uses [Semantic Versioning](http://semver.org/). View our Github repository to find tags for each [release](https://github.com/CartoDB/data-services-api/releases). From e4256c1eb1fb6ceb04dddcbf9e1740b188ceaa3f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?I=C3=B1igo=20Medina?= Date: Fri, 13 Apr 2018 10:33:03 +0200 Subject: [PATCH 27/45] Create 04-error-handling.md --- docs/reference/04-error-handling.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 docs/reference/04-error-handling.md diff --git a/docs/reference/04-error-handling.md b/docs/reference/04-error-handling.md new file mode 100644 index 0000000..aef0671 --- /dev/null +++ b/docs/reference/04-error-handling.md @@ -0,0 +1,5 @@ +## Error handling + +Most of the errors fired by the API are handled by the API itself. It triggers a `CartoError` every time an error happens. + +A cartoError is an object containing a single `message` field with a string explaining the error. From 1a7d0e5a8f261d16d835dd3bbac47d39cabe24a6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?I=C3=B1igo=20Medina?= Date: Fri, 13 Apr 2018 10:33:30 +0200 Subject: [PATCH 28/45] Rename 01-geocoding-functions.md to 05-geocoding-functions.md --- .../{01-geocoding-functions.md => 05-geocoding-functions.md} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename docs/reference/{01-geocoding-functions.md => 05-geocoding-functions.md} (100%) diff --git a/docs/reference/01-geocoding-functions.md b/docs/reference/05-geocoding-functions.md similarity index 100% rename from docs/reference/01-geocoding-functions.md rename to docs/reference/05-geocoding-functions.md From 971695899b8423a7418c84d7126a8b046c1d9280 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?I=C3=B1igo=20Medina?= Date: Fri, 13 Apr 2018 10:34:47 +0200 Subject: [PATCH 29/45] Rename 02-isoline-functions.md to 06-isoline-functions.md --- .../{02-isoline-functions.md => 06-isoline-functions.md} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename docs/reference/{02-isoline-functions.md => 06-isoline-functions.md} (100%) diff --git a/docs/reference/02-isoline-functions.md b/docs/reference/06-isoline-functions.md similarity index 100% rename from docs/reference/02-isoline-functions.md rename to docs/reference/06-isoline-functions.md From 214b84f60618d0146195642bfa4853c2409deaf5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?I=C3=B1igo=20Medina?= Date: Fri, 13 Apr 2018 10:35:05 +0200 Subject: [PATCH 30/45] Rename 03-demographic-functions.md to 07-demographic-functions.md --- .../{03-demographic-functions.md => 07-demographic-functions.md} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename docs/reference/{03-demographic-functions.md => 07-demographic-functions.md} (100%) diff --git a/docs/reference/03-demographic-functions.md b/docs/reference/07-demographic-functions.md similarity index 100% rename from docs/reference/03-demographic-functions.md rename to docs/reference/07-demographic-functions.md From 7727fbb1c7d53a312abd0140825d4469b759e431 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?I=C3=B1igo=20Medina?= Date: Fri, 13 Apr 2018 10:36:44 +0200 Subject: [PATCH 31/45] Rename 04-routing-functions.md to 08-routing-functions.md --- .../{04-routing-functions.md => 08-routing-functions.md} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename docs/reference/{04-routing-functions.md => 08-routing-functions.md} (100%) diff --git a/docs/reference/04-routing-functions.md b/docs/reference/08-routing-functions.md similarity index 100% rename from docs/reference/04-routing-functions.md rename to docs/reference/08-routing-functions.md From ce79038f46ba553c21c4cb576f86ad4e1684a9ce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?I=C3=B1igo=20Medina?= Date: Fri, 13 Apr 2018 10:43:04 +0200 Subject: [PATCH 32/45] Rename 05-segementation-functions.md to 09-segementation-functions.md --- ...5-segementation-functions.md => 09-segementation-functions.md} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename docs/reference/{05-segementation-functions.md => 09-segementation-functions.md} (100%) diff --git a/docs/reference/05-segementation-functions.md b/docs/reference/09-segementation-functions.md similarity index 100% rename from docs/reference/05-segementation-functions.md rename to docs/reference/09-segementation-functions.md From c682bec3877d3bd722ef412f703a0d5382046f92 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?I=C3=B1igo=20Medina?= Date: Fri, 13 Apr 2018 10:44:51 +0200 Subject: [PATCH 33/45] Update 05-geocoding-functions.md --- docs/reference/05-geocoding-functions.md | 27 ------------------------ 1 file changed, 27 deletions(-) diff --git a/docs/reference/05-geocoding-functions.md b/docs/reference/05-geocoding-functions.md index 350140e..2558c3f 100644 --- a/docs/reference/05-geocoding-functions.md +++ b/docs/reference/05-geocoding-functions.md @@ -1,30 +1,3 @@ -## Introduction - -The CARTO Data Services API offers a set of location based services that can be used to programatically customize subsets of data for your visualizations. - -The contents described in this document are subject to CARTO's [Terms of Service](https://carto.com/legal/) - -## Authentication - -Data Services API, like any other CARTO platform's component, requires using an API Key. From your CARTO dashboard, click _[Your API keys](https://carto.com/login)_ from the avatar drop-down menu to view your uniquely generated API Key for managing data with CARTO Engine. - -![Your API Keys](../img/avatar.gif) - -Learn more about the [basics of authorization]({{site.fundamental_docs}}/authorization/), or dig into the details of [Auth API]({{site.authapi_docs}}/), if you want to know more about this part of CARTO platform. - -The examples in this documentation may include a placeholder for the API Key. Ensure that you modify any placeholder parameters with your own credentials. - -## Versioning - -Data Services API uses [Semantic Versioning](http://semver.org/). View our Github repository to find tags for each [release](https://github.com/CartoDB/data-services-api/releases). - -## Error handling - -Most of the errors fired by the API are handled by the API itself. It triggers a `CartoError` every time an error happens. - -A cartoError is an object containing a single `message` field with a string explaining the error. - - ## Geocoding Functions The [geocoder](https://carto.com/data/geocoder-api/) functions allow you to match your data with geometries on your map. This geocoding service can be used programatically to geocode datasets via the CARTO SQL API. It is fed from _Open Data_ and it serves geometries for countries, provinces, states, cities, postal codes, IP addresses and street addresses. CARTO provides functions for several different categories of geocoding through the Data Services API. From 920c5a9fc0a55c2a19ff75300331fa0d263ae005 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?I=C3=B1igo=20Medina?= Date: Fri, 13 Apr 2018 10:45:34 +0200 Subject: [PATCH 34/45] Update 02-authentication.md --- docs/reference/02-authentication.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/reference/02-authentication.md b/docs/reference/02-authentication.md index 2c9ff07..f78850e 100644 --- a/docs/reference/02-authentication.md +++ b/docs/reference/02-authentication.md @@ -1,6 +1,6 @@ ## Authentication -Data Services API, like any other CARTO platform's component, requires using an API Key. From your CARTO dashboard, click _[Your API keys](https://carto.com/login)_ from the avatar drop-down menu to view your uniquely generated API Key for managing data with CARTO Engine. +Data Services API, like any other [CARTO platform's component]({{site.fundamental_docs}}/authorization/), requires using an API Key. From your CARTO dashboard, click _[Your API keys](https://carto.com/login)_ from the avatar drop-down menu to view your uniquely generated API Key for managing data with CARTO Engine. ![Your API Keys](../img/avatar.gif) From 6cc6ee81621e1f35e38ef506e73123ef46e19394 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?I=C3=B1igo=20Medina?= Date: Fri, 13 Apr 2018 10:46:53 +0200 Subject: [PATCH 35/45] Update 02-authentication.md --- docs/reference/02-authentication.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/reference/02-authentication.md b/docs/reference/02-authentication.md index f78850e..4bb869f 100644 --- a/docs/reference/02-authentication.md +++ b/docs/reference/02-authentication.md @@ -1,6 +1,6 @@ ## Authentication -Data Services API, like any other [CARTO platform's component]({{site.fundamental_docs}}/authorization/), requires using an API Key. From your CARTO dashboard, click _[Your API keys](https://carto.com/login)_ from the avatar drop-down menu to view your uniquely generated API Key for managing data with CARTO Engine. +Data Services API, like any other [CARTO platform's component]({{site.fundamental_docs}}/components/), requires using an API Key. From your CARTO dashboard, click _[Your API keys](https://carto.com/login)_ from the avatar drop-down menu to view your uniquely generated API Key for managing data with CARTO Engine. ![Your API Keys](../img/avatar.gif) From cb7e9d48f43a263d56a592ef8e6ead4dfccb6a6f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?I=C3=B1igo=20Medina?= Date: Tue, 17 Apr 2018 14:43:12 +0200 Subject: [PATCH 36/45] Update 02-contribute.md --- docs/support/02-contribute.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/support/02-contribute.md b/docs/support/02-contribute.md index 9b62d4f..43e03fe 100644 --- a/docs/support/02-contribute.md +++ b/docs/support/02-contribute.md @@ -27,7 +27,7 @@ If you want more detailed information, this [GitHub guide](https://guides.github ## Completing documentation -Data Services API documentation is located in ```docs/```. That folder is the content that appears in the [Developer Center](http://carto.com/developer-center/data-services-api/). Just follow the instructions described in [contributing code](#contributing-code) and after accepting your pull request, we will make it appear online :). +Data Services API documentation is located in ```docs/```. That folder is the content that appears in the [Developer Center](http://carto.com/developers/data-services-api/). Just follow the instructions described in [contributing code](#contributing-code) and after accepting your pull request, we will make it appear online :). **Tip:** A convenient, easy way of proposing changes in documentation is by using the GitHub editor directly on the web. You can easily create a branch with your changes and make a PR from there. From ab7bc424d305f56f09dcd20b1f7b9c8d97cdb14c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?I=C3=B1igo=20Medina=20=28aka=20MacGyver=29?= Date: Mon, 25 Jun 2018 12:41:40 +0200 Subject: [PATCH 37/45] remove references to providers depending on the platform --- docs/reference/05-geocoding-functions.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/reference/05-geocoding-functions.md b/docs/reference/05-geocoding-functions.md index 2558c3f..6f73568 100644 --- a/docs/reference/05-geocoding-functions.md +++ b/docs/reference/05-geocoding-functions.md @@ -311,9 +311,9 @@ INSERT INTO {tablename} (the_geom) SELECT cdb_geocode_ipaddress_point('102.23.34 ### Street-Level Geocoder -This function geocodes your data into a point geometry for a street address. CARTO uses several different service providers for street-level geocoding, depending on your platform. If you access CARTO on a Google Cloud Platform, [Google Maps geocoding](https://developers.google.com/maps/documentation/geocoding/intro) is applied. All other platform users are provided with [Mapbox geocoding services](https://www.mapbox.com/). [Contact us](mailto:sales@carto.com) if you have any specific questions or requirements about the location data service provider being used with your account._. +This function geocodes your data into a point geometry for a street address. CARTO platform uses [Mapbox geocoding services](https://www.mapbox.com/) as the service provider for street-level geocoding. [Contact us](mailto:sales@carto.com) if you have any specific questions or requirements about the location data service provider being used with your account. -**This service is subject to quota limitations, and extra fees may apply**. View the [Quota information](https://carto.com/docs/carto-engine/dataservices-api/quota-information/) for details and recommendations about quota consumption. +**This service is subject to quota limitations, and extra fees may apply**. View the [Quota information]({{site.dataservicesapi_docs}}/support/quota-information/) for details and recommendations about quota consumption. #### cdb_geocode_street_point(_search_text text, [city text], [state text], [country text]_) From 1f61419467f29ea22ad14f5b5e3abd0af0b2052c Mon Sep 17 00:00:00 2001 From: cillas Date: Wed, 8 Aug 2018 17:49:18 +0200 Subject: [PATCH 38/45] Fix typo in filename --- ...09-segementation-functions.md => 09-segmentation-functions.md} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename docs/reference/{09-segementation-functions.md => 09-segmentation-functions.md} (100%) diff --git a/docs/reference/09-segementation-functions.md b/docs/reference/09-segmentation-functions.md similarity index 100% rename from docs/reference/09-segementation-functions.md rename to docs/reference/09-segmentation-functions.md From 0bcdaeabc58c213bc53902f4bfdb1e55b313bd49 Mon Sep 17 00:00:00 2001 From: Mario de Frutos Date: Wed, 24 Oct 2018 11:59:06 +0200 Subject: [PATCH 39/45] Include note to explain why some isodistances could not be precise --- doc/isoline_functions.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/doc/isoline_functions.md b/doc/isoline_functions.md index 97949b9..743c589 100644 --- a/doc/isoline_functions.md +++ b/doc/isoline_functions.md @@ -16,6 +16,8 @@ The following functions provide an isoline generator service, based on time or d Displays a contoured line on a map, connecting geometries to a defined area, measured by an equal range of distance (in meters). +Note that not all the providers, for example TomTom, provide us a way to define the isoline limit in distance so we need to make some estimations. Due that estimations the produced isolines could not be 100% precise. + #### Arguments Name | Type | Description | Accepted values From e9856d92f6fa1f3fff20bc1359e6008811556b0a Mon Sep 17 00:00:00 2001 From: cillas Date: Fri, 14 Dec 2018 10:03:26 +0100 Subject: [PATCH 40/45] Replace mapbox with tomtom in support quota info docs --- docs/support/03-quota-information.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/support/03-quota-information.md b/docs/support/03-quota-information.md index c52b553..b12288c 100644 --- a/docs/support/03-quota-information.md +++ b/docs/support/03-quota-information.md @@ -59,9 +59,9 @@ Result: ```sql service | monthly_quota | used_quota | soft_limit | provider ----------------+---------------+------------+------------+------------------ - isolines | 100 | 0 | f | mapbox - hires_geocoder | 100 | 0 | f | mapbox - routing | 50 | 0 | f | mapbox + isolines | 100 | 0 | f | tomtom + hires_geocoder | 100 | 0 | f | tomtom + routing | 50 | 0 | f | tomtom observatory | 0 | 0 | f | data observatory (4 rows) From 2ae1547f3c36b13b4ad01559d30418b8b1b0e0c3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?I=C3=B1igo=20Medina=20=28aka=20MacGyver=29?= Date: Thu, 31 Jan 2019 14:45:30 +0100 Subject: [PATCH 41/45] update references to developer center components --- docs/guides/01-overview.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/guides/01-overview.md b/docs/guides/01-overview.md index 9eb1862..e3c2f99 100644 --- a/docs/guides/01-overview.md +++ b/docs/guides/01-overview.md @@ -2,7 +2,7 @@ By using CARTO libraries and the SQL API, you can apply location data services to your maps with unique data services functions. These functions are integrated with a number of internal and external services, enabling you to programatically customize subsets of data for your visualizations. These features are useful for geospatial analysis and the results can be saved, and stored, for additional location data service operations. -**Note:** Based on your account plan, some of these data services are subject to different [quota limitations](https://carto.com/docs/carto-engine/dataservices-api/quota-information/#quota-information). +**Note:** Based on your account plan, some of these data services are subject to different [quota limitations]({{site.dataservicesapi_docs}}/support/quota-information/). _In order to supply the best location data services from within our CARTO Engine, the Data Services API collaborates with [Mapbox](https://www.mapbox.com/) and several other geospatial service providers. [Contact us](mailto:sales@carto.com) if you have any specific questions or requirements about the location data service provider being used with your account._ @@ -14,19 +14,19 @@ The Data Services API also exposes its services directly through CARTO Builder. The geometries provided by this API are projected in the projection [WGS 84 SRID 4326](http://spatialreference.org/ref/epsg/wgs-84/). -**Note:** The Data Services API [geocoding functions](https://carto.com/docs/carto-engine/dataservices-api/geocoding-functions/#geocoding-functions) return different types of geometries (points or polygons) as result of different geocoding processes. The CARTO Engine does not support multi-geometry layers or datasets, therefore you must confirm that you are using consistent geometry types inside a table, to avoid future conflicts in your map visualization. +**Note:** The Data Services API [geocoding functions]({{site.dataservicesapi_docs}}/reference/#geocoding-functions) return different types of geometries (points or polygons) as result of different geocoding processes. The CARTO Engine does not support multi-geometry layers or datasets, therefore you must confirm that you are using consistent geometry types inside a table, to avoid future conflicts in your map visualization. #### Best Practices _Be mindful of the following usage notes when using the Data Services functions with the SQL API:_ -It is discouraged to use the SELECT operation with the Data Services API functions in your map layers, as these type of queries consume quota when rendering tiles for your live map views. It may also result in sync performance issues, due to executing multiple requests to the API each time your map is viewed. See details about [Quota Consumption](https://carto.com/docs/carto-engine/dataservices-api/quota-information/#quota-consumption). +It is discouraged to use the SELECT operation with the Data Services API functions in your map layers, as these type of queries consume quota when rendering tiles for your live map views. It may also result in sync performance issues, due to executing multiple requests to the API each time your map is viewed. See details about [Quota Consumption]({{site.dataservicesapi_docs}}/support/quota-information/). The Data Services API is **recommended** to be used with INSERT or UPDATE operations, for applying location data to your tables. While SELECT (retrieve) is standard for SQL API requests, be mindful of quota consumption and use INSERT (to insert a new record) or UPDATE (to update an existing record), for best practices. ### Authentication -All requests performed to the CARTO Data Services API must be authenticated with the user API Key. For more information about where to find your API Key, and how to authenticate your SQL API requests, view the [SQL API authentication](/carto-engine/sql-api/authentication/) documentation. +All requests performed to the CARTO Data Services API must be authenticated with the user API Key. For more information about where to find your API Key, and how to authenticate your SQL API requests, view the [Auth API]({{site.authapi_docs}}/) documentation. ### Errors @@ -40,7 +40,7 @@ Errors are described in the response of the request. An example is as follows: } ``` -Since the Data Services API is used on top of the CARTO SQL API, you can refer to the [Making calls to the SQL API](https://carto.com/docs/carto-engine/sql-api/making-calls/) documentation for help debugging your SQL errors. +Since the Data Services API is used on top of the CARTO SQL API, you can refer to the [Making calls to the SQL API]({{site.sqlapi_docs}}/guides/making-calls/) documentation for help debugging your SQL errors. If the requested information is not in the CARTO geocoding database, or if CARTO is unable to recognize your input and match it with a result, the geocoding function returns `null` as a result. From f1e4ff6f33125a1722b2b787be851eff69883890 Mon Sep 17 00:00:00 2001 From: csubira Date: Fri, 1 Mar 2019 11:53:49 +0100 Subject: [PATCH 42/45] Reorder dev center folder --- docs/{ => developer-center}/examples/01-example.md | 0 docs/{ => developer-center}/guides/01-overview.md | 0 docs/{ => developer-center}/img/avatar.gif | Bin .../reference/01-introduction.md | 0 .../reference/02-authentication.md | 0 .../reference/03-versioning.md | 0 .../reference/04-error-handling.md | 0 .../reference/05-geocoding-functions.md | 0 .../reference/06-isoline-functions.md | 2 ++ .../reference/07-demographic-functions.md | 0 .../reference/08-routing-functions.md | 0 .../reference/09-segmentation-functions.md | 0 .../support/01-support-options.md | 0 .../{ => developer-center}/support/02-contribute.md | 0 .../support/03-quota-information.md | 0 .../support/04-rate-limits.md | 0 {doc => docs}/internal/exception_safe.md | 0 {doc => docs}/internal/internal_doc.md | 0 {doc => docs}/internal/quota_management.md | 0 19 files changed, 2 insertions(+) rename docs/{ => developer-center}/examples/01-example.md (100%) rename docs/{ => developer-center}/guides/01-overview.md (100%) rename docs/{ => developer-center}/img/avatar.gif (100%) rename docs/{ => developer-center}/reference/01-introduction.md (100%) rename docs/{ => developer-center}/reference/02-authentication.md (100%) rename docs/{ => developer-center}/reference/03-versioning.md (100%) rename docs/{ => developer-center}/reference/04-error-handling.md (100%) rename docs/{ => developer-center}/reference/05-geocoding-functions.md (100%) rename docs/{ => developer-center}/reference/06-isoline-functions.md (96%) rename docs/{ => developer-center}/reference/07-demographic-functions.md (100%) rename docs/{ => developer-center}/reference/08-routing-functions.md (100%) rename docs/{ => developer-center}/reference/09-segmentation-functions.md (100%) rename docs/{ => developer-center}/support/01-support-options.md (100%) rename docs/{ => developer-center}/support/02-contribute.md (100%) rename docs/{ => developer-center}/support/03-quota-information.md (100%) rename docs/{ => developer-center}/support/04-rate-limits.md (100%) rename {doc => docs}/internal/exception_safe.md (100%) rename {doc => docs}/internal/internal_doc.md (100%) rename {doc => docs}/internal/quota_management.md (100%) diff --git a/docs/examples/01-example.md b/docs/developer-center/examples/01-example.md similarity index 100% rename from docs/examples/01-example.md rename to docs/developer-center/examples/01-example.md diff --git a/docs/guides/01-overview.md b/docs/developer-center/guides/01-overview.md similarity index 100% rename from docs/guides/01-overview.md rename to docs/developer-center/guides/01-overview.md diff --git a/docs/img/avatar.gif b/docs/developer-center/img/avatar.gif similarity index 100% rename from docs/img/avatar.gif rename to docs/developer-center/img/avatar.gif diff --git a/docs/reference/01-introduction.md b/docs/developer-center/reference/01-introduction.md similarity index 100% rename from docs/reference/01-introduction.md rename to docs/developer-center/reference/01-introduction.md diff --git a/docs/reference/02-authentication.md b/docs/developer-center/reference/02-authentication.md similarity index 100% rename from docs/reference/02-authentication.md rename to docs/developer-center/reference/02-authentication.md diff --git a/docs/reference/03-versioning.md b/docs/developer-center/reference/03-versioning.md similarity index 100% rename from docs/reference/03-versioning.md rename to docs/developer-center/reference/03-versioning.md diff --git a/docs/reference/04-error-handling.md b/docs/developer-center/reference/04-error-handling.md similarity index 100% rename from docs/reference/04-error-handling.md rename to docs/developer-center/reference/04-error-handling.md diff --git a/docs/reference/05-geocoding-functions.md b/docs/developer-center/reference/05-geocoding-functions.md similarity index 100% rename from docs/reference/05-geocoding-functions.md rename to docs/developer-center/reference/05-geocoding-functions.md diff --git a/docs/reference/06-isoline-functions.md b/docs/developer-center/reference/06-isoline-functions.md similarity index 96% rename from docs/reference/06-isoline-functions.md rename to docs/developer-center/reference/06-isoline-functions.md index 4b1cc49..b3e20cc 100644 --- a/docs/reference/06-isoline-functions.md +++ b/docs/developer-center/reference/06-isoline-functions.md @@ -16,6 +16,8 @@ The following functions provide an isoline generator service, based on time or d Displays a contoured line on a map, connecting geometries to a defined area, measured by an equal range of distance (in meters). +Note that not all the providers, for example TomTom, provide us a way to define the isoline limit in distance so we need to make some estimations. Due that estimations the produced isolines could not be 100% precise. + ##### Arguments Name | Type | Description | Accepted values diff --git a/docs/reference/07-demographic-functions.md b/docs/developer-center/reference/07-demographic-functions.md similarity index 100% rename from docs/reference/07-demographic-functions.md rename to docs/developer-center/reference/07-demographic-functions.md diff --git a/docs/reference/08-routing-functions.md b/docs/developer-center/reference/08-routing-functions.md similarity index 100% rename from docs/reference/08-routing-functions.md rename to docs/developer-center/reference/08-routing-functions.md diff --git a/docs/reference/09-segmentation-functions.md b/docs/developer-center/reference/09-segmentation-functions.md similarity index 100% rename from docs/reference/09-segmentation-functions.md rename to docs/developer-center/reference/09-segmentation-functions.md diff --git a/docs/support/01-support-options.md b/docs/developer-center/support/01-support-options.md similarity index 100% rename from docs/support/01-support-options.md rename to docs/developer-center/support/01-support-options.md diff --git a/docs/support/02-contribute.md b/docs/developer-center/support/02-contribute.md similarity index 100% rename from docs/support/02-contribute.md rename to docs/developer-center/support/02-contribute.md diff --git a/docs/support/03-quota-information.md b/docs/developer-center/support/03-quota-information.md similarity index 100% rename from docs/support/03-quota-information.md rename to docs/developer-center/support/03-quota-information.md diff --git a/docs/support/04-rate-limits.md b/docs/developer-center/support/04-rate-limits.md similarity index 100% rename from docs/support/04-rate-limits.md rename to docs/developer-center/support/04-rate-limits.md diff --git a/doc/internal/exception_safe.md b/docs/internal/exception_safe.md similarity index 100% rename from doc/internal/exception_safe.md rename to docs/internal/exception_safe.md diff --git a/doc/internal/internal_doc.md b/docs/internal/internal_doc.md similarity index 100% rename from doc/internal/internal_doc.md rename to docs/internal/internal_doc.md diff --git a/doc/internal/quota_management.md b/docs/internal/quota_management.md similarity index 100% rename from doc/internal/quota_management.md rename to docs/internal/quota_management.md From a31b429c7a67da59b67f7f0d03264a9e3418ac24 Mon Sep 17 00:00:00 2001 From: csubira Date: Fri, 1 Mar 2019 11:54:33 +0100 Subject: [PATCH 43/45] Remove older content --- doc/API.md | 13 -- doc/demographic_functions.md | 155 --------------- doc/geocoding_functions.md | 348 ---------------------------------- doc/isoline_functions.md | 106 ----------- doc/overview.md | 49 ----- doc/quota_information.md | 135 ------------- doc/rate_limits.md | 197 ------------------- doc/routing_functions.md | 84 -------- doc/segmentation_functions.md | 181 ------------------ 9 files changed, 1268 deletions(-) delete mode 100644 doc/API.md delete mode 100644 doc/demographic_functions.md delete mode 100644 doc/geocoding_functions.md delete mode 100644 doc/isoline_functions.md delete mode 100644 doc/overview.md delete mode 100644 doc/quota_information.md delete mode 100644 doc/rate_limits.md delete mode 100644 doc/routing_functions.md delete mode 100644 doc/segmentation_functions.md diff --git a/doc/API.md b/doc/API.md deleted file mode 100644 index 816c561..0000000 --- a/doc/API.md +++ /dev/null @@ -1,13 +0,0 @@ -# Data Services API - -The CARTO Data Services API offers a set of location based services that can be used programatically to empower your geospatial applications. - -## Documentation - -* [Overview](overview.md) -* [Geocoding Functions](geocoding_functions.md) -* [Isoline Functions](isoline_functions.md) -* [Routing Functions](routing_functions.md) -* [Demographic Functions](demographic_functions.md) -* [Segmentation Functions](segmentation_functions.md) -* [Quota Information](quota_information.md) \ No newline at end of file diff --git a/doc/demographic_functions.md b/doc/demographic_functions.md deleted file mode 100644 index 207082d..0000000 --- a/doc/demographic_functions.md +++ /dev/null @@ -1,155 +0,0 @@ -# Demographic Functions - -The Demographic Snapshot enables you to collect demographic reports around a point location. For example, you can take the coordinates of a coffee shop and find the average population characteristics, such as total population, educational attainment, housing and income information around that location. You can use raw street addresses by combining the Demographic Snapshot with CARTO's geocoding features. If you need help creating coordinates from addresses, see the [Geocoding Functions](https://carto.com/docs/carto-engine/dataservices-api/geocoding-functions/) documentation. - -_**Note:** The Demographic Snapshot functions are only available for the United States._ - -## OBS_GetDemographicSnapshot( point geometry ) - -Fields returned include information about income, education, transportation, race, and more. Not all fields will have information for every coordinate queried. - -### Arguments - -Name | Description | Example Values ---- | --- | --- -point geometry | A point geometry. You can use the helper function, `CDB_LatLng` to quickly generate one from latitude and longitude | `CDB_LatLng(40.760410,-73.964242)` - -### Returns - -The Demographic Snapshot contains a broad subset of demographic measures in the Data Observatory. Over 80 measurements are returned by a single API request. For each demographic measure, the API returns the following values. - -Value | Name | Tablename | Aggregate | Type | Description ------ | ---- | --------- | --------- | ---- |------------ -The value of the measure at the point you requested | The name of the measure | The table it was drawn from | Indicated if the measure is a count or median. | postgresql | A description of the measure - -For example the "Female Population" measure returns - -```json -obs_getdemographicsnapshot: { - "value": 32.5395066379175, - "name": "Female Population", - "tablename": "obs_1a098da56badf5f32e336002b0a81708c40d29cd", - "aggregate": "sum", - "type": "Numeric", - "description": "The number of people within each geography who are female." -} -``` - -**For details, see the [Glossary of Demographic Measures](#glossary-of-demographic-measures).** - -### Examples - -```bash -https://{username}.carto.com/api/v2/sql?q=SELECT * FROM -OBS_GetDemographicSnapshot({{point geometry}}) -``` - -##### Get the Geographic Snapshot of a Demographic - -__Get the Demographic Snapshot at Camp David__ - -```bash -https://{username}.carto.com/api/v2/sql?q=SELECT * FROM -OBS_GetDemographicSnapshot(CDB_LatLng(39.648333, -77.465)) -``` - -__Get the Demographic Snapshot in the Upper West Side__ - -```bash -https://{username}.carto.com/api/v2/sql?q=SELECT * FROM -OBS_GetDemographicSnapshot(CDB_LatLng(40.80, -73.960)) -``` - -## Glossary of Demographic Measures - -This list contains the demographic measures and response names for results from the ```OBS_GetDemographicSnapshot``` function. - - Measure name | Measure Description | Response Mame | Response Units ---- | --- | --- | --- -Total Population | The total number of all people living in a given geographic area. This is a very useful catch-all denominator when calculating rates. | total_pop | Count per sq. km -Male Population | The number of people within each geography who are male. | male_pop | Count per sq. km -Female Population | The number of people within each geography who are female.| female_pop | Count per sq. km -Population not Hispanic | The number of people not identifying as Hispanic or Latino in each geography. | not_hispanic_pop | Count per sq. km -White Population | The number of people identifying as white, non-Hispanic in each geography. | white_pop | Count per sq. km -Black or African American Population| The number of people identifying as black or African American, non-Hispanic in each geography. | black_pop | Count per sq. km -American Indian and Alaska Native Population | The number of people identifying as American Indian or Alaska native in each geography.| amerindian_pop| Count per sq. km -Asian Population | The number of people identifying as Asian, non-Hispanic in each geography.| asian_pop | Count per sq. km -Other Race population | The number of people identifying as another race in each geography. | other_race_pop | Count per sq. km -Two or more races population| The number of people identifying as two or more races in each geography | two_or_more_races_pop | Count per sq. km -Hispanic Population | The number of people identifying as Hispanic or Latino in each geography. | hispanic_pop | Count per sq. km -Not a U.S. Citizen Population | The number of people within each geography who indicated that they are not U.S. citizens. | not_us_citizen_pop | Count per sq. km -Median Age | The median age of all people in a given geographic area.| median_age | Years -Children under 18 Years of Age | The number of people within each geography who are under 18 years of age.| children | Count per sq. km -Population 15 Years and Over | The number of people in a geographic area who are over the age of 15. This is used mostly as a denominator of marital status. | pop_15_and_over | Count per sq. km -Population 3 Years and Over | The total number of people in each geography age 3 years and over. This denominator is mostly used to calculate rates of school enrollment. | population_3_years_over | Count per sq. km -Population 5 Years and Over | The number of people in a geographic area who are over the age of 5. This is primarily used as a denominator of measures of language spoken at home.| pop_5_years_over | Count per sq. km -Workers over the Age of 16 | The number of people in each geography who work. Workers include those employed at private for-profit companies, the self-employed, government workers and non-profit employees. | workers_16_and_over | Count per sq. km -Workers age 16 and over who do not work from home| The number of workers over the age of 16 who do not work from home in a geographic area| commuters_16_over | Count per sq. km -Commuters by Car, Truck, or Van | The number of workers age 16 years and over within a geographic area who primarily traveled to work by car, truck or van. This is the principal mode of travel or type of conveyance, by distance rather than time, that the worker usually used to get from home to work. | commuters_by_car_truck_van | Count per sq. km -Commuters who drove alone | The number of workers age 16 years and over within a geographic area who primarily traveled by car driving alone. This is the principal mode of travel or type of conveyance, by distance rather than time, that the worker usually used to get from home to work. | commuters_drove_alone | Count per sq. km -Commuters by Carpool| The number of workers age 16 years and over within a geographic area who primarily traveled to work by carpool. This is the principal mode of travel or type of conveyance, by distance rather than time, that the worker usually used to get from home to work. | commuters_by_carpool | Count per sq. km -Commuters by Public Transportation | The number of workers age 16 years and over within a geographic area who primarily traveled to work by public transportation. This is the principal mode of travel or type of conveyance, by distance rather than time, that the worker usually used to get from home to work. | commuters_by_public_transportation | Count per sq. km | -Commuters by Bus | The number of workers age 16 years and over within a geographic area who primarily traveled to work by bus. This is the principal mode of travel or type of conveyance, by distance rather than time, that the worker usually used to get from home to work. This is a subset of workers who commuted by public transport. | commuters_by_bus| Count per sq. km -Commuters by Subway or Elevated | The number of workers age 16 years and over within a geographic area who primarily traveled to work by subway or elevated train. This is the principal mode of travel or type of conveyance, by distance rather than time, that the worker usually used to get from home to work. This is a subset of workers who commuted by public transport. | commuters_by_subway_or_elevated | Count per sq. km -Walked to Work | The number of workers age 16 years and over within a geographic area who primarily walked to work. This would mean that of any way of getting to work, they travelled the most distance walking. | walked_to_work | Count per sq. km -Worked at Home | The count within a geographical area of workers over the age of 16 who worked at home. | worked_at_home | Count per sq. km -Number of workers with less than 10 minute commute | The number of workers over the age of 16 who do not work from home and commute in less than 10 minutes in a geographic area. | commute_less_10_mins | Count per sq. km -Number of workers with a commute between 10 and 14 minutes| The number of workers over the age of 16 who do not work from home and commute in between 10 and 14 minutes in a geographic area. | commute_10_14_mins | Count per sq. km -Number of workers with a commute between 15 and 19 minutes | The number of workers over the age of 16 who do not work from home and commute in between 15 and 19 minutes in a geographic area. | commute_15_19_mins | Count per sq. km -Number of workers with a commute between 20 and 24 minutes | The number of workers over the age of 16 who do not work from home and commute in between 20 and 24 minutes in a geographic area. | commute_20_24_mins | Count per sq. km -Number of workers with a commute between 25 and 29 minutes | The number of workers over the age of 16 who do not work from home and commute in between 25 and 29 minutes in a geographic area. | commute_25_29_mins| Count per sq. km -Number of workers with a commute between 30 and 34 minutes | The number of workers over the age of 16 who do not work from home and commute in between 30 and 34 minutes in a geographic area. | commute_30_34_mins | Count per sq. km -Number of workers with a commute between 35 and 44 minutes | The number of workers over the age of 16 who do not work from home and commute in between 35 and 44 minutes in a geographic area. | commute_35_44_mins | Count per sq. km -Number of workers with a commute between 45 and 59 minutes | The number of workers over the age of 16 who do not work from home and commute in between 45 and 59 minutes in a geographic area. | commute_45_59_mins | Count per sq. km -Number of workers with a commute of over 60 minutes | The number of workers over the age of 16 who do not work from home and commute in over 60 minutes in a geographic area.| commute_60_more_mins | Count per sq. km -Aggregate travel time to work | The total number of minutes every worker over the age of 16 who did not work from home spent spent commuting to work in one day in a geographic area. | aggregate_travel_time_to_work | Minutes -Households | A count of the number of households in each geography. A household consists of one or more people who live in the same dwelling and also share at meals or living accommodation, and may consist of a single family or some other grouping of people. | households | Count per sq. km -Never Married | The number of people in a geographic area who have never been married. | pop_never_married | Count per sq. km -Currently married| The number of people in a geographic area who are currently married. | pop_now_married | Count per sq. km -Married but separated | The number of people in a geographic area who are married but separated.| pop_separated | Count per sq. km -Widowed | The number of people in a geographic area who are widowed.| pop_widowed | Count per sq. km -Divorced | The number of people in a geographic area who are divorced. | pop_divorced | Count per sq. km -Students Enrolled in School | The total number of people in each geography currently enrolled at any level of school, from nursery or pre-school to advanced post-graduate education. Only includes those over the age of 3. | in_school | Count per sq. km -Students Enrolled in Grades 1 to 4 | The total number of people in each geography currently enrolled in grades 1 through 4 inclusive. This corresponds roughly to elementary school. | in_grades_1_to_4 | Count per sq. km -Students Enrolled in Grades 5 to 8 | The total number of people in each geography currently enrolled in grades 5 through 8 inclusive. This corresponds roughly to middle school. | in_grades_5_to_8 | Count per sq. km -Students Enrolled in Grades 9 to 12 | The total number of people in each geography currently enrolled in grades 9 through 12 inclusive. This corresponds roughly to high school. | in_grades_9_to_12 | Count per sq. km -Students Enrolled as Undergraduate in College | The number of people in a geographic area who are enrolled in college at the undergraduate level. Enrollment refers to being registered or listed as a student in an educational program leading to a college degree. This may be a public school or college, a private school or college. | in_undergrad_college | Count per sq. km -Population 25 Years and Over | The number of people in a geographic area who are over the age of 25. This is used mostly as a denominator of educational attainment. | pop_25_years_over | Count per sq. km -Population Completed High School | The number of people in a geographic area over the age of 25 who completed high school, and did not complete a more advanced degree. | high_school_diploma| Count per sq. km -Population completed less than one year of college, no degree | The number of people in a geographic area over the age of 25 who attended college for less than one year and no further. | less_one_year_college | Count per sq. km -Population completed more than one year of college, no degree | The number of people in a geographic area over the age of 25 who attended college for more than one year but did not obtain a degree. | one_year_more_college | Count per sq. km -Population Completed Associate's Degree | The number of people in a geographic area over the age of 25 who obtained a associate's degree, and did not complete a more advanced degree.| associates_degree | Count per sq. km -Population Completed Bachelor's Degree| The number of people in a geographic area over the age of 25 who obtained a bachelor's degree, and did not complete a more advanced degree. | bachelors_degree| Count per sq. km -Population Completed Master's Degree | The number of people in a geographic area over the age of 25 who obtained a master's degree, but did not complete a more advanced degree. | masters_degree | Count per sq. km -Speaks only English at Home | The number of people in a geographic area over age 5 who speak only English at home. | speak_only_english_at_home | Count per sq. km -Speaks Spanish at Home | The number of people in a geographic area over age 5 who speak Spanish at home, possibly in addition to other languages. | speak_spanish_at_home | Count per sq. km -Population for Whom Poverty Status Determined | The number of people in each geography who could be identified as either living in poverty or not. This should be used as the denominator when calculating poverty rates, as it excludes people for whom it was not possible to determine poverty. | pop_determined_poverty_status | Count per sq. km -Income In The Past 12 Months Below Poverty Level | The number of people in a geographic area who are part of a family (which could be just them as an individual) determined to be "in poverty" following the [Office of Management and Budget's Directive 14](https://www.census.gov/hhes/povmeas/methodology/ombdir14.html). | poverty | Count per sq. km -Households with income less than $10,000 | The number of households in a geographic area whose annual income was less than $10,000. | income_less_10000 | Count per sq. km -Households with income of $10,000 to $14,999 | The number of households in a geographic area whose annual income was between $10,000 and $14,999. | income_10000_14999 | Count per sq. km -Households with income of $15,000 to $19,999 | The number of households in a geographic area whose annual income was between $15,000 and $19,999. | income_15000_19999 | Count per sq. km -Households with income of $20,000 To $24,999 | The number of households in a geographic area whose annual income was between $20,000 and $24,999. | income_20000_24999 | Count per sq. km -Households with income of $25,000 To $29,999 | The number of households in a geographic area whose annual income was between $20,000 and $24,999. | income_25000_29999 | Count per sq. km -Households with income of $30,000 To $34,999 | The number of households in a geographic area whose annual income was between $30,000 and $34,999. | income_30000_34999 | Count per sq. km -Households with income of $35,000 To $39,999 | The number of households in a geographic area whose annual income was between $35,000 and $39,999. | income_35000_39999 | Count per sq. km -Households with income of $40,000 To $44,999 | The number of households in a geographic area whose annual income was between $40,000 and $44,999. | income_40000_44999| Count per sq. km -Households with income of $45,000 To $49,999 | The number of households in a geographic area whose annual income was between $45,000 and $49,999. | income_45000_49999 | Count per sq. km -Households with income of $50,000 To $59,999 | The number of households in a geographic area whose annual income was between $50,000 and $59,999. | income_50000_59999 | Count per sq. km -Households with income of $60,000 To $74,999 | The number of households in a geographic area whose annual income was between $60,000 and $74,999. | income_60000_74999 | Count per sq. km -Households with income of $75,000 To $99,999 | The number of households in a geographic area whose annual income was between $75,000 and $99,999. | income_75000_99999 | Count per sq. km -Households with income of $100,000 To $124,999 | The number of households in a geographic area whose annual income was between $100,000 and $124,999. | income_100000_124999 | Count per sq. km -Households with income of $125,000 To $149,999 | The number of households in a geographic area whose annual income was between $125,000 and $149,999. | income_125000_149999 | Count per sq. km -Households with income of $150,000 To $199,999 | The number of households in a geographic area whose annual income was between $150,000 and $1999,999. | income_150000_199999 | Count per sq. km -Households with income of $200,000 Or More | The number of households in a geographic area whose annual income was more than $200,000. | income_200000_or_more | Count per sq. km -Median Household Income in the past 12 Months | Within a geographic area, the median income received by every household on a regular basis before payments for personal income taxes, social security, union dues, medicare deductions, etc. It includes income received from wages, salary, commissions, bonuses, and tips; self-employment income from own nonfarm or farm businesses, including proprietorships and partnerships; interest, dividends, net rental income, royalty income, or income from estates and trusts; Social Security or Railroad Retirement income; Supplemental Security Income (SSI); any cash public assistance or welfare payments from the state or local welfare office; retirement, survivor, or disability benefits; and any other sources of income received regularly such as Veterans' (VA) payments, unemployment and/or worker's compensation, child support, and alimony. | median_income | USD -Per Capita Income in the past 12 Months | | income_per_capita | USD -Gini Index | A measurement of the income distribution of a country's residents. | gini_index | None -Housing Units | A count of housing units in each geography. A housing unit is a house, an apartment, a mobile home or trailer, a group of rooms, or a single room occupied as separate living quarters, or if vacant, intended for occupancy as separate living quarters. | housing_units | Count per sq. km -Vacant Housing Units | The count of vacant housing units in a geographic area. A housing unit is vacant if no one is living in it at the time of enumeration, unless its occupants are only temporarily absent. Units temporarily occupied at the time of enumeration entirely by people who have a usual residence elsewhere are also classified as vacant. | vacant_housing_units | Count per sq. km -Vacant Housing Units for Rent | The count of vacant housing units in a geographic area that are for rent. A housing unit is vacant if no one is living in it at the time of enumeration, unless its occupants are only temporarily absent. Units temporarily occupied at the time of enumeration entirely by people who have a usual residence elsewhere are also classified as vacant. | vacant_housing_units_for_rent | Count per sq. km -Vacant Housing Units for Sale| The count of vacant housing units in a geographic area that are for sale. A housing unit is vacant if no one is living in it at the time of enumeration, unless its occupants are only temporarily absent. Units temporarily occupied at the time of enumeration entirely by people who have a usual residence elsewhere are also classified as vacant. | vacant_housing_units_for_sale | Count per sq. km -Owner-occupied Housing Units | The count of owner occupied housing units in a geographic area. | owner_occupied_housing_units | Count per sq. km -Owner-occupied Housing Units valued at $1,000,000 or more. | The count of owner occupied housing units in a geographic area that are valued at $1,000,000 or more. Value is the respondent's estimate of how much the property (house and lot, mobile home and lot, or condominium unit) would sell for if it were for sale. | million_dollar_housing_units | Count per sq. km -Owner-occupied Housing Units with a Mortgage | The count of housing units within a geographic area that are mortagaged. "Mortgage" refers to all forms of debt where the property is pledged as security for repayment of the debt, including deeds of trust, trust deed, contracts to purchase, land contracts, junior mortgages, and home equity loans. | mortgaged_housing_units | Count per sq. km -Median Rent | The median contract rent within a geographic area. The contract rent is the monthly rent agreed to or contracted for, regardless of any furnishings, utilities, fees, meals, or services that may be included. For vacant units, it is the monthly rent asked for the rental unit at the time of interview.| median_rent | USD -Percent of Household Income Spent on Rent | Within a geographic area, the median percentage of household income which was spent on gross rent. Gross rent is the amount of the contract rent plus the estimated average monthly cost of utilities (electricity, gas, water, sewer etc.) and fuels (oil, coal, wood, etc.) if these are paid by the renter. Household income is the sum of the income of all people 15 years and older living in the household. | percent_income_spent_on_rent | Percent diff --git a/doc/geocoding_functions.md b/doc/geocoding_functions.md deleted file mode 100644 index c5d2c21..0000000 --- a/doc/geocoding_functions.md +++ /dev/null @@ -1,348 +0,0 @@ -# Geocoding Functions - -The [geocoder](https://carto.com/data/geocoder-api/) functions allow you to match your data with geometries on your map. This geocoding service can be used programatically to geocode datasets via the CARTO SQL API. It is fed from _Open Data_ and it serves geometries for countries, provinces, states, cities, postal codes, IP addresses and street addresses. CARTO provides functions for several different categories of geocoding through the Data Services API. - -_**This service is subject to quota limitations and extra fees may apply**. View the [Quota Information](https://carto.com/docs/carto-engine/dataservices-api/quota-information/) section for details and recommendations about to quota consumption._ - -The following example displays how to geocode a single country: - -```bash -https://{username}.carto.com/api/v2/sql?q=SELECT cdb_geocode_admin0_polygon('USA')&api_key={api_key} -``` - -In order to geocode an existent CARTO dataset, an SQL UPDATE statement must be used to populate the geometry column in the dataset with the results of the Data Services API. For example, if the column where you are storing the country names for each one of our rows is called `country_column`, run the following statement in order to geocode the dataset: - -```bash -https://{username}.carto.com/api/v2/sql?q=UPDATE {tablename} SET the_geom = cdb_geocode_admin0_polygon('USA')&api_key={api_key} -``` - -Notice that you can make use of Postgres or PostGIS functions in your Data Services API requests, as the result is a geometry that can be handled by the system. For example, suppose you need to retrieve the centroid of a specific country, you can wrap the resulting geometry from the geocoder functions inside the PostGIS `ST_Centroid` function: - -```bash -https://{username}.carto.com/api/v2/sql?q=UPDATE {tablename} SET the_geom = ST_Centroid(cdb_geocode_admin0_polygon('USA'))&api_key={api_key} -``` - - -The following geocoding functions are available, grouped by categories. - -## Country Geocoder - -This function geocodes your data into country border geometries. It recognizes the names of the different countries either by different synonyms (such as their English name or their endonym), or by ISO (ISO2 or ISO3) codes. - -### cdb_geocode_admin0_polygon(_country_name text_) - -Geocodes the text name of a country into a country_name geometry, displayed as polygon data. - -#### Arguments - -Name | Type | Description ---- | --- | --- -`country_name` | `text` | Name of the country - -#### Returns - -Geometry (polygon, EPSG 4326) or null - -#### Example - -##### Update the geometry of a table to geocode it - -```bash -UPDATE {tablename} SET the_geom = cdb_geocode_admin0_polygon({country_column}) -``` - -##### Insert a geocoded row into a table - -```bash -INSERT INTO {tablename} (the_geom) SELECT cdb_geocode_admin0_polygon('France') -``` - -## Level-1 Administrative Regions Geocoder - -This function geocodes your data into polygon geometries for [Level 1](https://en.wikipedia.org/wiki/Table_of_administrative_divisions_by_country), or [NUTS-1](https://en.wikipedia.org/wiki/NUTS_1_statistical_regions_of_England), administrative divisions (or units) of countries. For example, a "state" in the United States, "départements" in France, or an autonomous community in Spain. - -### cdb_geocode_admin1_polygon(_admin1_name text_) - -Geocodes the name of the province/state into a Level-1 administrative region, displayed as a polygon geometry. - -#### Arguments - -Name | Type | Description ---- | --- | --- -`admin1_name` | `text` | Name of the province/state - -#### Returns - -Geometry (polygon, EPSG 4326) or null - -#### Example - -##### Update the geometry of a table to geocode it - -```bash -UPDATE {tablename} SET the_geom = cdb_geocode_admin1_polygon({province_column}) -``` - -##### Insert a geocoded row into a table - -```bash -INSERT INTO {tablename} (the_geom) SELECT cdb_geocode_admin1_polygon('Alicante') -``` - - -### cdb_geocode_admin1_polygon(_admin1_name text, country_name text_) - -Geocodes the name of the province/state for a specified country into a Level-1 administrative region, displayed as a polygon geometry. - -#### Arguments - -Name | Type | Description ---- | --- | --- -`admin1_name` | `text` | Name of the province/state -`country_name` | `text` | Name of the country in which the province/state is located - -#### Returns - -Geometry (polygon, EPSG 4326) or null - -#### Example - -##### Update the geometry of a table to geocode it - -```bash -UPDATE {tablename} SET the_geom = cdb_geocode_admin1_polygon({province_column}, {country_column}) -``` -##### Insert a geocoded row into a table - -```bash -INSERT INTO {tablename} (the_geom) SELECT cdb_geocode_admin1_polygon('Alicante', 'Spain') -``` - - -## City Geocoder - -This function geocodes your data into point geometries for names of cities. It is recommended to use geocoding functions that require more defined parameters — this returns more accurate results when several cities have the same name. _If there are duplicate results for a city name, the city name with the highest population will be returned._ - -### cdb_geocode_namedplace_point(_city_name text_) - -Geocodes the text name of a city into a named place geometry, displayed as point data. - -#### Arguments - -Name | Type | Description ---- | --- | --- -`city_name` | `text` | Name of the city - -#### Returns - -Geometry (point, EPSG 4326) or null - -#### Example - -##### Select - -##### Update the geometry of a table to geocode it - -```bash -UPDATE {tablename} SET the_geom = cdb_geocode_namedplace_point({city_column}) -``` - -##### Insert a geocoded row into a table - -```bash -INSERT INTO {tablename} (the_geom) SELECT cdb_geocode_namedplace_point('Barcelona') -``` - - -### cdb_geocode_namedplace_point(_city_name text, country_name text_) - -Geocodes the text name of a city for a specified country into a named place point geometry. - -#### Arguments - -Name | Type | Description ---- | --- | --- -`city_name` | `text` | Name of the city -`country_name` | `text` | Name of the country in which the city is located - -#### Returns - -Geometry (point, EPSG 4326) or null - -#### Example - -##### Update the geometry of a table to geocode it - -```bash -UPDATE {tablename} SET the_geom = cdb_geocode_namedplace_point({city_column}, 'Spain') -``` - -##### Insert a geocoded row into a table - -```bash -INSERT INTO {tablename} (the_geom) SELECT cdb_geocode_namedplace_point('Barcelona', 'Spain') -``` - - -### cdb_geocode_namedplace_point(_city_name text, admin1_name text, country_name text_) - -Geocodes your data into a named place point geometry, containing the text name of a city, for a specified province/state and country. This is recommended for the most accurate geocoding of city data. -#### Arguments - -Name | Type | Description ---- | --- | --- -`city_name` | `text` | Name of the city -`admin1_name` | `text` | Name of the province/state in which the city is located -`country_name` | `text` | Name of the country in which the city is located - -#### Returns - -Geometry (point, EPSG 4326) or null - -#### Example - -##### Update the geometry of a table to geocode it - -```bash -UPDATE {tablename} SET the_geom = cdb_geocode_namedplace_point({city_column}, {province_column}, 'USA') -``` - -##### Insert a geocoded row into a table - -```bash -INSERT INTO {tablename} (the_geom) SELECT cdb_geocode_namedplace_point('New York', 'New York', 'USA') -``` - -## Postal Code Geocoder - -These functions geocode your data into point, or polygon, geometries for postal codes. The postal code geocoder covers the United States, France, Australia and Canada; a request for a different country will return an empty response. - -**Note:** For the USA, US Census Zip Code Tabulation Areas (ZCTA) are used to reference geocodes for USPS postal codes service areas. This is not a CARTO restriction, this is a US Government licensing protection of their zip code data source; which is not publicly available. Additionally, zip codes are considered service areas and are not actually geometric areas. As a solution, the US Census provides ZCTA data, which tabulates GIS postal codes for USPS locations by aggregating census blocks. For details about how ZCTAs are created, see [ZIP Code™ Tabulation Areas (ZCTAs™)](https://www.census.gov/geo/reference/zctas.html). If you are geocoding data and your zip codes fail, ensure you are using ZCTAs for the postal code. - -### cdb_geocode_postalcode_polygon(_postal_code text, country_name text_) - -Geocodes the postal code for a specified country into a **polygon** geometry. - -#### Arguments - -Name | Type | Description ---- | --- | --- -`postal_code` | `text` | Postal code -`country_name` | `text` | Name of the country in which the postal code is located - -#### Returns - -Geometry (polygon, EPSG 4326) or null - -#### Example - -##### Update the geometry of a table to geocode it - -```bash -UPDATE {tablename} SET the_geom = cdb_geocode_postalcode_polygon({postal_code_column}, 'USA') -``` - -##### Insert a geocoded row into a table - -```bash -INSERT INTO {tablename} (the_geom) SELECT cdb_geocode_postalcode_polygon('11211', 'USA') -``` - -### cdb_geocode_postalcode_point(_code text, country_name text_) - -Geocodes the postal code for a specified country into a **point** geometry. - -#### Arguments - -Name | Type | Description ---- | --- | --- -`postal_code` | `text` | Postal code -`country_name` | `text` | Name of the country in which the postal code is located - -#### Returns - -Geometry (point, EPSG 4326) or null - -#### Example - -##### Update the geometry of a table to geocode it - -```bash -UPDATE {tablename} SET the_geom = cdb_geocode_postalcode_point({postal_code_column}, 'USA') -``` - -##### Insert a geocoded row into a table - -```bash -INSERT INTO {tablename} (the_geom) SELECT cdb_geocode_postalcode_point('11211', 'USA') -``` - - -## IP Addresses Geocoder - -This function geocodes your data into point geometries for IP addresses. This is useful if you are analyzing location based data, based on a set of user's IP addresses. - -### cdb_geocode_ipaddress_point(_ip_address text_) - -Geocodes a postal code from a specified country into an IP address, displayed as a point geometry. - -#### Arguments - -Name | Type | Description ---- | --- | --- -`ip_address` | `text` | IPv4 or IPv6 address - -#### Returns - -Geometry (point, EPSG 4326) or null - -#### Example - -##### Update the geometry of a table to geocode it - -```bash -UPDATE {tablename} SET the_geom = cdb_geocode_ipaddress_point('102.23.34.1') -``` - -##### Insert a geocoded row into a table - -```bash -INSERT INTO {tablename} (the_geom) SELECT cdb_geocode_ipaddress_point('102.23.34.1') -``` - -## Street-Level Geocoder - -This function geocodes your data into a point geometry for a street address. CARTO uses several different service providers for street-level geocoding, depending on your platform. If you access CARTO on a Google Cloud Platform, [Google Maps geocoding](https://developers.google.com/maps/documentation/geocoding/intro) is applied. All other platform users are provided with [Mapbox geocoding services](https://www.mapbox.com/). [Contact us](mailto:sales@carto.com) if you have any specific questions or requirements about the location data service provider being used with your account._. - -**This service is subject to quota limitations, and extra fees may apply**. View the [Quota information](https://carto.com/docs/carto-engine/dataservices-api/quota-information/) for details and recommendations about quota consumption. - -### cdb_geocode_street_point(_search_text text, [city text], [state text], [country text]_) - -Geocodes a complete address into a single street geometry, displayed as point data. - -#### Arguments - -Name | Type | Description ---- | --- | --- | --- -`searchtext` | `text` | searchtext contains free-form text containing address elements. You can specify the searchtext parameter by itself, or with other parameters, to narrow your search. For example, you can specify the state or country parameters, along with a free-form address in the searchtext field. -`city` | `text` | (Optional) Name of the city. -`state` | `text` | (Optional) Name of the state. -`country` | `text` | (Optional) Name of the country. - -#### Returns - -Geometry (point, EPSG 4326) or null - -#### Example - -##### Update the geometry of a table to geocode it - -```bash -UPDATE {tablename} SET the_geom = cdb_geocode_street_point({street_name_column}) -``` - -##### Insert a geocoded row into a table - -```bash -INSERT INTO {tablename} (the_geom) SELECT cdb_geocode_street_point('651 Lombard Street', 'San Francisco', 'California', 'United States') -``` diff --git a/doc/isoline_functions.md b/doc/isoline_functions.md deleted file mode 100644 index 743c589..0000000 --- a/doc/isoline_functions.md +++ /dev/null @@ -1,106 +0,0 @@ -# Isoline Functions - -[Isolines](https://carto.com/data/isolines/) are contoured lines that display equally calculated levels over a given surface area. This enables you to view polygon dimensions by forward or reverse measurements. Isoline functions are calculated as the intersection of areas from the origin point, measured by distance (isodistance) or time (isochrone). For example, the distance of a road from a sidewalk. Isoline services through CARTO are available by requesting a single function in the Data Services API. - -_**This service is subject to quota limitations and extra fees may apply**. View the [Quota Information](https://carto.com/docs/carto-engine/dataservices-api/quota-information/) section for details and recommendations about to quota consumption._ - -You can use the isoline functions to retrieve, for example, isochrone lines from a certain location, specifying the mode and the ranges that will define each of the isolines. The following query calculates isolines for areas that are 5, 10 and 15 minutes (300, 600 and 900 seconds, respectively) away from the location by following a path defined by car routing and inserts them into a table. - -```bash -https://{username}.carto.com/api/v2/sql?q=INSERT INTO {table} (the_geom) SELECT the_geom FROM cdb_isodistance('POINT(-3.70568 40.42028)'::geometry, 'car', ARRAY[300, 600, 900]::integer[])&api_key={api_key} -``` - -The following functions provide an isoline generator service, based on time or distance. This service uses the isolines service defined for your account. The default service limits the usage of displayed polygons represented on top of [Mapbox](https://www.mapbox.com/) maps. - -## cdb_isodistance(_source geometry, mode text, range integer[], [options text[]]_) - -Displays a contoured line on a map, connecting geometries to a defined area, measured by an equal range of distance (in meters). - -Note that not all the providers, for example TomTom, provide us a way to define the isoline limit in distance so we need to make some estimations. Due that estimations the produced isolines could not be 100% precise. - -#### Arguments - -Name | Type | Description | Accepted values ---- | --- | --- | --- -`source` | `geometry` | Source point, in 4326 projection, which defines the start location. | -`mode` | `text` | Type of transport used to calculate the isolines. | `car` or `walk` -`range` | `integer[]` | Range of the isoline, in meters. | -`options` | `text[]` | (Optional) Multiple options to add more capabilities to the analysis. See [Optional isolines parameters](#optional-isoline-parameters) for details. - - -#### Returns - -Name | Type | Description ---- | --- | --- -`center` | `geometry` | Source point, in 4326 projection, which defines the start location. -`data_range` | `integer` | The range that belongs to the generated isoline. -`the_geom` | `geometry(MultiPolygon)` | MultiPolygon geometry of the generated isoline in the 4326 projection. - -#### Examples - -##### Calculate and insert isodistance polygons from a point into another table - -```bash -INSERT INTO {table} (the_geom) SELECT the_geom FROM cdb_isodistance('POINT(-3.70568 40.42028)'::geometry, 'walk', ARRAY[300, 600, 900]::integer[]) -``` - -or equivalently: - -```bash -INSERT INTO {table} (the_geom) SELECT (cdb_isodistance('POINT(-3.70568 40.42028)'::geometry, 'walk', ARRAY[300, 600, 900]::integer[])).the_geom -``` - -##### Calculate and insert the generated isolines from `points_table` table to another table - -```bash -INSERT INTO {table} (the_geom) SELECT (cdb_isodistance(the_geom, 'walk', string_to_array(distance, ',')::integer[])).the_geom FROM {points_table} -``` - - -## cdb_isochrone(_source geometry, mode text, range integer[], [options text[]]_) - -Displays a contoured line on a map, connecting geometries to a defined area, measured by an equal range of time (in seconds). - -#### Arguments - -This function uses the same parameters and information as the `cdb_isodistance` function, with the exception that the range is measured in seconds instead of meters. - -Name | Type | Description | Accepted values ---- | --- | --- | --- -`source` | `geometry` | Source point, in 4326 projection, which defines the start location. | -`mode` | `text` | Type of transport used to calculate the isolines. | `car` or `walk` -`range` | `integer[]` | Range of the isoline, in seconds. | -`options` | `text[]` | (Optional) Multiple options to add more capabilities to the analysis. See [Optional isolines parameters](#optional-isoline-parameters) for details. - -#### Examples - -##### Calculate and insert isochrone polygons from a point into another table - -```bash -INSERT INTO {table} (the_geom) SELECT the_geom FROM cdb_isochrone('POINT(-3.70568 40.42028)'::geometry, 'car', ARRAY[300, 900, 12000]::integer[], ARRAY['mode_traffic=enabled','quality=3']::text[]) -``` - -or equivalently: - -```bash -INSERT INTO {table} (the_geom) SELECT (cdb_isochrone('POINT(-3.70568 40.42028)'::geometry, 'car', ARRAY[300, 900, 12000]::integer[], ARRAY['mode_traffic=enabled','quality=3']::text[])).the_geom -``` - -##### Calculate and insert the generated isolines from `points_table` table into another table - -```bash -INSERT INTO {table} (the_geom) SELECT (cdb_isochrone(the_geom, 'walk', string_to_array(time_distance, ',')::integer[])).the_geom FROM {points_table} -``` - -### Optional isoline parameters - -The optional value parameters must be passed using the format: `option=value`. - -Name | Type | Description | Accepted values ---- | --- | --- | --- -`is_destination` | `boolean` | If true, the source point is the destination instead of the starting location | `true` or `false`. `false` by default -`mode_type` | `text` | Type of route calculation | `shortest` or `fastest`. `shortest` by default -`mode_traffic` | `text` | Use traffic data to calculate the route | `enabled` or `disabled`. `disabled` by default -`resolution` | `text` | Allows you to specify the level of detail needed for the isoline polygon. Unit is meters per pixel. Higher resolution may increase the response time of the service. -`maxpoints` | `text` | Allows you to limit the amount of points in the returned isoline. If the isoline consists of multiple components, the sum of points from all components is considered. Each component will have at least two points. It is possible that more points than specified could be returned, in case when `2 * number of components` is higher than the `maxpoints` value itself. Increasing the number of `maxpoints` may increase the response time of the service. -`quality` | `text` | Allows you to reduce the quality of the isoline in favor of the response time. | `1`, `2`, `3`. Default value is `1`, corresponding to the best quality option. diff --git a/doc/overview.md b/doc/overview.md deleted file mode 100644 index f37c1a8..0000000 --- a/doc/overview.md +++ /dev/null @@ -1,49 +0,0 @@ -# Overview - -By using CARTO libraries and the SQL API, you can apply location data services to your maps with unique data services functions. These functions are integrated with a number of internal and external services, enabling you to programatically customize subsets of data for your visualizations. These features are useful for geospatial analysis and the results can be saved, and stored, for additional location data service operations. - -**Note:** Based on your account plan, some of these data services are subject to different [quota limitations](https://carto.com/docs/carto-engine/dataservices-api/quota-information/#quota-information). - -_In order to supply the best location data services from within our CARTO Engine, the Data Services API collaborates with [Mapbox](https://www.mapbox.com/) and several other geospatial service providers. [Contact us](mailto:sales@carto.com) if you have any specific questions or requirements about the location data service provider being used with your account._ - -## Data Services Integration - -By using the SQL API to query the Data Services API functions, you can manage specific operations and the corresponding geometries (a `polygon` or a `point`), according to the input information. - -The Data Services API also exposes its services directly through CARTO Builder. For example, you can geocode data (from single rows, complete datasets, or simple inputs) and perform trade areas analysis (computing isodistances or isochrones) programatically, through authenticated SQL requests, or by using the ANALYSIS options. - -The geometries provided by this API are projected in the projection [WGS 84 SRID 4326](http://spatialreference.org/ref/epsg/wgs-84/). - -**Note:** The Data Services API [geocoding functions](https://carto.com/docs/carto-engine/dataservices-api/geocoding-functions/#geocoding-functions) return different types of geometries (points or polygons) as result of different geocoding processes. The CARTO Engine does not support multi-geometry layers or datasets, therefore you must confirm that you are using consistent geometry types inside a table, to avoid future conflicts in your map visualization. - -### Best Practices - -_Be mindful of the following usage notes when using the Data Services functions with the SQL API:_ - -It is discouraged to use the SELECT operation with the Data Services API functions in your map layers, as these type of queries consume quota when rendering tiles for your live map views. It may also result in sync performance issues, due to executing multiple requests to the API each time your map is viewed. See details about [Quota Consumption](https://carto.com/docs/carto-engine/dataservices-api/quota-information/#quota-consumption). - -The Data Services API is **recommended** to be used with INSERT or UPDATE operations, for applying location data to your tables. While SELECT (retrieve) is standard for SQL API requests, be mindful of quota consumption and use INSERT (to insert a new record) or UPDATE (to update an existing record), for best practices. - -## Authentication - -All requests performed to the CARTO Data Services API must be authenticated with the user API Key. For more information about where to find your API Key, and how to authenticate your SQL API requests, view the [SQL API authentication](/carto-engine/sql-api/authentication/) documentation. - -## Errors - -Errors are described in the response of the request. An example is as follows: - -```json -{ - error: [ - "The api_key must be provided" - ] -} -``` - -Since the Data Services API is used on top of the CARTO SQL API, you can refer to the [Making calls to the SQL API](https://carto.com/docs/carto-engine/sql-api/making-calls/) documentation for help debugging your SQL errors. - -If the requested information is not in the CARTO geocoding database, or if CARTO is unable to recognize your input and match it with a result, the geocoding function returns `null` as a result. - -## Limits - -Usage of the Data Services API is subject to the CARTO SQL API limits, stated in our [Terms of Service](https://carto.com/terms/#excessive). diff --git a/doc/quota_information.md b/doc/quota_information.md deleted file mode 100644 index 7ffd4db..0000000 --- a/doc/quota_information.md +++ /dev/null @@ -1,135 +0,0 @@ -# Quota Information - -**Based on your account plan, some of the Data Services API functions are subject to quota limitations and extra fees may apply.** View our [terms and conditions](https://carto.com/terms/), or [contact us](mailto:sales@carto.com) for details about which functions require service credits to your account. - -## Quota Consumption - -Quota consumption is calculated based on the number of request made for each function. Be mindful of the following usage recommendations when using the Data Services API functions: - -* One credit per function call will be consumed. The results are not cached. If the query is applied to a _N_ rows dataset, then _N_ credits are consumed -* Avoid running dynamic queries to these functions in your maps. This can result in credit consumption per map view. - - **Note:** Queries to the Data Services API, and any of its functions in your maps, may be forbidden in the future - -* It is advised to store results of these queries into your datasets, and refresh them as needed. This ensure more control of quota credits for your account - - -## Quota Information Functions - -There are several SQL functions that you can run to obtain quota information about your services. - -## cdb_service_quota_info() - -Returns information about per-service quotas (available and used) for the account. - -#### Returns - -This function returns a set of service quota information records, one per service. - -Name | Type | Description ---------------- | --------- | ------------ -`service` | `text` | Type of service. -`monthly_quota` | `numeric` | Quota available to the user (number of calls) per monthly period. -`used_quota` | `numeric` | Quota used by the user in the present period. -`soft_limit` | `boolean` | Set to `True`, if the user has *soft-limit* quota. -`provider` | `text` | Service provider for this type of service. - -Service Types: - -* `'isolines'` [Isoline/Isochrones (isochrone/isodistance lines) service](https://carto.com/docs/carto-engine/dataservices-api/isoline_functions/) -* `'hires_geocoder'` [Street level geocoding](https://carto.com/docs/carto-engine/dataservices-api/geocoding-functions#street-level-geocoder) -* `'routing'` [Routing functions](https://carto.com/docs/carto-engine/dataservices-api/routing_functions/) -* `'observatory'` Data Observatory services ([demographic](https://carto.com/docs/carto-engine/dataservices-api/demographic_functions/) and [segmentation](https://carto.com/docs/carto-engine/dataservices-api/segmentation_functions/) functions) - -**Notes** - -Users who have *soft-quota* activated never run out of quota, but they may incur extra -expenses when the regular quota is exceeded. - -A zero value of `monthly_quota` indicates that the service has not been activated for the user. - -#### Example - -```sql -SELECT * FROM cdb_service_quota_info(); -``` - -Result: - -```sql - service | monthly_quota | used_quota | soft_limit | provider -----------------+---------------+------------+------------+------------------ - isolines | 100 | 0 | f | mapbox - hires_geocoder | 100 | 0 | f | mapbox - routing | 50 | 0 | f | mapbox - observatory | 0 | 0 | f | data observatory -(4 rows) - -``` - -In this case, notice that the user has no access to the observatory services. All quotas are *hard-limited* (no soft limits), and no quota has been used in the present period. - -## cdb_enough_quota(service text ,input_size numeric) - -This function is useful to check if enough quota is available for completing a job. - -This is specifically relevant if a number of service calls are to be performed inside a transaction. If any of the calls fails (due to exceeded quota), the transaction will be rolled back; resulting in partial quota consumption, but no saved results from the services consumed. - -**Tip:** If you are requesting repeating quota-consuming functions (e.g. to geocode a whole table), it is extremely important to check if enough quota is available to complete the job _before_ applying this function. - -Note that some services consume more than one credit per row/call. For example, isolines (with more than one range/track) consume (N rows x M ranges) credits; indicating that the input size should be N x M. - -#### Arguments - -Name | Type | Description ------------- | --------- | ----------- -`service` | `text` | Service to check; see the list of valid services above. -`input_size` | `numeric` | Number of service calls required, i.e. size of the input to be processed. - -#### Returns - -The result is a *boolean* value. A *true* value (`'t'`) indicates that the available quota -for the service is enough for the input size requested. A *false* value (`'f'`) indicates -insufficient quota. - -#### Example - -Suppose you want to geocode a whole table. In order to check that you have enough quota, and avoid a "quota exhausted" exception, first find out how many records you need to geocode: - -```sql -SELECT COUNT(*) FROM {tablename} WHERE {street_name_column} IS NOT NULL; -``` - -Result: A sample result of 10000 records: - -```sql - count -------- - 10000 -(1 row) -``` - -The result shows how much quota is needed to complete this job. In this case, -each call to `cdb_geocode_street_point` consumes one quota credit. This indicates that we need one credit per row to geocode the whole table. - -```sql -SELECT cdb_enough_quota('hires_geocoder', {number_of_records}); -``` - -The result is similar to the following: - -```sql - cdb_enough_quota ------------------- - t -``` - -If the result of this query is *true* (`'t'`), you can safely proceed. If a *false* value (`'f'`) is returned, you should avoid processing any more requests that consume quota. Apply the `cdb_service_quota_info` function to get more information about your services. - -**Note:** Remember to apply any filtering conditions that you used to count the records (in this case, `{street_name_column} IS NOT NULL`): - - -```sql -UPDATE {tablename} SET the_geom = cdb_geocode_street_point({street_name_column}) - WHERE {street_name_column} IS NOT NULL; -``` diff --git a/doc/rate_limits.md b/doc/rate_limits.md deleted file mode 100644 index 78eafe8..0000000 --- a/doc/rate_limits.md +++ /dev/null @@ -1,197 +0,0 @@ -# Rate limits - -Services can be rate-limited. (currently only gecoding is limited) - -The rate limits configuration can be established at server, organization or user levels, the latter having precedence over the earlier. - -The default configuration (a null or empty configuration) doesn't impose any limits. - -The configuration consist of a JSON object with two attributes: - -* `period`: the rate-limiting period, in seconds. -* `limit`: the maximum number of request in the established period. - -If a service request exceeds the configured rate limits -(i.e. if more than `limit` calls are performe in a fixed interval of -duration `period` seconds) the call will fail with an "Rate limit exceeded" error. - -## Server-side interface - -There's a server-side SQL interface to query or change the configuration. - -### cdb_dataservices_server.cdb_service_get_rate_limit(username, orgname, service) - -This function returns the rate limit configuration for a given user and service. - -#### Returns - -The result is a JSON object with the configuration (`period` and `limit` attributes as explained above). - -### cdb_dataservices_server.cdb_service_set_user_rate_limit(username, orgname, service, rate_limit) - -This function sets the rate limit configuration for the user. This overrides any other configuration. - -The configuration is provided as a JSON literal. To remove the user-level configuration `NULL` should be passed as the `rate_limit`. - -#### Returns - -This functions doesn't return any value. - -### cdb_dataservices_server.cdb_service_set_org_rate_limit(username, orgname, service, rate_limit) - -This function sets the rate limit configuration for the organization. -This overrides server level configuration and is overriden by user configuration if present. - -The configuration is provided as a JSON literal. To remove the organization-level configuration `NULL` should be passed as the `rate_limit`. - -#### Returns - -This functions doesn't return any value. - -### cdb_dataservices_server.cdb_service_set_server_rate_limit(username, orgname, service, rate_limit) - -This function sets the default rate limit configuration for all users accesing the dataservices server. This is overriden by organization of user configuration. - -The configuration is provided as a JSON literal. To remove the organization-level configuration `NULL` should be passed as the `rate_limit`. - -#### Returns - -This functions doesn't return any value. - -## Client-side interface - -For convenience there's also a client-side interface (in the client dataservices-api extension), consisting -of public functions to get the current configuration and privileged functions to change it. - -### Public functions - -These functions are accesible to non-privileged roles, and should only be executed -using the role corresponding to a CARTO user, since that will determine the -user and organization to which the rate limits configuration applies. - -### cdb_dataservices_client.cdb_service_get_rate_limit(service) - -This function returns the rate limit configuration in effect for the specified service -and the user corresponding to the role which makes the calls. The effective configuration -may come from any of the configuration levels (server/organization/user); only the -existing configuration with most precedence is returned. - -#### Returns - -The result is a JSON object with the configuration (`period` and `limit` attributes as explained above). - -#### Example: - -``` -SELECT cdb_dataservices_client.cdb_service_get_rate_limit('geocoder'); - - cdb_service_get_rate_limit ---------------------------------- - {"limit": 1000, "period": 86400} -(1 row) -``` - - -### Privileged (superuser) functions - -Thes functions are not accessible by regular user roles, and the user and organization names must be provided as parameters. - -### cdb_dataservices_client.cdb_service_set_user_rate_limit(username, orgname, service, rate_limit) - -This function sets the rate limit configuration for the user. This overrides any other configuration. - -The configuration is provided as a JSON literal. To remove the user-level configuration `NULL` should be passed as the `rate_limit`. - -#### Returns - -This functions doesn't return any value. - -#### Example - -This will configure the geocoder service rate limit for user `myusername`, a non-organization user. -The limit will be set at 1000 requests per day. Since the user doesn't belong to any organization, -`NULL` will be passed to the organization argument; otherwise the name of the user's organization should -be provided. - -Note that the name of the geocoding services is `geocoder` and not `geocoding`. - -``` -SELECT cdb_dataservices_client.cdb_service_set_user_rate_limit( - 'myusername', - NULL, - 'geocoder', - '{"limit":1000,"period":86400}' -); - - cdb_service_set_user_rate_limit ---------------------------------- - -(1 row) -``` - -### cdb_dataservices_client.cdb_service_set_org_rate_limit(username, orgname, service, rate_limit) - -This function sets the rate limit configuration for the organization. -This overrides server level configuration and is overriden by user configuration if present. - -The configuration is provided as a JSON literal. To remove the organization-level configuration `NULL` should be passed as the `rate_limit`. - -#### Returns - -This functions doesn't return any value. - -#### Example - -This will configure the geocoder service rate limit for the `myorg` organization. -The limit will be set at 100 requests per hour. -Note that even we're setting the default configuration for the whole organization, -the name of a user of the organization must be provided for technical reasons. - -``` -SELECT cdb_dataservices_client.cdb_service_set_org_rate_limit( - 'myorgadmin', - 'myorg', - 'geocoder', - '{"limit":100,"period":3600}' -); - - - cdb_service_set_org_rate_limit ---------------------------------- - -(1 row) -``` - -### cdb_dataservices_client.cdb_service_set_server_rate_limit(username, orgname, service, rate_limit) - -This function sets the default rate limit configuration for all users accesing the dataservices server. This is overriden by organization of user configuration. - -The configuration is provided as a JSON literal. To remove the organization-level configuration `NULL` should be passed as the `rate_limit`. - -#### Returns - -This functions doesn't return any value. - -#### Example - -This will configure the default geocoder service rate limit for all users -accesing the data-services server. -The limit will be set at 10000 requests per month. -Note that even we're setting the default configuration for the server, -the name of a user and the name of the corresponding organization (or NULL) -must be provided for technical reasons. - -``` -SELECT cdb_dataservices_client.cdb_service_set_server_rate_limit( - 'myorgadmin', - 'myorg', - 'geocoder', - '{"limit":10000,"period":108000}' -); - - - cdb_service_set_server_rate_limit ---------------------------------- - -(1 row) -``` diff --git a/doc/routing_functions.md b/doc/routing_functions.md deleted file mode 100644 index 17188cd..0000000 --- a/doc/routing_functions.md +++ /dev/null @@ -1,84 +0,0 @@ -# Routing Functions - -Routing is the navigation from a defined start location to a defined end location. The calculated results are displayed as turn-by-turn directions on your map, based on the transportation mode that you specified. Routing services through CARTO are available by using the available functions in the Data Services API. - -## cdb_route_point_to_point(_origin geometry(Point), destination geometry(Point), mode text, [options text[], units text]_) - -Returns a route from origin to destination. - -#### Arguments - -Name | Type | Description | Accepted values ---- | --- | --- | --- -`origin` | `geometry(Point)` | Origin point, in 4326 projection, which defines the start location. | -`destination` | `geometry(Point)` | Destination point, in 4326 projection, which defines the end location. | -`mode` | `text` | Type of transport used to calculate the routes. | `car`, `walk`, `bicycle` or `public_transport` -`options` | `text[]` | (Optional) Multiple options to add more capabilities to the analysis. See [Optional routing parameters](#optional-routing-parameters) for details. -`units` | `text` | (Optional) Unit used to represent the length of the route. | `kilometers`, `miles`. By default is `kilometers`. This option is not supported by Mapbox provider - - -#### Returns - -Name | Type | Description ---- | --- | --- -`duration` | `integer` | Duration in seconds of the calculated route. -`length` | `real` | Length in the defined unit in the `units` field. `meters` by default . -`the_geom` | `geometry(LineString)` | LineString geometry of the calculated route in the 4326 projection. - -#### Examples - -##### Insert the values from the calculated route in your table - -```bash -INSERT INTO (duration, length, the_geom) SELECT duration, length, shape FROM cdb_route_point_to_point('POINT(-3.70237112 40.41706163)'::geometry,'POINT(-3.69909883 40.41236875)'::geometry, 'car') -``` -##### Update the geometry field with the calculated route shape - -```bash -UPDATE
SET the_geom = (SELECT shape FROM cdb_route_point_to_point('POINT(-3.70237112 40.41706163)'::geometry,'POINT(-3.69909883 40.41236875)'::geometry, 'car', ARRAY['mode_type=shortest']::text[])) -``` - -## cdb_route_with_waypoints(_waypoints geometry(Point)[], mode text, [options text[], units text]_) - -Returns a route that goes from origin to destination and whose path travels through the defined locations. - -#### Arguments - -Name | Type | Description | Accepted values ---- | --- | --- | --- -`waypoints` | `geometry(Point)[]` | Array of ordered points, in 4326 projection, which defines the origin point, one or more locations for the route path to travel through, and the destination. The first element of the array defines the origin and the last element the destination of the route. | -`mode` | `text` | Type of transport used to calculate the routes. | `car`, `walk`, `bicycle` or `public_transport` -`options` | `text[]` | (Optional) Multiple options to add more capabilities to the analysis. See [Optional routing parameters](#optional-routing-parameters) for details. -`units` | `text` | (Optional) Unit used to represent the length of the route. | `kilometers`, `miles`. By default is `kilometers`. This option is not supported by Mapbox provider - - -#### Returns - -Name | Type | Description ---- | --- | --- -`duration` | `integer` | Duration in seconds of the calculated route. -`length` | `real` | Length in the defined unit in the `units` field. `meters` by default . -`the_geom` | `geometry(LineString)` | LineString geometry of the calculated route in the 4326 projection. - -*Note*: A request to the function _cdb\_route\_with\_waypoints(waypoints geometry(Point)[], mode text, [options text[], units text])_ with only two points in the geometry array are automatically defined as origin and destination. It is equivalent to performing the following request with these two locations as parameters: _cdb\_route\_point\_to\_point(origin geometry(Point), destination geometry(Point), mode text, [options text[], units text])_. - -#### Examples - -##### Insert the values from the calculated route in your table - -```bash -INSERT INTO
(duration, length, the_geom) SELECT duration, length, shape FROM cdb_route_with_waypoints(Array['POINT(-3.7109 40.4234)'::GEOMETRY, 'POINT(-3.7059 40.4203)'::geometry, 'POINT(-3.7046 40.4180)'::geometry]::geometry[], 'walk') -``` -##### Update the geometry field with the calculated route shape - -```bash -UPDATE
SET the_geom = (SELECT shape FROM cdb_route_with_waypoints(Array['POINT(-3.7109 40.4234)'::GEOMETRY, 'POINT(-3.7059 40.4203)'::geometry, 'POINT(-3.7046 40.4180)'::geometry]::geometry[], 'car', ARRAY['mode_type=shortest']::text[])) -``` - -### Optional routing parameters - -The optional value parameters must be passed using the format: `option=value`. Not all are available for all the routing providers - -Name | Type | Description | Accepted values ---- | --- | --- | --- -`mode_type` | `text` | Type of route calculation | `shortest` (this option only applies to the car transport mode) diff --git a/doc/segmentation_functions.md b/doc/segmentation_functions.md deleted file mode 100644 index ec11c59..0000000 --- a/doc/segmentation_functions.md +++ /dev/null @@ -1,181 +0,0 @@ -# Segmentation Functions - -The Segmentation Snapshot functions enable you to determine the pre-calculated population segment for a location. Segmentation is a method that divides a populations into subclassifications based on common traits. For example, you can take the a store location and determine what classification of population exists around that location. If you need help creating coordinates from addresses, see the [Geocoding Functions](https://carto.com/docs/carto-engine/dataservices-api/geocoding-functions/) documentation. - -_**Note:** The Segmentation Snapshot functions are only available for the United States. Our first release (May 18, 2016) is derived from Census 2010 variables. Our next release will be based on Census 2014 data. For the latest information, see the [Open Segments](https://github.com/CartoDB/open-segments) project repository._ - -## OBS_GetSegmentSnapshot( Point Geometry ) - -### Arguments - -Name | Description | Example Values ---- | --- | --- -point geometry | A point geometry. You can use the helper function, `CDB_LatLng` to quickly generate one from latitude and longitude | `CDB_LatLng(40.760410,-73.964242)` - -### Returns - -The segmentation function returns two segment levels for the point you requests, the x10\_segment and x55\_segment. These segmentation levels contain different classifications of population within with each segment. The function also returns the quantile of a number of census variables. For example, if total_poulation is at 90% quantile level then this tract has a higher total population than 90% of the other tracts. - -Name | Type | Description ----- | ---- | ----------- -x10\_segment | text | The demographic segment location at the 10 segment level, containing populations at high-levels, broken down into 10 broad categories -x55\_segment | text | The demographic segment location at the 55 segment level, containing more granular sub-levels to categorize the population - -An example response appears as follows: - -```json -obs_getsegmentsnapshot: { - "x10_segment": "Wealthy, urban without Kids", - "x55_segment": "Wealthy city commuters", - "us.census.acs.B01001001_quantile": "0.0180540540540541", - "us.census.acs.B01001002_quantile": "0.0279864864864865", - "us.census.acs.B01001026_quantile": "0.016527027027027", - "us.census.acs.B01002001_quantile": "0.507297297297297", - "us.census.acs.B03002003_quantile": "0.133162162162162", - "us.census.acs.B03002004_quantile": "0.283743243243243", - "us.census.acs.B03002006_quantile": "0.683945945945946", - "us.census.acs.B03002012_quantile": "0.494594594594595", - "us.census.acs.B05001006_quantile": "0.670972972972973", - "us.census.acs.B08006001_quantile": "0.0607567567567568", - "us.census.acs.B08006002_quantile": "0.0684324324324324", - "us.census.acs.B08006008_quantile": "0.565135135135135", - "us.census.acs.B08006009_quantile": "0.638081081081081", - "us.census.acs.B08006011_quantile": "0", - "us.census.acs.B08006015_quantile": "0.900932432432432", - "us.census.acs.B08006017_quantile": "0.186648648648649", - "us.census.acs.B09001001_quantile": "0.0193513513513514", - "us.census.acs.B11001001_quantile": "0.0617972972972973", - "us.census.acs.B14001001_quantile": "0.0179594594594595", - "us.census.acs.B14001002_quantile": "0.0140405405405405", - "us.census.acs.B14001005_quantile": "0", - "us.census.acs.B14001006_quantile": "0", - "us.census.acs.B14001007_quantile": "0", - "us.census.acs.B14001008_quantile": "0.0609054054054054", - "us.census.acs.B15003001_quantile": "0.0314594594594595", - "us.census.acs.B15003017_quantile": "0.0403378378378378", - "us.census.acs.B15003022_quantile": "0.285972972972973", - "us.census.acs.B15003023_quantile": "0.214567567567568", - "us.census.acs.B16001001_quantile": "0.0181621621621622", - "us.census.acs.B16001002_quantile": "0.0463108108108108", - "us.census.acs.B16001003_quantile": "0.540540540540541", - "us.census.acs.B17001001_quantile": "0.0237567567567568", - "us.census.acs.B17001002_quantile": "0.155972972972973", - "us.census.acs.B19013001_quantile": "0.380662162162162", - "us.census.acs.B19083001_quantile": "0.986891891891892", - "us.census.acs.B19301001_quantile": "0.989594594594595", - "us.census.acs.B25001001_quantile": "0.998418918918919", - "us.census.acs.B25002003_quantile": "0.999824324324324", - "us.census.acs.B25004002_quantile": "0.999986486486486", - "us.census.acs.B25004004_quantile": "0.999662162162162", - "us.census.acs.B25058001_quantile": "0.679054054054054", - "us.census.acs.B25071001_quantile": "0.569716216216216", - "us.census.acs.B25075001_quantile": "0.0415", - "us.census.acs.B25075025_quantile": "0.891702702702703" -} -``` - -The possible segments are: - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
X10 segment X55 Segment
Hispanic and kids
Middle Class, Educated, Suburban, Mixed Race
Low Income on Urban Periphery
Suburban, Young and Low-income
low-income, urban, young, unmarried
Low education, mainly suburban
Young, working class and rural
Low-Income with gentrification
Low Income and Diverse
High school education Long Commuters, Black, White Hispanic mix
Rural, Bachelors or college degree, Rent owned mix
Rural,High School Education, Owns property
Young, City based renters in Sparse neighborhoods, Low poverty
Low income, minority mix
Predominantly black, high high school attainment, home owners
White and minority mix multilingual, mixed income / education. Married
Hispanic Black mix multilingual, high poverty, renters, uses public transport
Predominantly black renters, rent own mix
Middle income, single family homes
Lower Middle Income with higher rent burden
Black and mixed community with rent burden
Lower Middle Income with affordable housing
Relatively affordable, satisfied lower middle class
Satisfied Lower Middle Income Higher Rent Costs
Suburban/Rural Satisfied, decently educated lower middle class
Struggling lower middle class with rent burden
Older white home owners, less comfortable financially
Older home owners, more financially comfortable, some diversity
Native American
Younger, poorer,single parent family Native Americans
Older, middle income Native Americans once married and Educated
Old Wealthy, White
Older, mixed race professionals
Works from home, Highly Educated, Super Wealthy
Retired Grandparents
Wealthy and Rural Living
Wealthy, Retired Mountains/Coasts
Wealthy Diverse Suburbanites On the Coasts
Retirement Communitties
Low Income African American
Urban - Inner city
Rural families
Residential institutions, young people
College towns
College town with poverty
University campus wider area
City Outskirt University Campuses
City Center University Campuses
Wealthy Nuclear Families
Lower educational attainment, Homeowner, Low rent
Younger, Long Commuter in dense neighborhood
Long commuters White black mix
Low rent in built up neighborhoods
Renters within cities, mixed income areas, White/Hispanic mix, Unmarried
Older Home owners with high income
Older home owners and very high income
White Asian Mix Big City Burbs Dwellers
Bachelors degree Mid income With Mortgages
Asian Hispanic Mix, Mid income
Bachelors degree Higher income Home Owners
Wealthy, urban, and kid-free
Wealthy city commuters
New Developments
Very wealthy, multiple million dollar homes
High rise, dense urbanites
- - -### Examples - -```bash -https://{username}.carto.com/api/v2/sql?q=SELECT * FROM -OBS_GetSegmentSnapshot({{point geometry}}) -``` - -##### Get the Geographic Snapshot of a Segmentation - -__Get the Segmentation Snapshot around the MGM Grand__ - - -```bash -https://{username}.carto.com/api/v2/sql?q=SELECT * FROM -OBS_GetSegmentSnapshot(CDB_LatLng(36.10222, -115.169516)) -``` - -__Get the Segmentation Snapshot at CARTO's NYC HQ__ - - -```bash -https://{username}.carto.com/api/v2/sql?q=SELECT * FROM -OBS_GetSegmentSnapshot(CDB_LatLng(40.704512, -73.936669)) -``` From de1ab5218a5c4e73b4a6e1079fc9524b01c9cd8d Mon Sep 17 00:00:00 2001 From: csubira Date: Fri, 1 Mar 2019 12:08:41 +0100 Subject: [PATCH 44/45] Remove empty file --- docs/developer-center/examples/01-example.md | 1 - 1 file changed, 1 deletion(-) delete mode 100644 docs/developer-center/examples/01-example.md diff --git a/docs/developer-center/examples/01-example.md b/docs/developer-center/examples/01-example.md deleted file mode 100644 index 5bc9ae3..0000000 --- a/docs/developer-center/examples/01-example.md +++ /dev/null @@ -1 +0,0 @@ -## Example 1 \ No newline at end of file From 2a05b86e55b2bdcca41992498c10c6d970e07402 Mon Sep 17 00:00:00 2001 From: csubira Date: Wed, 6 Mar 2019 18:15:42 +0100 Subject: [PATCH 45/45] Add CR changes and update older links in dev center docs --- docs/developer-center/guides/01-overview.md | 4 ++-- docs/developer-center/reference/05-geocoding-functions.md | 2 +- docs/developer-center/reference/06-isoline-functions.md | 2 +- .../reference/07-demographic-functions.md | 2 +- .../reference/09-segmentation-functions.md | 2 +- docs/developer-center/support/03-quota-information.md | 8 ++++---- 6 files changed, 10 insertions(+), 10 deletions(-) diff --git a/docs/developer-center/guides/01-overview.md b/docs/developer-center/guides/01-overview.md index e3c2f99..fbb1901 100644 --- a/docs/developer-center/guides/01-overview.md +++ b/docs/developer-center/guides/01-overview.md @@ -14,13 +14,13 @@ The Data Services API also exposes its services directly through CARTO Builder. The geometries provided by this API are projected in the projection [WGS 84 SRID 4326](http://spatialreference.org/ref/epsg/wgs-84/). -**Note:** The Data Services API [geocoding functions]({{site.dataservicesapi_docs}}/reference/#geocoding-functions) return different types of geometries (points or polygons) as result of different geocoding processes. The CARTO Engine does not support multi-geometry layers or datasets, therefore you must confirm that you are using consistent geometry types inside a table, to avoid future conflicts in your map visualization. +**Note:** The Data Services API [geocoding functions]({{site.dataservicesapi_docs}}/reference/#geocoding-functions) return different types of geometries (points or polygons) as result of different geocoding processes. The CARTO Engine does not support multi-geometry layers or datasets, therefore you must verify that you are using consistent geometry types inside a table, to avoid future conflicts in your map visualization. #### Best Practices _Be mindful of the following usage notes when using the Data Services functions with the SQL API:_ -It is discouraged to use the SELECT operation with the Data Services API functions in your map layers, as these type of queries consume quota when rendering tiles for your live map views. It may also result in sync performance issues, due to executing multiple requests to the API each time your map is viewed. See details about [Quota Consumption]({{site.dataservicesapi_docs}}/support/quota-information/). +It is discouraged to use the SELECT operation with the Data Services API functions in your map layers, as these type of queries consume quota when rendering tiles for your live map views. It may also result in sync performance issues, due to executing multiple requests to the API each time your map is viewed. See details about [Quota Consumption]({{site.dataservicesapi_docs}}/support/quota-information/#quota-consumption). The Data Services API is **recommended** to be used with INSERT or UPDATE operations, for applying location data to your tables. While SELECT (retrieve) is standard for SQL API requests, be mindful of quota consumption and use INSERT (to insert a new record) or UPDATE (to update an existing record), for best practices. diff --git a/docs/developer-center/reference/05-geocoding-functions.md b/docs/developer-center/reference/05-geocoding-functions.md index 6f73568..4143f7f 100644 --- a/docs/developer-center/reference/05-geocoding-functions.md +++ b/docs/developer-center/reference/05-geocoding-functions.md @@ -311,7 +311,7 @@ INSERT INTO {tablename} (the_geom) SELECT cdb_geocode_ipaddress_point('102.23.34 ### Street-Level Geocoder -This function geocodes your data into a point geometry for a street address. CARTO platform uses [Mapbox geocoding services](https://www.mapbox.com/) as the service provider for street-level geocoding. [Contact us](mailto:sales@carto.com) if you have any specific questions or requirements about the location data service provider being used with your account. +This function geocodes your data into a point geometry for a street address. CARTO platform uses [Mapbox geocoding services](https://www.mapbox.com/) by default as the service provider for street-level geocoding. [Contact us](mailto:sales@carto.com) if you have any specific questions or requirements about the location data service provider being used with your account. **This service is subject to quota limitations, and extra fees may apply**. View the [Quota information]({{site.dataservicesapi_docs}}/support/quota-information/) for details and recommendations about quota consumption. diff --git a/docs/developer-center/reference/06-isoline-functions.md b/docs/developer-center/reference/06-isoline-functions.md index 1e95eb5..d8024f8 100644 --- a/docs/developer-center/reference/06-isoline-functions.md +++ b/docs/developer-center/reference/06-isoline-functions.md @@ -2,7 +2,7 @@ [Isolines](https://carto.com/data/isolines/) are contoured lines that display equally calculated levels over a given surface area. This enables you to view polygon dimensions by forward or reverse measurements. Isoline functions are calculated as the intersection of areas from the origin point, measured by distance (isodistance) or time (isochrone). For example, the distance of a road from a sidewalk. Isoline services through CARTO are available by requesting a single function in the Data Services API. -_**This service is subject to quota limitations and extra fees may apply**. View the [Quota Information](https://carto.com/docs/carto-engine/dataservices-api/quota-information/) section for details and recommendations about to quota consumption._ +_**This service is subject to quota limitations and extra fees may apply**. View the [Quota Information]({{site.dataservicesapi_docs}}/support/quota-information/) section for details and recommendations about to quota consumption._ You can use the isoline functions to retrieve, for example, isochrone lines from a certain location, specifying the mode and the ranges that will define each of the isolines. The following query calculates isolines for areas that are 5, 10 and 15 minutes (300, 600 and 900 seconds, respectively) away from the location by following a path defined by car routing and inserts them into a table. diff --git a/docs/developer-center/reference/07-demographic-functions.md b/docs/developer-center/reference/07-demographic-functions.md index 204962e..b3564e6 100644 --- a/docs/developer-center/reference/07-demographic-functions.md +++ b/docs/developer-center/reference/07-demographic-functions.md @@ -1,6 +1,6 @@ ### Demographic Functions -The Demographic Snapshot enables you to collect demographic reports around a point location. For example, you can take the coordinates of a coffee shop and find the average population characteristics, such as total population, educational attainment, housing and income information around that location. You can use raw street addresses by combining the Demographic Snapshot with CARTO's geocoding features. If you need help creating coordinates from addresses, see the [Geocoding Functions](https://carto.com/docs/carto-engine/dataservices-api/geocoding-functions/) documentation. +The Demographic Snapshot enables you to collect demographic reports around a point location. For example, you can take the coordinates of a coffee shop and find the average population characteristics, such as total population, educational attainment, housing and income information around that location. You can use raw street addresses by combining the Demographic Snapshot with CARTO's geocoding features. If you need help creating coordinates from addresses, see the [Geocoding Functions]({{site.dataservicesapi_docs}}/reference/#geocoding-functions) documentation. _**Note:** The Demographic Snapshot functions are only available for the United States._ diff --git a/docs/developer-center/reference/09-segmentation-functions.md b/docs/developer-center/reference/09-segmentation-functions.md index bbfe913..1d69cd2 100644 --- a/docs/developer-center/reference/09-segmentation-functions.md +++ b/docs/developer-center/reference/09-segmentation-functions.md @@ -1,6 +1,6 @@ ## Segmentation Functions -The Segmentation Snapshot functions enable you to determine the pre-calculated population segment for a location. Segmentation is a method that divides a populations into subclassifications based on common traits. For example, you can take the a store location and determine what classification of population exists around that location. If you need help creating coordinates from addresses, see the [Geocoding Functions](https://carto.com/docs/carto-engine/dataservices-api/geocoding-functions/) documentation. +The Segmentation Snapshot functions enable you to determine the pre-calculated population segment for a location. Segmentation is a method that divides a populations into subclassifications based on common traits. For example, you can take the a store location and determine what classification of population exists around that location. If you need help creating coordinates from addresses, see the [Geocoding Functions]({{site.dataservicesapi_docs}}/reference/#geocoding-functions) documentation. _**Note:** The Segmentation Snapshot functions are only available for the United States. Our first release (May 18, 2016) is derived from Census 2010 variables. Our next release will be based on Census 2014 data. For the latest information, see the [Open Segments](https://github.com/CartoDB/open-segments) project repository._ diff --git a/docs/developer-center/support/03-quota-information.md b/docs/developer-center/support/03-quota-information.md index b12288c..1a50dc9 100644 --- a/docs/developer-center/support/03-quota-information.md +++ b/docs/developer-center/support/03-quota-information.md @@ -36,10 +36,10 @@ Name | Type | Description Service Types: -* `'isolines'` [Isoline/Isochrones (isochrone/isodistance lines) service](https://carto.com/docs/carto-engine/dataservices-api/isoline_functions/) -* `'hires_geocoder'` [Street level geocoding](https://carto.com/docs/carto-engine/dataservices-api/geocoding-functions#street-level-geocoder) -* `'routing'` [Routing functions](https://carto.com/docs/carto-engine/dataservices-api/routing_functions/) -* `'observatory'` Data Observatory services ([demographic](https://carto.com/docs/carto-engine/dataservices-api/demographic_functions/) and [segmentation](https://carto.com/docs/carto-engine/dataservices-api/segmentation_functions/) functions) +* `'isolines'` [Isoline/Isochrones (isochrone/isodistance lines) service]({{site.dataservicesapi_docs}}/reference/#isoline_functions/) +* `'hires_geocoder'` [Street level geocoding]({{site.dataservicesapi_docs}}/reference/#street-level-geocoder) +* `'routing'` [Routing functions]({{site.dataservicesapi_docs}}/reference/#routing_functions/) +* `'observatory'` Data Observatory services ([demographic]({{site.dataservicesapi_docs}}/reference/#demographic_functions/) and [segmentation]({{site.dataservicesapi_docs}}/reference/#segmentation_functions/) functions) **Notes**