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'))