[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
This commit is contained in:
Maxime Beauchemin 2018-08-21 22:58:47 -07:00 committed by GitHub
parent 2a8cd43881
commit b42f8a23b1
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 32 additions and 12 deletions

View File

@ -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">

View File

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