Skip to content

Commit

Permalink
[bugfix] geohash lat/long is reversed (apache#5695)
Browse files Browse the repository at this point in the history
* [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
  • Loading branch information
mistercrunch authored Aug 22, 2018
1 parent da89c16 commit e13914d
Show file tree
Hide file tree
Showing 2 changed files with 32 additions and 12 deletions.
17 changes: 14 additions & 3 deletions superset/assets/src/explore/components/controls/SpatialControl.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -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();
Expand All @@ -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);
}
Expand Down Expand Up @@ -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">
Expand Down Expand Up @@ -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>
Expand All @@ -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">
Expand Down
27 changes: 18 additions & 9 deletions superset/viz.py
Original file line number Diff line number Diff line change
Expand Up @@ -2101,10 +2101,24 @@ def parse_coordinates(s):
_('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'),
Expand All @@ -2113,19 +2127,14 @@ def process_spatial_data_obj(self, key, df):
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'))
Expand Down

0 comments on commit e13914d

Please sign in to comment.