@@ -150,12 +159,11 @@ export default class SpatialControl extends React.Component {
>
- Column
+ {t('Column')}
{this.renderSelect('lonlatCol', spatialTypes.delimited)}
- {t('Reverse lat/long ')}
-
+ {this.renderReverseCheckbox()}
@@ -169,6 +177,9 @@ export default class SpatialControl extends React.Component {
Column
{this.renderSelect('geohashCol', spatialTypes.geohash)}
+
+ {this.renderReverseCheckbox()}
+
diff --git a/superset/viz.py b/superset/viz.py
index 14627488ff..5f4cea8498 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'))