Skip to content
Snippets Groups Projects
Unverified Commit d10da8a9 authored by Tom Robinson's avatar Tom Robinson
Browse files

point-type-support

parent fc4934b2
No related branches found
No related tags found
No related merge requests found
......@@ -122,6 +122,8 @@ export const isCoordinate = (field) => isa(field && field.special_type, TYPE.C
export const isLatitude = (field) => isa(field && field.special_type, TYPE.Latitude);
export const isLongitude = (field) => isa(field && field.special_type, TYPE.Longitude);
export const isPoint = (field) => isa(field && field.base_type, TYPE.Point);
// operator argument constructors:
function freeformArgument(field, table) {
......@@ -505,6 +507,10 @@ export function hasLatitudeAndLongitudeColumns(columnDefs) {
return hasLatitude && hasLongitude;
}
export function hasPointColumn(columnDefs) {
return _.any(columnDefs, isPoint);
}
export function foreignKeyCountsByOriginTable(fks) {
if (fks === null || !Array.isArray(fks)) {
return null;
......
......@@ -31,6 +31,15 @@ const MAP_COMPONENTS_BY_TYPE = {
"tiles": LeafletTilePinMap,
}
const pointToLatLon = (value) =>
Array.isArray(value) ?
value :
typeof value === "string" ?
// postgres `point`s are (x,y), we want [lat,lon]
value.replace(/^\(|\)$/g, "").split(",").map(str => parseFloat(str)).reverse()
:
[]
export default class PinMap extends Component {
props: Props;
state: State;
......@@ -92,12 +101,26 @@ export default class PinMap extends Component {
_getPoints(props: Props) {
const { settings, series: [{ data: { cols, rows }}] } = props;
const pointIndex = _.findIndex(cols, (col) => col.name === settings["map.point_column"]);
const latitudeIndex = _.findIndex(cols, (col) => col.name === settings["map.latitude_column"]);
const longitudeIndex = _.findIndex(cols, (col) => col.name === settings["map.longitude_column"]);
const points = rows.map(row => [
row[latitudeIndex],
row[longitudeIndex]
]);
let points;
if (pointIndex >= 0) {
points = rows.map(row =>
pointToLatLon(row[pointIndex])
);
} else if (latitudeIndex >= 0 && longitudeIndex >= 0) {
points = rows.map(row => [
row[latitudeIndex],
row[longitudeIndex]
]);
} else {
console.warn("Missing lat/lon fields");
points = [];
}
const bounds = L.latLngBounds(points);
return { points, bounds };
}
......
......@@ -6,7 +6,7 @@ import ChoroplethMap from "../components/ChoroplethMap.jsx";
import PinMap from "../components/PinMap.jsx";
import { ChartSettingsError } from "metabase/visualizations/lib/errors";
import { isNumeric, isLatitude, isLongitude, hasLatitudeAndLongitudeColumns } from "metabase/lib/schema_metadata";
import { isNumeric, isLatitude, isLongitude, hasLatitudeAndLongitudeColumns, isPoint, hasPointColumn } from "metabase/lib/schema_metadata";
import { metricSetting, dimensionSetting, fieldSetting } from "metabase/visualizations/lib/settings";
import MetabaseSettings from "metabase/lib/settings";
......@@ -47,7 +47,7 @@ export default class Map extends Component {
case "pin_map":
return "pin";
default:
if (hasLatitudeAndLongitudeColumns(cols)) {
if (hasLatitudeAndLongitudeColumns(cols) || hasPointColumn(cols)) {
return "pin";
} else {
return "region";
......@@ -55,17 +55,23 @@ export default class Map extends Component {
}
}
},
"map.point_column": {
title: "Latitude and Longitude",
...fieldSetting("map.point_column", isNumeric,
([{ data: { cols }}]) => (_.find(cols, isPoint) || {}).name),
getHidden: (series, vizSettings) => vizSettings["map.type"] !== "pin" || hasPointColumn(series[0].data.cols)
},
"map.latitude_column": {
title: "Latitude field",
...fieldSetting("map.latitude_column", isNumeric,
([{ data: { cols }}]) => (_.find(cols, isLatitude) || {}).name),
getHidden: (series, vizSettings) => vizSettings["map.type"] !== "pin"
getHidden: (series, vizSettings) => vizSettings["map.type"] !== "pin" || !hasLatitudeAndLongitudeColumns(series[0].data.cols)
},
"map.longitude_column": {
title: "Longitude field",
...fieldSetting("map.longitude_column", isNumeric,
([{ data: { cols }}]) => (_.find(cols, isLongitude) || {}).name),
getHidden: (series, vizSettings) => vizSettings["map.type"] !== "pin"
getHidden: (series, vizSettings) => vizSettings["map.type"] !== "pin" || !hasLatitudeAndLongitudeColumns(series[0].data.cols)
},
"map.region": {
title: "Region map",
......@@ -116,7 +122,7 @@ export default class Map extends Component {
static checkRenderable([{ data: { cols, rows} }], settings) {
if (settings["map.type"] === "pin") {
if (!settings["map.longitude_column"] || !settings["map.latitude_column"]) {
if (!settings["map.point_column"] && (!settings["map.longitude_column"] || !settings["map.latitude_column"])) {
throw new ChartSettingsError("Please select longitude and latitude columns in the chart settings.", "Data");
}
} else if (settings["map.type"] === "region"){
......
......@@ -46,7 +46,7 @@
:numeric :type/Decimal
:path :type/*
:pg_lsn :type/Integer ; PG Log Sequence #
:point :type/*
:point :type/Point
:real :type/Float
:serial :type/Integer
:serial2 :type/Integer
......
......@@ -21,6 +21,8 @@
(derive :type/Latitude :type/Coordinate)
(derive :type/Longitude :type/Coordinate)
(derive :type/Point :type/*)
;;; Text Types
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment