leaflet-dvf icon indicating copy to clipboard operation
leaflet-dvf copied to clipboard

when the center of a geohash's bounding box is 0,0 dataLaer fails -- 0,0 is a valid lat/lng

Open tlhampton13 opened this issue 7 years ago • 5 comments

In leaflet.dvf.datalayer.js GEOHASH function.

The following condition fails if the center of the bounding box evaluates to 0,0 witch is a valid lat/lng location. Specifically, this is the location that the Equator and the Prime Meridian intersect.

if (locationInfo.latitude[2] && locationInfo.longitude[2]) {
    bounds = new L.LatLngBounds(new L.LatLng(locationInfo.latitude[0], locationInfo.longitude[0]), new L.LatLng(locationInfo.latitude[1], locationInfo.longitude[1]));
}

a little farther down, since the bounds is undefined this line fails

center: bounds.getCenter()

This will cause an entire dataLayer to fail if a single center point is 0,0.

tlhampton13 avatar Aug 02 '17 20:08 tlhampton13

Actually, this will fail anytime the center of a geohash falls on the Equator or the Prime Meridian.

tlhampton13 avatar Aug 02 '17 20:08 tlhampton13

@tlhampton13 good catch. Should be fixed soon.

sfairgrieve avatar Aug 03 '17 12:08 sfairgrieve

Giving this some more thought, I don't believe this scenario will ever happen, or is it actually happening for you? The geohash of 0, 0 is s0, s00, s000, s0000, and so on. If you calculate the center of any of those geohashes, it's never 0, 0. In order for it to actually be 0, 0, you'd have to have a super long geohash string. In general, that code could probably use some refactoring/cleanup, but I don't believe it will fail with geohashes of realistic length. @tlhampton13 What do you think?

sfairgrieve avatar Aug 08 '17 00:08 sfairgrieve

@sfairgrieve

You are correct. No geohashes actually span the Equator or Prime Meridian. These lines would fall along a bounding edge of the adjacent geohashes.

I am getting a failure in the GEOHASH function though because the bounds is undefined. But the reason is not as I originally described.

In some of my records the geohash fields is empty string.

{
  "geohashField": ""
}

When this happens the GeoHash.decodeGeoHash() method actually returns location information for the empty string. Notice that the third element in the arrays (center point) is missing.

{
  "latitude": [-90.0, 90.0],
  "longitude": [-180.0, 180.0] 
}

then the if condition fails because the center point is not present.

if (locationInfo.latitude[2] && locationInfo.longitude[2])

I can change the data so that the geohashField is not present if it is "", but then records without a field fail. So I add a filter to the dataLayer, but that fails because the _loadRecords method lookups the geocode before checking includeLayer value.

tlhampton13 avatar Aug 09 '17 18:08 tlhampton13

@tlhampton13 apologies for the delayed response. Did you make any progress with this? For now, my suggestion would be to either remove records that have a blank geohashField before passing the data to the DataLayer (e.g. using lodash or your own JavaScript) or implementing your own LocationMode function (you can use the GEOHASH one as a starting point). I agree that the existing code in Leaflet DVF needs to be updated to be more resilient to cases like this or provide more ways of preventing it.

sfairgrieve avatar Aug 31 '17 11:08 sfairgrieve