You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@superset.apache.org by ma...@apache.org on 2018/08/22 05:58:49 UTC
[incubator-superset] branch master updated: [bugfix] geohash
lat/long is reversed (#5695)
This is an automated email from the ASF dual-hosted git repository.
maximebeauchemin pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-superset.git
The following commit(s) were added to refs/heads/master by this push:
new b42f8a2 [bugfix] geohash lat/long is reversed (#5695)
b42f8a2 is described below
commit b42f8a23b1173689b64b27ded8049aaa4b7d5046
Author: Maxime Beauchemin <ma...@gmail.com>
AuthorDate: Tue Aug 21 22:58:47 2018 -0700
[bugfix] geohash lat/long is reversed (#5695)
* [bugfix] geohash lat/long is reversed
This allows support for reversing geohashes. Note that the default option
was the wrong way.
* addressing comments
* make reverse_geohash_decode a staticmethod
---
.../explore/components/controls/SpatialControl.jsx | 17 +++++++++++---
superset/viz.py | 27 ++++++++++++++--------
2 files changed, 32 insertions(+), 12 deletions(-)
diff --git a/superset/assets/src/explore/components/controls/SpatialControl.jsx b/superset/assets/src/explore/components/controls/SpatialControl.jsx
index d9db801..97e6b0c 100644
--- a/superset/assets/src/explore/components/controls/SpatialControl.jsx
+++ b/superset/assets/src/explore/components/controls/SpatialControl.jsx
@@ -51,6 +51,7 @@ export default class SpatialControl extends React.Component {
};
this.toggleCheckbox = this.toggleCheckbox.bind(this);
this.onChange = this.onChange.bind(this);
+ this.renderReverseCheckbox = this.renderReverseCheckbox.bind(this);
}
componentDidMount() {
this.onChange();
@@ -75,6 +76,7 @@ export default class SpatialControl extends React.Component {
}
} else if (type === spatialTypes.geohash) {
value.geohashCol = this.state.geohashCol;
+ value.reverseCheckbox = this.state.reverseCheckbox;
if (!value.geohashCol) {
errors.push(errMsg);
}
@@ -120,6 +122,13 @@ export default class SpatialControl extends React.Component {
/>
);
}
+ renderReverseCheckbox() {
+ return (
+ <span>
+ {t('Reverse lat/long ')}
+ <Checkbox checked={this.state.reverseCheckbox} onChange={this.toggleCheckbox} />
+ </span>);
+ }
renderPopover() {
return (
<Popover id="filter-popover">
@@ -150,12 +159,11 @@ export default class SpatialControl extends React.Component {
>
<Row>
<Col md={6}>
- Column
+ {t('Column')}
{this.renderSelect('lonlatCol', spatialTypes.delimited)}
</Col>
<Col md={6}>
- {t('Reverse lat/long ')}
- <Checkbox checked={this.state.reverseCheckbox} onChange={this.toggleCheckbox} />
+ {this.renderReverseCheckbox()}
</Col>
</Row>
</PopoverSection>
@@ -169,6 +177,9 @@ export default class SpatialControl extends React.Component {
Column
{this.renderSelect('geohashCol', spatialTypes.geohash)}
</Col>
+ <Col md={6}>
+ {this.renderReverseCheckbox()}
+ </Col>
</Row>
</PopoverSection>
<div className="clearfix">
diff --git a/superset/viz.py b/superset/viz.py
index 1462748..5f4cea8 100644
--- a/superset/viz.py
+++ b/superset/viz.py
@@ -2101,10 +2101,24 @@ class BaseDeckGLViz(BaseViz):
_('Invalid spatial point encountered: %s' % s))
return (p.latitude, p.longitude)
+ @staticmethod
+ def reverse_geohash_decode(geohash_code):
+ lat, lng = geohash.decode(geohash_code)
+ return (lng, lat)
+
+ @staticmethod
+ def reverse_latlong(df, key):
+ df[key] = [
+ tuple(reversed(o))
+ for o in df[key]
+ if isinstance(o, (list, tuple))
+ ]
+
def process_spatial_data_obj(self, key, df):
spatial = self.form_data.get(key)
if spatial is None:
raise ValueError(_('Bad spatial key'))
+
if spatial.get('type') == 'latlong':
df[key] = list(zip(
pd.to_numeric(df[spatial.get('lonCol')], errors='coerce'),
@@ -2113,19 +2127,14 @@ class BaseDeckGLViz(BaseViz):
elif spatial.get('type') == 'delimited':
lon_lat_col = spatial.get('lonlatCol')
df[key] = df[lon_lat_col].apply(self.parse_coordinates)
-
- if spatial.get('reverseCheckbox'):
- df[key] = [
- tuple(reversed(o)) if isinstance(o, (list, tuple)) else (0, 0)
- for o in df[key]
- ]
del df[lon_lat_col]
elif spatial.get('type') == 'geohash':
- latlong = df[spatial.get('geohashCol')].map(geohash.decode)
- df[key] = list(zip(latlong.apply(lambda x: x[0]),
- latlong.apply(lambda x: x[1])))
+ df[key] = df[spatial.get('geohashCol')].map(self.reverse_geohash_decode)
del df[spatial.get('geohashCol')]
+ if spatial.get('reverseCheckbox'):
+ self.reverse_latlong(df, key)
+
if df.get(key) is None:
raise NullValueException(_('Encountered invalid NULL spatial entry, \
please consider filtering those out'))