code: func (m GridMapper) ID(xyi ...interface{}) (rowIDs []int64, err error) {
  	x := xyi[0].(float64)
  	y := xyi[1].(float64)
  	externalID := m.Xres * m.Yres
  
  	// bounds check
  	if x < m.Xmin || x > m.Xmax || y < m.Ymin || y > m.Ymax {
  		if m.allowExternal {
  			return []int64{externalID}, nil
  		}
  		return []int64{0}, fmt.Errorf("point (%v, %v) out of range", x, y)
  	}
  
  	// compute x bin
  	xInt := int64(float64(m.Xres) * (x - m.Xmin) / (m.Xmax - m.Xmin))
  	// compute y bin
  	yInt := int64(float64(m.Yres) * (y - m.Ymin) / (m.Ymax - m.Ymin))
  
  	rowID := (m.Yres * xInt) + yInt
  	return []int64{rowID}, nil
  
  }
docs: // ID maps pairs of floats to regular buckets